RelativeLayout中的第一个视图展开以填充剩余空间

时间:2015-06-02 17:03:50

标签: android android-layout listview relativelayout

我正在制作一个带有cardview,复选框和按钮的布局,其初始结构如第一张图片所示:

Layout with hidden listview layout with expanded listview

在这种情况下,直到用户点击cardview中的图像才会显示列表视图,因此当发生这种情况时,所需的结构就像 第二张图片

然而,由于listview实际上是在一个片段中,我无法实现所需的布局,因为cardview的wrap_content和match_parent给了我下一个结果

enter image description here

正如您所看到的,cardview与按钮重叠,复选框超出了屏幕

现在这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white">

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/card"
    android:layout_marginTop="5dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_alignParentTop="true"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        >


            <ImageButton
                android:layout_width="@dimen/event_invitation_expand_icon"
                android:layout_height="@dimen/event_invitation_expand_icon"
                android:id="@+id/shrink"
                android:src="@drawable/ic_shrink"
                android:background="@android:color/transparent"
                android:scaleType="fitCenter"
                android:layout_gravity="center_vertical"
                android:layout_marginRight="5dp"/>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/shrink"
            android:layout_marginTop="5dp"
            android:id="@+id/list">

            <fragment
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:name="ListFragment"
                tools:layout="@layout/fragment_list"/>
        </RelativeLayout>

    </RelativeLayout>

</android.support.v7.widget.CardView>

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/checkBox"
    android:layout_marginTop="20dp"
    android:layout_below="@+id/card"/>

<Space
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/button"
    android:layout_below="@+id/checkBox"/>

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/button"
    android:layout_alignParentBottom="true"
    style="@android:style/Widget.DeviceDefault.Button.Borderless"
    />

我希望你可以帮我设置卡片视图的最大高度,以便在空间填满时停止生长。

我还尝试将复选框始终设置在底部和cardview以填充剩余空间,虽然它在扩展列表视图时为我提供了正确的结构,但它对于隐藏的列表不起作用cardview没有任何东西填补空间。

更新

正如所建议的,我尝试使用权重将根布局更改为LinearLayout,但是,我得到了与之前相同的结果,如果我将cardview的权重更改为1并将复选框更改为0,则可以获得所需的布局对于扩展列表但不是隐藏案例。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white"
          android:orientation="vertical">



    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/card"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_weight="0">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="5dp"
            >



            <ImageButton
                android:layout_width="@dimen/event_invitation_expand_icon"
                android:layout_height="@dimen/event_invitation_expand_icon"
                android:id="@+id/shrink"
                android:src="@drawable/ic_shrink"
                android:background="@android:color/transparent"
                android:scaleType="fitCenter"
                android:layout_gravity="center_vertical"
                android:layout_marginRight="5dp"/>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/shrink"
            android:layout_marginTop="5dp"
            android:id="@+id/list">

            <fragment
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:name="ListFragment"
                tools:layout="@layout/fragment_list"/>

        </RelativeLayout>

    </android.support.v7.widget.CardView>

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1">

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/check"
        android:id="@+id/check"
        android:layout_marginTop="20dp"
        android:layout_below="@+id/card"
        />

</LinearLayout>

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/button"
    android:textStyle="bold"
    android:textColor="@android:color/white"
    />

2 个答案:

答案 0 :(得分:2)

您需要使用LinearLayout并使用Weight作为孩子。 您可以点击更改所有视图权重。

但我认为您需要将CheckBox置于布局中并设置此布局权重。否则你会弄乱身高 没有看到你的布局,但你可能也需要为CardView做到这一点。
请记住这一点。

希望这有帮助

答案 1 :(得分:0)

要做你想做的事情,你可以更好地使用具有垂直方向的LinearLayout作为你的根元素。这样做,你可以将CardView的权重设置为1(和0dp的高度&#39;,因为重量如何工作)而不给其他元素赋予权重,使其填充所有可用空间没有采取其他两个要素。这样做的方法可以在这里找到: http://developer.android.com/guide/topics/ui/layout/linear.html#Weight