web-dev-qa-db-ja.com

GridLayoutと行/列のスパンの災い

GridLayoutを紹介するAndroid Developersブログの投稿 は、スパンが自動インデックス割り当てにどのように影響するかを示す次の図を示しています。

automatic index allocation

GridLayoutを使用して実際に実装しようとしています。ここに私がこれまでに持っているものがあります:

<Android.support.v7.widget.GridLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res/com.commonsware.Android.gridlayout"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    app:orientation="horizontal"
    app:columnCount="8">

    <Button
        app:layout_columnSpan="2"
        app:layout_rowSpan="2"
        Android:layout_gravity="fill_horizontal"
        Android:text="@string/string_1"/>

  <Button
    app:layout_columnSpan="2"
    Android:layout_gravity="fill_horizontal"
    Android:text="@string/string_2"/>

  <Button
    app:layout_rowSpan="4"
    Android:text="@string/string_3"/>

  <Button
    app:layout_columnSpan="3"
    app:layout_rowSpan="2"
    Android:layout_gravity="fill_horizontal"
    Android:text="@string/string_4"/>

  <Button
    app:layout_columnSpan="3"
    Android:layout_gravity="fill_horizontal"
    Android:text="@string/string_5"/>

  <Button
    app:layout_columnSpan="2"
    Android:layout_gravity="fill_horizontal"
    Android:text="@string/string_6"/>

  <Android.support.v7.widget.Space
    app:layout_column="0"
    Android:layout_width="36dp"
    />

  <Android.support.v7.widget.Space
    Android:layout_width="36dp"
    />

  <Android.support.v7.widget.Space
    Android:layout_width="36dp"
    />

  <Android.support.v7.widget.Space
    Android:layout_width="36dp"
    />

  <Android.support.v7.widget.Space
    Android:layout_width="36dp"
    />

  <Android.support.v7.widget.Space
    Android:layout_width="36dp"
    />

  <Android.support.v7.widget.Space
    Android:layout_width="36dp"
    />

  <Android.support.v7.widget.Space
    Android:layout_width="36dp"
    />

</Android.support.v7.widget.GridLayout>

<Space>要素を導入して、各列に最小幅を持たせる必要がありました。そうしないと、幅がゼロの列の束ができてしまいます。

しかし、それらでも、私はこれを得る:

sample GridLayout

特に:

  • Android:layout_gravity="fill_horizontal"にもかかわらず、列のスパンを持つウィジェットがスパンされた列を埋めません

  • Android:layout_rowSpan値にもかかわらず、行にまたがるものはありません

GridLayoutを使用して、ブログ投稿から図を複製できますか?

ありがとう!

115
CommonsWare

かなりハッキーな感じがしますが、必要なものを超えて列と行を追加することで、正しい外観を得ることができました。次に、高さを定義する各行にスペースを追加列に入力し、幅を定義する各列にスペースを追加行に入力しました。柔軟性を高めるために、これらのスペースサイズをコードで設定して、重みに似たものを提供できると思います。スクリーンショットを追加しようとしましたが、必要な評判がありません。

<GridLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:columnCount="9"
Android:orientation="horizontal"
Android:rowCount="8" >

<Button
    Android:layout_columnSpan="2"
    Android:layout_gravity="fill"
    Android:layout_rowSpan="2"
    Android:text="1" />

<Button
    Android:layout_columnSpan="2"
    Android:layout_gravity="fill_horizontal"
    Android:text="2" />

<Button
    Android:layout_gravity="fill_vertical"
    Android:layout_rowSpan="4"
    Android:text="3" />

<Button
    Android:layout_columnSpan="3"
    Android:layout_gravity="fill"
    Android:layout_rowSpan="2"
    Android:text="4" />

<Button
    Android:layout_columnSpan="3"
    Android:layout_gravity="fill_horizontal"
    Android:text="5" />

<Button
    Android:layout_columnSpan="2"
    Android:layout_gravity="fill_horizontal"
    Android:text="6" />

<Space
    Android:layout_width="36dp"
    Android:layout_column="0"
    Android:layout_row="7" />

<Space
    Android:layout_width="36dp"
    Android:layout_column="1"
    Android:layout_row="7" />

<Space
    Android:layout_width="36dp"
    Android:layout_column="2"
    Android:layout_row="7" />

<Space
    Android:layout_width="36dp"
    Android:layout_column="3"
    Android:layout_row="7" />

<Space
    Android:layout_width="36dp"
    Android:layout_column="4"
    Android:layout_row="7" />

<Space
    Android:layout_width="36dp"
    Android:layout_column="5"
    Android:layout_row="7" />

