如何将GridView置于其LinearLayout父级中心?

时间:2009-10-09 15:12:25

标签: android layout gridview android-linearlayout

GridView的行为并不像它应该的那样。 此screenshot显示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>

我做错了什么?

7 个答案:

答案 0 :(得分: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 :(得分:1)

  1. android:layout_height="wrap_content"对于自己滚动的小工具没有意义,例如GridView

  2. android:layout_alignParentTop="true"android:layout_centerInParent="true"适用于RelativeLayout,而非LinearLayout

  3. 摆脱您的android:layout_weight="1.0",将android:layout_height更改为"fill_parent"或特定身高,将LinearLayout更改为RelativeLayout,您可能会更好的形状。

答案 2 :(得分:1)

使用以下属性

设置LinearLayout的值

android:gravity="center"

并从gridview中删除以下行

android:layout_centerInParent="true"

答案 3 :(得分:0)

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

答案 4 :(得分: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 =&#34; center_horizo​​ntal&#34;在父布局中,所以它在其父级中心设置了gridlayout,但不是它在中心的内容。 还添加了android:layout_width =&#34; 0dp&#34;因为它等于&#34;&#34; warp_content&#34;属性如果你给&#34; 0dp&#34;它会告诉你更好的结果。 我还删除了你可以观察到的相对布局属性,如果你没有使用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显示您的网格布局位于父级的中心,而不是它的内容。

希望这个解释对你有用......

答案 5 :(得分:0)

不是在LinearLayout中设置GridView,而是在 RelativeLayout 中设置它 在GridView中设置 layout_centerHorizo​​ntal = true layout_centerVertical = true

答案 6 :(得分: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); 
        } 

    }); } 
}