Android:水平居中gridview

Android:水平居中gridview,android,gridview,android-layout,Android,Gridview,Android Layout,我需要在我的android layout.xml中将网格视图水平居中。我在谷歌搜索了很长一段时间,但没有找到答案 我只能通过更改strechMode来更改gridview水平位置,但这样我的项目就彼此不近了。 我需要的是项目彼此靠近(没有空格)并水平居中。我选择strechmode=none,因此现在我的项目彼此靠近,但它们位于屏幕的左侧,我只希望它们水平居中 以下是我的布局xml: <LinearLayout xmlns:android="http://schemas.android.c

我需要在我的android layout.xml中将网格视图水平居中。我在谷歌搜索了很长一段时间,但没有找到答案

我只能通过更改strechMode来更改gridview水平位置,但这样我的项目就彼此不近了。 我需要的是项目彼此靠近(没有空格)并水平居中。我选择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>

我怎样才能成功

您是否已检查GridView在LinearLayout中的位置是否正确? 尝试在GridView中使用android:layout\u gravity=“center”。
另外,使用android:gravity=和不同的位置进行实验,以更清楚地了解gravity在布局中的作用

在GridView布局或样式中将拉伸模式设置为columnWidth:

android:stretchMode=“columnWidth”

列宽将拉伸以填充可用空间。您可以将网格项包装在透明容器中,该容器将均匀拉伸,同时保留可见内容的宽度。android:columnWidth属性将用作“最小列宽”。这也适用于android:numColumns=auto_-fit、android:horizontalSpacing和android:verticalSpacing


根据网格项目的不同,您可能不希望在内容周围添加透明容器。如果不这样做,则内容宽度将均匀拉伸,这在更多设备上可能看起来更好。

我通过计算和设置网格视图的填充,手动将其居中。以下是我的
onCreate
的功能:

  • 找出屏幕的宽度和屏幕密度
  • 将项目宽度和间距的常量值从倾斜转换为像素
  • 计算我可以容纳的列数
方程式如下所示,
numColumns
是唯一未知的:


numColumns*itemWidth+(numColumns-1)*项目之间的间隔+选择或添加可能我真的迟到了,但如果你遇到这个问题(就像我一样),我就是这样解决问题的:

<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位于顶部,按钮位于右侧


更多信息:

gravity=“center”在父视图中使gridview垂直居中,而不是水平居中。gridview中的gravity=“center”和gravity\u layout=“center”不起任何作用。在其他组件(不是gridview)中,gravity工作正常:)我告诉你我是如何做到的-我只是添加了一些边距(与sceen上的中心大小相同)。透明容器的提示帮助我在gridview宽度上拉伸了autofit列,但没有拉伸内容,因此,这些列现在完全适合屏幕,不再左对齐。感谢James Wald。如何实现此链接中显示的图像的动态布局:。你能给我一个指导/建议/例子吗?@YuDroid你做到了吗,上面的答案能解决这个问题吗?我也有同样的问题,请任何人给我一个答案solution@PēterisCaune你的答案是什么
// 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);
<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>