2017-01-22 1 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

The View теперь прокручивать и детали имеют одинаковый размер. Но он не подходит на экране.

Вот код моего макета, включая 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

Проблема с вашими 2-мя снимками экрана в расчете высоты. 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

 Смежные вопросы

  • Нет связанных вопросов^_^