使用Gridview项目填充整个屏幕
我有一个GridView(有2列和2行)并且想要拉伸行以填充整个屏幕。它应该在所有设备上都一样。使用Gridview项目填充整个屏幕
这意味着我不希望最后一排下一些空的空间。所以,我搜索了一点,找到了解决设置在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>
有什么问题吗?
在高度计算中你的第二个屏幕截图的问题。 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);
工具栏高度感谢获取到AZ13在https://stackoverflow.com/a/7167086/7292819
// 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和权重。这工作得很好。感谢您的提示。 –
我在完成这个答案后昨天晚上在想这件事。今天早上要添加加权的LinearLayout。您会收到有关嵌套权重的警告,但我不认为性能会受此影响。 – Gary99
也许在gridView.setMinimumHeight(ActMainMenu.height/2)里面,你必须考虑填充,你试过了吗? –
我该如何处理填充? –