Android GridLayoutで同じ列幅を簡単に強制することは本当に不可能ですか?明白なレイアウトを試してみてください...
<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>
...右端のボタンは、他の3つより明らかに広い列の中央に配置されます。 (ボタンのテキストを再生すると、簡単に悪い例が得られます。)
私はAndroid GridLayoutsの余分なスペースの分布に関するドキュメントを読みましたが、このような状況では列幅でさえも必要とされることが多々あります。明らか/簡単な何かが欠けています。
代わりにテーブルレイアウトを使用し、ストレッチ列を指定します。
<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>
GridLayoutの子に列の重みを使用するだけです:
Android:layout_width="0dp"
Android:layout_columnWeight="1"
覚えておくプロジェクトのMinSdk <API 21の場合、サポートライブラリを使用する:
implementation 'com.Android.support:appcompat-v7:27.1.1'
implementation 'com.Android.support:gridlayout-v7:27.1.1'
GridLayoutの代わりにAndroid.support.v7.widget.GridLayoutを使用する必要があります。サポートライブラリを使用する場合は、app名前空間を使用することを忘れないでください。
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="0dp"
app:layout_columnWeight="1"
PD:
プログラムでGridLayoutを作成する場合は、GridLayout.Specを使用します。例えば:
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);
(すべての子ビューについて)