【问题标题】:Android: center gridview horizontallyAndroid:水平居中gridview
【发布时间】:2011-05-26 16:27:50
【问题描述】:

我需要在我的 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 上设置的图像片段:

imageView = new ImageView(context);
imageView.setLayoutParams(new GridView.LayoutParams(48,48)); //on medium density
imageView.setScaleType(ImageView.ScaleType.CENTER);
imageView.setPadding(0, 0, 0, 0);

我怎样才能成功?

【问题讨论】:

    标签: android gridview android-layout


    【解决方案1】:

    我通过计算和设置填充手动使网格视图居中。这是我的onCreate 所做的:

    • 找出屏幕宽度和屏幕密度
    • 将项目宽度和间距的常数值从 DIP 转换为像素
    • 计算我可以容纳的列数。

    方程看起来像这样,numColumns 是唯一的未知数:

    numColumns * itemWidth + (numColumns - 1) * spacingBetweenItems + selectorPadding &lt;= sreenWidth

    • 拥有numColumns,计算我的网格视图实际需要多少水平空间
    • 具有网格视图的实际宽度,设置填充使其最终位于屏幕中心

    好的,下面是一些代码:

    // 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);
    

    【讨论】:

    【解决方案2】:

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

    android:stretchMode="columnWidth"

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

    根据您的网格项目是什么,您可能不想在内容周围添加透明容器。如果不这样做,内容宽度会均匀拉伸,实际上在更多设备上看起来会更好。

    【讨论】:

    • 透明容器的提示帮助我使我的自动调整列在 gridview 宽度上拉伸但不拉伸内容,因此这些列现在完全适合屏幕并且不再左对齐.感谢这个詹姆斯沃尔德。
    【解决方案3】:

    您是否检查过您的 GridView 在 LinearLayout 中的位置是否正确? 尝试将android:layout_gravity="center" 用于 GridView。 此外,尝试使用android:gravity= 和不同的位置,以更清楚地了解重力如何影响布局。

    【讨论】:

    • gravity="center" in parent 使 gridview 垂直居中而不是水平居中。 gridview 中的gravity="center" 和gravity_layout="center" 什么都不做。在其他组件(不是 gridview)中,重力正常工作:)
    • 我告诉你我是怎么做的 - 我只是添加了一些边距(与屏幕中心相同的大小)
    【解决方案4】:

    可能我真的迟到了,但如果你来这个问题(就像我一样),这就是我为解决问题所做的:

    <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 在 Top 和 Button-Right。

    更多信息:RelativeLayout, Positioning Views

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 2012-09-04
      相关资源
      最近更新 更多