2017-01-22 146 views
1

我有一個GridView(有2列和2行)並且想要拉伸行以填充整個屏幕。它應該在所有設備上都一樣。使用Gridview項目填充整個屏幕

enter image description here

這意味着我不希望最後一排下一些空的空間。所以,我搜索了一點,找到了解決設置在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); 

但現在它看起來像這樣:

enter image description here

觀現在是滾動和項目具有相同的尺寸。但它不適合在屏幕上。

這是我的佈局,包括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> 

有什麼問題嗎?

+0

也許在gridView.setMinimumHeight(ActMainMenu.height/2)裏面,你必須考慮填充,你試過了嗎? –

+0

我該如何處理填充? –

回答

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

工具欄高度感謝獲取到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可能會更好。

+0

謝謝。我決定使用LinearLayout和權重。這工作得很好。感謝您的提示。 –

+1

我在完成這個答案後昨天晚上在想這件事。今天早上要添加加權的LinearLayout。您會收到有關嵌套權重的警告,但我不認爲性能會受此影響。 – Gary99