GridView: Как я могу избавиться от дополнительного пространства от моего объекта GirdView? - PullRequest
2 голосов
/ 02 июня 2010

Я пишу приложение для телефонов Android для игры Шахматы против Человека через Интернет. Я просматривал некоторые учебные пособия, чтобы научиться разрабатывать приложения для Android, и нашел очень хороший пример создания галерей (это был пример использования GridView для создания галереи о собаках), и пришла идея нарисовать шахматный стол с помощью GridView, потому что пример проекта также обрабатывал событие point & click, и я намеревался использовать то же событие тем же способом, но для другой цели. Игра работает хорошо (в настоящее время это версия для горячих сидений), однако я действительно разочарован тем фактом, что всякий раз, когда я поворачиваю экран телефона, мой GridView становится истеричным и оставляет свободное место в шахматной таблице между столбцами. Я понял, что причина этого в том, что ширина GridView такая же, как у его родителя, и GridView пытается заполнить его родителем, но должно быть (и, вероятно, есть) простое решение, чтобы избавиться от этой проблемы. Тем не менее, после целого дня исследований, я не нашел никакой подсказки, которая помогла бы мне сделать идеальный рисунок на моем шахматном столе без отрицательного побочного эффекта в функциональности. Шахматный стол выглядит хорошо, если телефон находится в портретном режиме, но в альбомном режиме это далеко не приятно. Вот как я могу решить, находимся ли мы в портретном или ландшафтном режиме:

((((MainActivity)mContext).getWindow().getWindowManager().getDefaultDisplay().getWidth()) < ((MainActivity)mContext).getWindow().getWindowManager().getDefaultDisplay().getHeight())

В файле main.xml GridView определяется следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              >
    <GridView xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/gridview"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:numColumns="8"
              android:verticalSpacing="0dp"
              android:horizontalSpacing="0dp"
              android:stretchMode="columnWidth"
              android:gravity="center"
              >
    </GridView>
...
</LinearLayout>

Я ценю любую помощь в решении проблемы и благодарю вас за чтение.

Портрет: http://www.freeimagehosting.net/image.php?f388b3ec64.png

Пейзаж: http://www.freeimagehosting.net/image.php?ee790603a2.png

Ответы [ 2 ]

4 голосов
/ 02 июня 2010

GridView, вероятно, не то, что вы хотите здесь. GridView, как и ListView, предназначен для эффективного представления неограниченных наборов данных. Шахматная доска не является ни тем, ни другим. Заполнение TableLayout программно, вероятно, то, что вы хотите вместо этого.

Причина, по которой ваш GridLayout, кажется, не соблюдает android:layout_width="wrap_content", заключается в том, что поскольку GridView предназначен для отображения неограниченных данных, где каждый элемент может иметь разный размер, он не верит, что элементы имеют одинаковую ширину, разумно измеряется. (Если в адаптере 10 000 элементов, должен ли GridView измерить их все, чтобы определить правильную ширину столбца?)

Если вы все равно попытаетесь использовать GridView для этого (чего не следует делать), попробуйте установить явное значение для android:layout_width, а не wrap_content. Это остановит расширение GridView для заполнения доступного пространства. Вы также можете использовать альтернативные макеты для разных ориентаций экрана, используя систему ресурсов, как описано здесь . В качестве альтернативы вы можете отключить ландшафтный режим, используя android:screenOrientation="portrait" в теге активности в манифесте. ;)

2 голосов
/ 03 июня 2010

Проблема просто решается с помощью метода setPadding вашего объекта GridView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...