26

简而言之,是否有可能告诉 a 中的孩子RelativeLayout始终与该孩子的身高相匹配,RelativeLayout而不管其他孩子的RelativeLayout行为如何?简而言之,就是这样。详情如下。

我想要实现的是ListView至少包含三个视图的行,其中一个视图将是列表条目右侧的条纹(下面的红色视图)。我遇到的问题是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 未垂直填充整个布局

将条带和根高度设置为match_parent没有区别。我做的。

重复这个问题,我希望红色条纹始终垂直填充父级。您可以看到条带未与根顶部对齐。

注意:上面的例子是我能想到的最简单、独立的例子。它只是一个由静态数组填充ListActivity的匿名对象。里面的相关代码最多8行,不用担心。这真的是布局。此外,我已经使用了嵌套的 s,但如果可能的话,我正在尝试减少我的布局结构的深度。正如预期的那样工作正常。ArrayAdapterStringonCreateLinearLayoutLinearLayout

4

5 回答 5

35

我有同样的要求,我的解决方案是将红色条纹的顶部与父级的顶部对齐,将条纹的底部与左侧文本视图的底部对齐。在这种情况下,高度变得无关紧要。您可以使用wrap_contentmatch_parent

于 2013-08-18T20:43:33.047 回答
19

简单的把你的mainRelativeLayout放在a里面LinearLayout,那么child Views高度的计算就正确了。我有同样的问题,它对我有用。

于 2015-03-01T21:21:40.453 回答
6

尝试这个:

<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一样。

于 2013-08-18T20:52:31.530 回答
1

这是一个烦人的问题,您需要将 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>
于 2016-11-12T14:40:58.903 回答
1

将侦听器添加到列表项持有人,以便每次持有人改变高度时,将该高度设置为孩子。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);
        }
    });
于 2017-08-22T18:10:16.963 回答