【问题标题】:How do I center a GridView in its LinearLayout parent?如何在其 LinearLayout 父级中居中 GridView?
【发布时间】:2009-10-09 15:12:24
【问题描述】:

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>

我做错了什么?

【问题讨论】:

  • 你需要 GridView 居中或它的项目???
  • 我希望 GridView 位于其父级的中心。不是项目。

标签: android layout gridview android-linearlayout


【解决方案1】:

我不知道你是否解决了你的问题(我希望是的,而且我在这篇文章上的回答也很晚!),但这里有一个线索:

<?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 个内容时才有效。 也许有人可以改进它!

【讨论】:

    【解决方案2】:
    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,你的身材可能会更好。

    【讨论】:

      【解决方案3】:

      使用以下属性设置 LinearLayout 的值

      android:gravity="center".

      并从 gridview 中删除以下行

      android:layout_centerInParent="true"
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          你的 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_horizo​​ntal" 放在父布局中,因此它将 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 挺好的,不过对你的问题没关系..
          【解决方案6】:

          不要在 LinearLayout 中设置 GridView,而是在 RelativeLayout 和 在 GridView 中设置 layout_centerHorizo​​ntal=truelayout_centerVertical=true

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

            • 先生,Common 类是什么?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-26
            • 2013-06-04
            • 2020-07-17
            • 2017-09-20
            • 1970-01-01
            相关资源
            最近更新 更多