web-dev-qa-db-ja.com

RelativeLayoutの子のmatch_parentプロパティ

つまり、RelativeLayoutの子に常にそのRelativeLayout他の子が同じであるかどうかに関係なくRelativeLayout振る舞う?要するに、それだけです。詳細は以下。

私が達成しようとしているのは、少なくとも3つのビューを持つListView行です。これらのビューの1つは、リストエントリの右側にあるストライプのようなものです(以下の赤いビュー)。私が抱えている問題は、左側にTextViewがあり、テキストの量に応じて、ストライプがレイアウト全体を埋めることができないことです。これは以下の画像で非常に明確に説明されています。

ListViewアイテムのレイアウト:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content">

<View
        Android:id="@+id/bottom_line"
        Android:layout_width="match_parent"
        Android:layout_height="5dp"
        Android:layout_alignParentBottom="true"
        Android:background="#fc0" />

<!-- Why match_parent does not work in view below? -->
<View
        Android:id="@+id/stripe"
        Android:layout_width="80dp"
        Android:layout_height="wrap_content"
        Android:minHeight="50dp"
        Android:layout_alignParentRight="true"
        Android:layout_alignParentTop="true"
        Android:layout_alignParentBottom="true"
        Android:background="#f00" />

<TextView
        Android:id="@+id/text"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:layout_toLeftOf="@id/stripe"
        Android:text="This is a very long line, meant to completely break the match_parent property of the box at right"
        style="?android:textAppearanceLarge"/>

</RelativeLayout>

結果:

RelativeLayout with child not filling the whole layout vertically

ストライプとルートの高さをmatch_parentに設定しても違いはありません。それを行いました。

質問を繰り返します。赤いストライプが常に親を垂直方向に塗りつぶしたいのです。ストライプがルートの上部に揃っていないことがわかります。

注:上記の例は、私が考えることができる最も単純な自己完結型の例です。これは、静的なListActivity配列によって匿名のArrayAdapterが入力されたStringです。 onCreateの関連コードは最大8行なので、心配する必要はありません。それは本当にレイアウトです。その上、ネストされたLinearLayoutsを使ってこれをすでに機能させていますが、可能であれば、レイアウト構造の深さを少し減らしようとしています。 LinearLayoutは正常に機能します。

26
davidcesarino

同じ要件があり、私の解決策は、赤いストライプの上部を親の上部に揃え、ストライプの下部を左側のテキストビューの下部に揃えることでした。この場合の高さは関係ありません。 wrap_contentまたはmatch_parent

35

メインのRelativeLayoutLinearLayoutの中に置くだけで、子ビューの高さの計算が正しくなります。私は同じ問題を抱えており、それは私のために働いた。

20
Behzad

これを試して:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content">

    <View
        Android:id="@+id/stripe"
        Android:layout_width="80dp"
        Android:layout_height="match_parent"
        Android:layout_alignBottom="@id/text"
        Android:layout_alignParentRight="true"
        Android:layout_alignTop="@id/text"
        Android:background="#f00"
        Android:minHeight="50dp"/>

    <TextView
        Android:id="@+id/text"
        style="?android:textAppearanceLarge"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:layout_toLeftOf="@id/stripe"
        Android:text="This is a very long line, meant to completely break the match_parent property of the box at right"/>

    <View
        Android:id="@+id/bottom_line"
        Android:layout_width="match_parent"
        Android:layout_height="5dp"
        Android:layout_below="@id/text"
        Android:background="#fc0"/>

</RelativeLayout>

赤いビューの上部と下部の整列は、textviewと同じになりました。

6
Namenlos

リストアイテムホルダーにリスナーを追加して、ホルダーが高さを変更するたびに、その高さを子に設定します。 i1はトップ、i3はボトム用です。

parent.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
            child.setTop(i1);
            child.setBottom(i3);
        }
    });
1
C. Alen

これは厄介な問題であり、RelativeLayoutをLinearLayout内に配置する必要があります

 <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:minHeight="40dp"
        >
        <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent">
            <RelativeLayout
                Android:id="@+id/deleteItem"
                Android:layout_width="60dp"
                Android:layout_height="match_parent"
                Android:layout_alignParentRight="true"
                Android:clickable="true"
                Android:background="@color/background_grey"
                >
                <TextView
                    style="@style/SmallButtonFont"
                    Android:layout_marginRight="12dp"
                    Android:layout_centerInParent="true"
                    Android:text="CLEAR"
                    Android:textColor="@color/globalRedLight" />
            </RelativeLayout>
    </RelativeLayout>
</LinearLayout>
1
Ronny Shibley