【问题标题】:Filling the whole screen with Gridview items用 Gridview 项目填充整个屏幕
【发布时间】:2017-01-22 15:24:37
【问题描述】:

我有一个 GridView(有 2 列和 2 行)并且想要拉伸行以填满整个屏幕。它应该在所有设备上看起来都一样。

这意味着我不想在最后一行下方留出一些空白。于是我搜索了一下,找到了一个解决方案,可以通过以下代码动态设置 GridView 的最小高度:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int width = metrics.widthPixels;
int height = metrics.heightPixels;

此外,我在我的适配器中添加了这些代码行:

gridView = inflater.inflate(R.layout.act_main_menu_sub, null);
gridView.setMinimumHeight(ActMainMenu.height/2);

但现在看起来是这样的:

视图现在可以滚动并且项目具有相同的大小。但它不适合屏幕。

这是我的布局代码,包括 GridView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:id="@+id/layout_main_menu"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:background="#b2b2b2"
          android:orientation="vertical">

<!-- android:layout_height="wrap_content" -->
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:fitsSystemWindows="true"
    android:minHeight="?attr/actionBarSize"
    android:padding="2dp"
    app:titleMarginStart="20dp"
    app:titleTextAppearance="@style/MyMaterialTheme.Base.TitleTextStyle"
    app:titleTextColor="@color/textColorPrimary">

    <TextView
        android:id="@+id/toolbar_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="MASTERFITNESS TRAINERSCHULUNG"
        android:textColor="@android:color/white"
        android:textStyle="bold|italic"/>

</android.support.v7.widget.Toolbar>


<!--android:columnWidth="160dp"-->
<GridView
    android:id="@+id/grid_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp"
    android:gravity="center"
    android:horizontalSpacing="20dp"
    android:numColumns="2"
    android:stretchMode="columnWidth"
    android:verticalSpacing="20dp"></GridView>

</LinearLayout>

这里有什么问题?

【问题讨论】:

  • 也许在 gridView.setMinimumHeight(ActMainMenu.height/2) 里面你必须考虑到填充,你试过了吗?
  • 我应该如何处理填充?

标签: android android-layout gridview


【解决方案1】:

您的第二个屏幕截图在高度计算中的问题。 metrics.heightPixels 为您提供屏幕的完整高度,包括工具栏和您拥有的任何边距。这些应该首先减去,然后将屏幕分成两半。

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    // your layout has 10dp margin (top & bottom) + 20 dp between grid items, 10+10+20=40
    int marginSizeDp = 40;
    float scale = metrics.density;
    int marginSizePx = Math.round (marginSizeDp * scale);

    int appBarHeight = getAppBarHeight();

    int height = metrics.heightPixels;
    int minHt = Math.round((height - marginSizePx - appBarHeight)/2);
    gridView.setMinimumHeight(minHt);

感谢https://stackoverflow.com/a/7167086/7292819 AZ13,获取工具栏高度

    // returns height of app bar in pixels
    private int getAppBarHeight() {
        final TypedArray styledAttributes = getTheme().obtainStyledAttributes(
                new int[] { android.R.attr.actionBarSize });
        int appBarHeight = (int) styledAttributes.getDimension(0, 0);
        styledAttributes.recycle();

        return appBarHeight;
    }

说实话,如果这个布局是静态的(只有 4 个项目,没有滚动,每个项目的内容几乎没有变化),我可能不会打扰 GridView 和适配器。 RelativeLayout 或 GridLayout 可能会更好。

【讨论】:

  • 谢谢。我决定使用带有权重的 LinearLayout。这很好用。谢谢你的提示。
  • 昨晚我在完成这个答案后正在考虑这个问题。今天早上打算添加加权线性布局。您会收到有关嵌套权重的警告,但我认为这样的简单布局不会对性能产生太大影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 2013-02-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
相关资源
最近更新 更多