Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android GridLayout Equal Column Widths

Is it really not possible to easily force equal column widths in an Android GridLayout? Trying the obvious layout...

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:columnCount="4"     android:rowCount="8"     tools:context=".MainActivity" >      <Button         android:id="@+id/button1"         android:layout_gravity="center"         android:text="Button 1" />     <Button         android:id="@+id/button2"         android:layout_gravity="center"         android:text="Button 2" />     <Button         android:id="@+id/button3"         android:layout_gravity="center"         android:text="Button 3" />     <Button         android:id="@+id/button4"         android:layout_gravity="center"         android:text="Button 4" />  </GridLayout> 

... leaves the rightmost button centered in a column that is clearly wider than the other three. (Play with the button text and you can easily get worse examples.)

I read the Android documentation regarding excess space distribution in GridLayouts, but it seems so obvious that even column widths are often (any maybe even typically) wanted in a situation like this that I have to believe I'm missing something obvious/easy.

like image 376
Boulder Keith Avatar asked Mar 14 '14 19:03

Boulder Keith


1 Answers

Just use column weight for GridLayout's children:

android:layout_width="0dp" android:layout_columnWeight="1" 

Remember using support library if your project's MinSdk < API 21:

implementation 'com.android.support:appcompat-v7:27.1.1'  implementation 'com.android.support:gridlayout-v7:27.1.1' 

You should use android.support.v7.widget.GridLayout instead of GridLayout. And don't forget using app namespace when using support library:

xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="0dp" app:layout_columnWeight="1" 

UPD:

If you make your GridLayout programmatically, use GridLayout.Spec. For example:

GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(     GridLayout.spec(GridLayout.UNDEFINED, 1f),     GridLayout.spec(GridLayout.UNDEFINED, 1f) );  layoutParams.width = 0;  yourChildView.setLayoutParams(layoutParams); yourGridLayout.addView(yourChildView); 

(for every child view)

like image 151
kissed Avatar answered Sep 21 '22 16:09

kissed