web-dev-qa-db-ja.com

Android GridLayout Equal Column Widths

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の余分なスペースの分布に関するドキュメントを読みましたが、このような状況では列幅でさえも必要とされることが多々あります。明らか/簡単な何かが欠けています。

20
Boulder Keith

代わりにテーブルレイアウトを使用し、ストレッチ列を指定します。

<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>
23
Al Polden

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

(すべての子ビューについて)

14
kissed