42

GridLayoutがどのように機能するかを理解しようとしていますが、ドキュメントから理解できないことの1つは、グリッドセルのサイズを制御する方法または制御できるかどうかです。

各セルが画面領域のちょうど25%(半分の高さ、半分の幅)を占める2 x 2のグリッドが必要だとしましょう。これはできますか?

LinearLayoutを使用すると、2つの水平LinearLayoutを1つの垂直にネストし、すべての要素に1の重みを割り当てることでこれを実現します。ただし、GridLayoutはweightプロパティをサポートしていません。

4

5 に答える 5

21

LinearLayout の layout_weight のように機能する android:layout_columnWeight と layout_rowWeight の 2 つのプロパティがあります。これは API 21 でサポートされています。古い Android デバイスの場合は、v7 サポート ライブラリの GridLayout を使用してください。

これらのプロパティを使用すると、各列に割り当てた値に基づいて列ベースの幅/高さを調整できます。数式は次のようになります (column_weight/ sum_of_column_weight) * gridLayout_width = column_width.

以下は、2 つの行と 2 つの列が均等に配置されたグリッドビューの例で、それぞれがグリッドの重量と高さの 50% を占めています。

<GridLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnCount="2"
>

    <TextView
        android:text="SEARCH FEE"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
     />

    <TextView
        android:layout_columnWeight="1"
        android:text="SEARCH FEE"
        android:layout_rowWeight="1"
     />

    <TextView
        android:text="SEARCH FEE"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        />

    <TextView
        android:layout_columnWeight="1"
        android:text="SEARCH FEE"
        android:layout_rowWeight="1"
        />
</GridLayout>
于 2015-06-27T13:13:30.530 に答える
12

ドキュメントによると、必要に応じて設定するのはかなり簡単なはずです。

android:rowCount='2'
android:columnCount='2'

そして子供セットで

android:layout_columnSpan="1"
android:layout_rowSpan="1"

この参考文献では、ストレッチについても言及しています。

柱が伸びるのを防ぐには、柱のコンポーネントの 1 つが重力を定義していないことを確認してください。

コンテンツに応じてサイズを変更せずに、行と列を50:50の比率に保つソリューションのように思えます

于 2013-01-24T14:19:00.153 に答える
8

次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:columnCount="2"
    app:rowCount="2">

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="1"
        app:layout_columnWeight="1"
        app:layout_rowWeight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="2"
        app:layout_columnWeight="1"
        app:layout_rowWeight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="3"
        app:layout_columnWeight="1"
        app:layout_rowWeight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="4"
        app:layout_columnWeight="1"
        app:layout_rowWeight="1" />

</android.support.v7.widget.GridLayout>
于 2016-03-20T02:40:16.517 に答える
2

GridLayout 内にヘルパー メソッドがあります。

GridLayout.LayoutParams params = new GridLayout.LayoutParams();
            params.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1, getAlignment(Gravity.NO_GRAVITY, true), 1);
item.setLayoutParams(params);

private GridLayout.Alignment getAlignment(int gravity, boolean horizontal) {
        int mask = horizontal ? HORIZONTAL_GRAVITY_MASK : VERTICAL_GRAVITY_MASK;
        int shift = horizontal ? AXIS_X_SHIFT : AXIS_Y_SHIFT;
        int flags = (gravity & mask) >> shift;
        switch (flags) {
            case (AXIS_SPECIFIED | AXIS_PULL_BEFORE):
                return horizontal ? LEFT : TOP;
            case (AXIS_SPECIFIED | AXIS_PULL_AFTER):
                return horizontal ? RIGHT : BOTTOM;
            case (AXIS_SPECIFIED | AXIS_PULL_BEFORE | AXIS_PULL_AFTER):
                return FILL;
            case AXIS_SPECIFIED:
                return CENTER;
            case (AXIS_SPECIFIED | AXIS_PULL_BEFORE | GravityCompat.RELATIVE_LAYOUT_DIRECTION):
                return START;
            case (AXIS_SPECIFIED | AXIS_PULL_AFTER | GravityCompat.RELATIVE_LAYOUT_DIRECTION):
                return END;
            default:
                return GridLayout.FILL;
        }
    }

通常、これはアクセス可能な反省のみです。

そして小さいバージョン:

params.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1, GridLayout.FILL, 1);
于 2016-06-15T14:23:57.770 に答える