Android: центр сетки по горизонтали - PullRequest
9 голосов
/ 26 мая 2011

Мне нужно расположить сетку по горизонтали в моем файле layout.xml для Android.Я долго искал в Google, но не смог найти ответ.

Я могу изменить горизонтальное положение вида сетки, только изменив strechMode, но тогда мои предметы не будут находиться рядом друг с другом.что мне нужно, это элементы должны быть один рядом с другим (без пробелов) и по центру по горизонтали.Я выбираю strechmode = none, поэтому теперь мои элементы расположены рядом друг с другом, но они находятся слева на экране, я просто хочу, чтобы они были отцентрированы по горизонтали.

Вот мой макет xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent" 
          android:layout_height="fill_parent"
          android:background="@drawable/background" 
          android:gravity="center">

<GridView android:id="@+id/lw_gridview" 
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:numColumns="3" 
          android:columnWidth="48dp"
          android:horizontalSpacing="0dp"
          android:verticalSpacing="0dp"
          android:stretchMode="none"
          />


</LinearLayout>

Вот фрагмент изображения, установленного на сетке с помощью адаптера изображения:

imageView = new ImageView(context);
imageView.setLayoutParams(new GridView.LayoutParams(48,48)); //on medium density
imageView.setScaleType(ImageView.ScaleType.CENTER);
imageView.setPadding(0, 0, 0, 0);

Как мне добиться успеха?

Ответы [ 4 ]

16 голосов
/ 29 мая 2012

Я центрировал свой вид сетки вручную, рассчитав и установив его отступ. Вот что делает мой onCreate:

  • узнать ширину экрана и плотность экрана
  • Преобразовать постоянные значения для ширины элемента и расстояния от DIP до пикселей
  • рассчитать количество столбцов, которые я могу уместить.

Уравнение выглядит так: numColumns является единственным неизвестным:

numColumns * itemWidth + (numColumns - 1) * spacingBetweenItems + selectorPadding <= sreenWidth

  • имея numColumns, подсчитайте, сколько горизонтального пространства фактически понадобится моему виду сетки
  • имея фактическую ширину вида сетки, установите отступ так, чтобы он оказался в центре экрана

ОК, а вот код:

// Convert DIPs to pixels
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
mSizePx = (int) Math.floor(SIZE_DIP * metrics.scaledDensity);
mSpacingPx = (int) Math.floor(SPACING_DIP * metrics.scaledDensity);

GridView gridview = (GridView) findViewById(R.id.gridview);
// Find out the extra space gridview uses for selector on its sides.
Rect p = new Rect();
gridview.getSelector().getPadding(p);
int selectorPadding = p.left + p.right;

// Determine the number of columns we can fit, given screen width,
// thumbnail width, and spacing between thumbnails.
int numColumns = (int) Math.floor(1f * (metrics.widthPixels - selectorPadding + mSpacingPx)
        / (mSizePx + mSpacingPx));

int contentWidth = numColumns * mSizePx; // Width of items
contentWidth += (numColumns - 1) * mSpacingPx; // Plus spaces between items
contentWidth += selectorPadding; // Plus extra space for selector on sides

// Now calculate amount of left and right margin so the grid gets
// centered. This is what we
// unfortunately cannot do with layout_width="wrap_content"
// and layout_gravity="center_horizontal"
int slack = metrics.widthPixels - contentWidth;

gridview.setNumColumns(numColumns);
gridview.setPadding(slack / 2, slack / 2, slack / 2, slack / 2);
11 голосов
/ 01 февраля 2012

Установите для режима растяжения значение columnWidth в макете или стиле GridView:

android: stretchMode = "columnWidth"

Ширина столбца растянется, чтобы заполнить доступное пространство.Вы можете обернуть элементы сетки в прозрачный контейнер, который будет равномерно растягиваться при сохранении ширины видимого содержимого.Атрибут android: columnWidth будет функционировать как «минимальная ширина столбца».Это также работает с android: numColumns = auto_fit, android: horizontalSpacing и android: verticalSpacing.

В зависимости от ваших элементов сетки, вы можете не захотеть добавлять прозрачный контейнер вокруг вашего контента.Если вы этого не сделаете, ширина контента будет равномерно растягиваться, что на многих устройствах может выглядеть лучше.

1 голос
/ 10 октября 2014

Возможно, я действительно опаздываю, но если вы пришли к этому вопросу (как я), это то, что я сделал, чтобы решить эту проблему:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/emotions_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"/>

    <GridView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"/>
</RelativeLayout>

Мой GridView центрируется по вертикали, два других TextView находятся сверху и кнопка-вправо.

Дополнительная информация: RelativeLayout, Просмотры позиционирования

0 голосов
/ 26 мая 2011

Вы проверили, что ваш GridView правильно позиционируется в LinearLayout? Попробуйте использовать android:layout_gravity="center" для GridView. Кроме того, поэкспериментируйте с android:gravity= и другим положением, чтобы получить более четкое представление о том, как гравитация работает для макетов.

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