N'est-il pas vraiment possible de forcer facilement des largeurs de colonne égales dans un Android GridLayout? Essayer la mise en page évidente ...
<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>
... laisse le bouton le plus à droite centré dans une colonne qui est clairement plus large que les trois autres. (Jouez avec le texte du bouton et vous pouvez facilement obtenir de pires exemples.)
J'ai lu la documentation Android concernant la distribution d'espace excédentaire dans GridLayouts, mais il semble si évident que même des largeurs de colonne sont souvent (tout peut-être même généralement) recherchées dans une situation comme celle-ci que je dois croire que je me manque quelque chose d'évident/de facile.
Utilisez plutôt une disposition de tableau et spécifiez des colonnes étendues.
<TableLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_below="@+id/textViewLeaveRemainingDescription"
Android:stretchColumns="0,1">
<TableRow>
<Button
Android:id="@+id/button1"
Android:layout_gravity="center"
Android:text="Button 1" />
<Button
Android:id="@+id/button3"
Android:layout_gravity="center"
Android:text="Button 3" />
</TableRow>
<TableRow>
<Button
Android:id="@+id/button2"
Android:layout_gravity="center"
Android:text="Button 2" />
<Button
Android:id="@+id/button4"
Android:layout_gravity="center"
Android:text="Button 4" />
</TableRow>
</TableLayout>
Utilisez simplement le poids de la colonne pour les enfants de GridLayout:
Android:layout_width="0dp"
Android:layout_columnWeight="1"
Rappelez-vous en utilisant la bibliothèque de support si MinSdk <API 21 de votre projet:
implementation 'com.Android.support:appcompat-v7:27.1.1'
implementation 'com.Android.support:gridlayout-v7:27.1.1'
Vous devez utiliser Android.support.v7.widget.GridLayout au lieu de GridLayout. Et n'oubliez pas d'utiliser app namespace lors de l'utilisation de la bibliothèque de support:
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="0dp"
app:layout_columnWeight="1"
PD:
Si vous créez votre GridLayout par programme, utilisez GridLayout.Spec. Par exemple:
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);
(pour chaque vue enfant)