1

同じ幅の 2 つの線形レイアウトがあります。1 つは 2 つの子、もう 1 つは 3 です。最後の 2 つの子を同じ幅にしようとしていますが、Android がこのように動作する理由がわかりません。最終的に、次の重みで希望どおりに見えるようになりました。

ウェイト

なぜこれがこのように機能するのか、誰かが私に説明できますか?

その理由を簡単に計算してみました。重みの合計から子の重みを引いたものを、重みの合計で割って、親の幅を掛けたものだと思います。そう:

sum = 1 + 6
((sum - 6) / sum) * W = 14.3% * W

2行目に同じアルゴリズムを試しましたが、完全にオフでした:

sum = 1 + 1 + 1.5
((sum - 1.5) / sum) * W = 57.1% * W

アップデート

上記は、子の幅が match_parent に設定されている場合にのみ当てはまります。幅を 0 または 0dp に設定すると、実際には期待どおりに動作します。重みが大きいほど、子に割り当てられるスペースが増えます。アルゴリズムはもう少し意味があり、両方の行で期待どおりに機能します。

sum = 1 + 6
(1 / sum) * W = 14.3% * W

子の幅が設計により match_parent に設定されているウェイトの以前の動作ですか? もしそうなら、子供の幅を計算するためのおおよそのアルゴリズムは何ですか?

4

3 に答える 3

1

XMLでweightSum属性を指定して、たとえば最初のレイアウトを指定できます。次に、最初の2つは約0.9と0.1の重み(90%と10%など)を取得しますLinearLayout1TextViews

同じことが2番目にも適用される必要がありますLinearLayout。何かのようなもの:

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="1"
        android:background="#FF0000FF" >

        <TextView
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight=".9"
            android:layout_margin="3dp"
            android:background="#FFFFFFFF"
            android:text="TextView" />

        <TextView
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight=".1"
            android:layout_margin="3dp"
            android:background="#FFFFFFFF"
            android:text="TextView" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="3dp"
        android:weightSum="1"
        android:background="#FF0000FF" >

        <TextView
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_margin="3dp"
            android:layout_weight=".45"
            android:background="#FFFFFFFF"
            android:text="TextView" />

        <TextView
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight=".45"
            android:layout_margin="3dp"
            android:background="#FFFFFFFF"
            android:text="TextView" />

        <TextView
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight=".1"
            android:layout_margin="3dp"
            android:background="#FFFFFFFF"
            android:text="TextView" />
    </LinearLayout>

widthところで、属性をに設定することを忘れないでください0dip

于 2013-02-06T20:16:32.250 に答える
1

最初: レイアウトの外観に基づいて、2 つの LinearLayouts の代わりに GridLayout を使用するように見えます。

質問に戻ります: あなたの場合、layout_width を wrap_content に設定しないでください (特に match_parent は設定しないでください!)。layout_width を 0dp に設定し、layout_weight 属性で使用可能な水平スペースを分散させます。

layout_weight 属性は、指定された layout_width (または垂直方向の LinearLayout の場合は layout_height) に追加のスペースを分配/追加します。layout_weight のみが間隔に寄与するようにする場合は、layout_width を 0dp に設定します (垂直方向の LinearLayout の場合は、layout_height を 0dp に設定します)。

最初にこれを試して、これがあなたの望みや期待通りに動作するかどうかを確認してください。

この例を試してください (グリッドの比率が 3:3:1 の場合):

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#FF0000FF" >

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="6"
        android:background="#FFFFFFFF"
        android:text="TextView" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="#FFFFFFFF"
        android:text="TextView" />
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="3dp"
    android:background="#FF0000FF" >

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:background="#FFFFFFFF"
        android:text="TextView" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:background="#FFFFFFFF"
        android:text="TextView" />

<TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="#FFFFFFFF"
        android:text="TextView" />
</LinearLayout>
于 2013-02-06T20:18:02.710 に答える
-1

あなたの写真によると、重みが正しくありません。たとえば、最初の「行」: 最初の TextView の重みを '1' に設定し、2 番目の重みを '6' に設定しました。つまり、2 番目の TextView にはより多くのスペースがあり、すべてのレイアウト幅の 6/7 と最初の TextView には 1/7 しかありません。計算を簡単にするために、幅の合計を 100(%) と想定し、必要な比率に従ってビュー間で分割します。

于 2013-02-06T20:22:14.770 に答える