如何将GridView居中在其LinearLayout父容器中?

7

GridView没有按照预期的方式运行。 这个截图显示了GridView(在横屏模式下)向左对齐。 我希望它居中。

以下是GridView的XML布局。

<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>

我做错了什么?

你需要将GridView居中或者它的项目居中吗? - bhatt4982
1
我希望GridView在其父元素中居中,而不是其中的项。 - Jacques René Mesrine
7个回答

3
我不知道你是否解决了问题(我希望是的,而且我回答这篇文章已经很晚了!),但是这里有一个线索:
<?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

将LinearLayout的值设置为以下属性:

android:gravity="center"

并从gridview中删除以下行:

android:layout_centerInParent="true"

1
  1. 对于那些具有自身滚动功能的小部件,例如GridView,“android:layout_height="wrap_content"”没有意义。

  2. android:layout_alignParentTop="true"”和“android:layout_centerInParent="true"”是用于RelativeLayout而不是LinearLayout

去掉您的“android:layout_weight="1.0"”,将您的“android:layout_height”更改为“fill_parent”或特定高度,将LinearLayout更改为RelativeLayout,您可能会更好一些。


0

你的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代码显示了你的网格布局在父容器中居中,但它的内容不会居中。
希望这个解释对你有帮助...

你也可以使用RelativeLayout,它非常好用,但这对你的问题并不重要。 - MobileEvangelist

0

我找到的最佳解决方案是通过代码实现。

这是我的 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); 
        } 

    }); } 
}

1
先生,什么是公共类? - Jenya Kirmiza

0

不要将GridView设置在LinearLayout中,而是将其设置在RelativeLayout中,并在GridView中设置layout_centerHorizontal=truelayout_centerVertical=true


0

尝试切换到RelativeLayout并从网格视图中删除水平填充。 水平填充导致我的网格偏离中心。 我在网格项布局周围添加了一个视图容器来创建填充。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接