Как мне центрировать GridView в его родителе LinearLayout? - PullRequest
7 голосов
/ 09 октября 2009

GridView ведет себя не так, как должен. Этот снимок экрана показывает, что GridView (в ландшафтном режиме) сбрасывается влево Я хочу, чтобы это было в центре.

Это макет XML для GridView.

<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/templatelandscape"
  android:orientation="horizontal"
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content">
<GridView 
  android:id="@+id/commandsbarlandscape"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_weight="1.0"
  android:layout_alignParentTop="true"
  android:layout_centerInParent="true"
  android:padding="0dp"
  android:verticalSpacing="2dp"
  android:horizontalSpacing="2dp"
  android:numColumns="auto_fit"
  android:columnWidth="52dp"
  android:stretchMode="spacingWidth"
  android:gravity="fill_horizontal" />
</LinearLayout>

Что я делаю не так?

Ответы [ 7 ]

3 голосов
/ 26 января 2013

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >

    <GridView
        android:id="@+id/gridview2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:columnWidth="90dp"
        android:numColumns="auto_fit"
        android:stretchMode="spacingWidth" >

    </GridView>
</LinearLayout>

К сожалению, это работает, только если в сетке 1 контент. Может быть, кто-то может улучшить это!

1 голос
/ 22 февраля 2012

установить значение LinearLayout со следующим атрибутом

android:gravity="center".

и удалите следующую строку из gridview

android:layout_centerInParent="true"
1 голос
/ 09 октября 2009
  1. android:layout_height="wrap_content" не имеет значения для виджетов, которые имеют собственную прокрутку, например GridView.

  2. android:layout_alignParentTop="true" и android:layout_centerInParent="true" предназначены для RelativeLayout, а не LinearLayout.

Избавьтесь от android:layout_weight="1.0", измените android:layout_height на "fill_parent" или конкретный рост, измените LinearLayout на RelativeLayout, и вы можете быть в лучшей форме.

0 голосов
/ 12 ноября 2015

Лучшее решение, которое я нашел, это делать по коду.

Это мой xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dslv="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f1f1f1"
android:orientation="vertical">

<GridView
    android:id="@+id/radio_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:divider="@null"
    android:drawSelectorOnTop="true"
    android:paddingBottom="@dimen/gridview_column_space"
    android:paddingTop="@dimen/gridview_column_space"
    android:columnWidth="@dimen/gridview_column_width"
    android:numColumns="auto_fit"
    android:verticalSpacing="@dimen/gridview_column_space"
    android:horizontalSpacing="@dimen/gridview_column_space"
    android:stretchMode="none"
    android:scrollbars="none"
    />

<include layout="@layout/placeholder" />

И вот код, который делает магию на моем фрагменте:

    @Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mGridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
                Point point = Common.getScreenSize(getActivity());

                int rowSpace = getResources().getDimensionPixelSize(R.dimen.gridview_column_space);
                int rowWidth = getResources().getDimensionPixelSize(R.dimen.gridview_column_width) + rowSpace;

                int minWith = (point.x / rowWidth) * rowWidth;
                int padding = (point.x - minWith) / 2;
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(minWith + padding * 2, ViewGroup.LayoutParams.MATCH_PARENT);
                params.addRule(RelativeLayout.CENTER_IN_PARENT);


                mGridView.setPadding(padding + rowSpace / 2, 0, padding, 0);
                mGridView.setLayoutParams(params);

                mGridView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        } 

    }); } 
}
0 голосов
/ 18 февраля 2013

Вместо установки GridView в LinearLayout, установите его в RelativeLayout и установите layout_centerHor horizontal = true и layout_centerVertical = true в GridView.

0 голосов
/ 23 июня 2012

Ваш GridLayout должен быть таким ..

<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/templatelandscape"
  android:orientation="horizontal"
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal">
<GridView 
  android:id="@+id/commandsbarlandscape"
  android:background="@android:color/darker_gray"
  android:layout_gravity="center_horizontal"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_weight="1.0"
  android:verticalSpacing="2dp"
  android:horizontalSpacing="2dp"
  android:numColumns="auto_fit"
  android:columnWidth="52dp"
  android:stretchMode="none"
  android:gravity="fill_horizontal" />

Я просто помещаю android: layout_gravity = "center_horizontal" в родительский макет, чтобы он устанавливал gridlayout в своем родительском центре, а не его содержимое в центре, как вы хотите. Также добавлен android: layout_width = "0dp", поскольку он равен свойству "" warp_content ", если вы дадите" 0dp ", он покажет вам лучший результат. Я также удалил те относительные атрибуты макета, которые вы добавили, которые вы можете наблюдать, если вы не используете RelativeLayout, то бессмысленно использовать те свойства, которые ничего не делают.

В целях тестирования вы можете проверить, работает ли он правильно или нет, просто используя следующий код xml

<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/templatelandscape"
  android:orientation="horizontal"
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal">
<GridView 
  android:id="@+id/commandsbarlandscape"
  android:background="@android:color/darker_gray"
  android:layout_width="300dp"
  android:layout_height="wrap_content"
  android:layout_weight="1.0"
  android:verticalSpacing="2dp"
  android:horizontalSpacing="2dp"
  android:numColumns="auto_fit"
  android:columnWidth="52dp"
  android:stretchMode="none"
  android:gravity="fill_horizontal" />
</LinearLayout>

Приведенный выше xml показывает, что макет вашей сетки находится в центре родительского элемента, а не его содержимого.

Надеюсь, это объяснение работает для вас ...

0 голосов
/ 07 января 2012

Попробуйте переключиться на RelativeLayout и уберите горизонтальный отступ из вида сетки. Горизонтальное заполнение заставляло мою сетку смещаться от центра. Я добавил контейнер вида вокруг макета элемента сетки, чтобы создать отступы.

...