<Space
    Android:layout_width="36dp"
    Android:layout_column="6"
    Android:layout_row="7" />

<Space
    Android:layout_width="36dp"
    Android:layout_column="7"
    Android:layout_row="7" />

<Space
    Android:layout_height="36dp"
    Android:layout_column="8"
    Android:layout_row="0" />

<Space
    Android:layout_height="36dp"
    Android:layout_column="8"
    Android:layout_row="1" />

<Space
    Android:layout_height="36dp"
    Android:layout_column="8"
    Android:layout_row="2" />

<Space
    Android:layout_height="36dp"
    Android:layout_column="8"
    Android:layout_row="3" />

<Space
    Android:layout_height="36dp"
    Android:layout_column="8"
    Android:layout_row="4" />

<Space
    Android:layout_height="36dp"
    Android:layout_column="8"
    Android:layout_row="5" />

<Space
    Android:layout_height="36dp"
    Android:layout_column="8"
    Android:layout_row="6" />

</GridLayout>

screenshot

73
kturney
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" >

    <GridLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:columnCount="8"
        Android:rowCount="7" >

        <TextView
            Android:layout_width="50dip"
            Android:layout_height="50dip"
            Android:layout_columnSpan="2"
            Android:layout_rowSpan="2"
            Android:background="#a30000"
            Android:gravity="center"
            Android:text="1"
            Android:textColor="@Android:color/white"
            Android:textSize="20dip" />

        <TextView
            Android:layout_width="50dip"
            Android:layout_height="25dip"
            Android:layout_columnSpan="2"
            Android:layout_rowSpan="1"
            Android:background="#0c00a3"
            Android:gravity="center"
            Android:text="2"
            Android:textColor="@Android:color/white"
            Android:textSize="20dip" />

        <TextView
            Android:layout_width="25dip"
            Android:layout_height="100dip"
            Android:layout_columnSpan="1"
            Android:layout_rowSpan="4"
            Android:background="#00a313"
            Android:gravity="center"
            Android:text="3"
            Android:textColor="@Android:color/white"
            Android:textSize="20dip" />

        <TextView
            Android:layout_width="75dip"
            Android:layout_height="50dip"
            Android:layout_columnSpan="3"
            Android:layout_rowSpan="2"
            Android:background="#a29100"
            Android:gravity="center"
            Android:text="4"
            Android:textColor="@Android:color/white"
            Android:textSize="20dip" />

        <TextView
            Android:layout_width="75dip"
            Android:layout_height="25dip"
            Android:layout_columnSpan="3"
            Android:layout_rowSpan="1"
            Android:background="#a500ab"
            Android:gravity="center"
            Android:text="5"
            Android:textColor="@Android:color/white"
            Android:textSize="20dip" />

        <TextView
            Android:layout_width="50dip"
            Android:layout_height="25dip"
            Android:layout_columnSpan="2"
            Android:layout_rowSpan="1"
            Android:background="#00a9ab"
            Android:gravity="center"
            Android:text="6"
            Android:textColor="@Android:color/white"
            Android:textSize="20dip" />
    </GridLayout>

</RelativeLayout>

ScreenShot

16
HandlerExploit

列にlayout_gravityとlayout_columntWeightの両方を設定する必要があります

<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="wrap_content">

    <TextView Android:text="سوم شخص"
        app:layout_gravity="fill_horizontal"
        app:layout_columnWeight="1"
        />

    <TextView Android:text="دوم شخص"
        app:layout_gravity="fill_horizontal"
        app:layout_columnWeight="1"
        />

    <TextView Android:text="اول شخص"
        app:layout_gravity="fill_horizontal"
        app:layout_columnWeight="1"
        />
 </Android.support.v7.widget.GridLayout>
5

AndroidサポートV7 GridLayoutライブラリは、重量の原則に対応することにより、余分なスペースを簡単に分配します。列を引き伸ばすには、その中のコンポーネントが重量または重力を定義していることを確認してください。列が伸びないようにするには、列のコンポーネントの1つが重量または重力を定義しないようにします。このライブラリの依存関係を忘れずに追加してください。 build.gradleにcom.Android.support:gridlayout-v7:25.0.1を追加します。

<?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="First"
    app:layout_columnWeight="1"
    app:layout_rowWeight="1" />

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

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

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

</Android.support.v7.widget.GridLayout>
1
Permita

API 21以降、GridLayoutはLinearLayoutのようなウェイトをサポートするようになりました。詳細については、以下のリンクをご覧ください。

https://stackoverflow.com/a/31089200/1296944

0
Jack