如何在使另一个 child 可见时调整 RelativeLayout child 的大小?

How to resize child of RelativeLayout when making another child visible?

当我在下面的RelativeLayout @+id/saveCancelBar 上调用view.setVisibility(View.VISIBLE) 时,它覆盖了FrameLayout 的一部分。我希望 FrameLayout 缩小以适合 RelativeLayout。如果我将所有内容都放在 LinearLayout 而不是 RelativeLayout 中,显示 SaveCancelBar 只会将所有内容向上移动并将部分工具栏移出屏幕

<RelativeLayout
    android:id="@+id/content_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center|bottom">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        android:elevation="4dp"
        android:layout_alignParentTop="true"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <LinearLayout
        android:id="@+id/content_view_panes"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar"
        android:orientation="horizontal"
        android:gravity="bottom">

        <WebView
            android:id="@+id/mainWebView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone" />

        <FrameLayout
            android:id="@+id/listContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@color/colorPrimaryDark"
        android:layout_below="@+id/content_view_panes"
        android:visibility="gone"
        android:id="@+id/saveCancelBar">
        <Button
            android:id="@+id/editorCancelButton"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="@string/editor_cancel"
            android:textColor="@color/white"
            android:layout_alignParentLeft="true"
            android:background="@color/colorPrimaryDark"/>
        <Button
            android:id="@+id/editorSaveButton"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="@string/editor_save"
            android:textColor="@color/white"
            android:layout_alignParentRight="true"
            android:background="@color/colorPrimaryDark"/>
    </RelativeLayout>
</RelativeLayout>

你需要做两件事。

首先,id 为 listContainer 的 FrameLayout 不会垂直移动,因为它的父级已将 layout_height 设置为 match_parent。您应该将父 content_view_panessaveCancelBar 包装在垂直方向的 LinearLayout 中,并将 layout_height 设置为 0dp,将 layout_width 设置为 1.对于 LinearLayout 的子项,这会告诉它填充剩余的 space。您不需要更改 listContainer 的宽度或高度,因为它会根据其父项调整大小。

现在,当您更改 saveCancelBar 的可见性时,content_view_paneslistContainer 的高度将得到调整。

例如:

<RelativeLayout
android:id="@+id/content_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center|bottom">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    android:elevation="4dp"
    android:layout_alignParentTop="true"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/toolbar"
    android:orientation="vertical">
    <LinearLayout
        android:id="@+id/content_view_panes"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <WebView
            android:id="@+id/mainWebView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone" />

        <FrameLayout
            android:id="@+id/listContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@color/colorPrimaryDark"
        android:layout_below="@+id/content_view_panes"
        android:visibility="gone"
        android:id="@+id/saveCancelBar">
        <Button
            android:id="@+id/editorCancelButton"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="@string/editor_cancel"
            android:textColor="@color/white"
            android:layout_alignParentLeft="true"
            android:background="@color/colorPrimaryDark"/>
        <Button
            android:id="@+id/editorSaveButton"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="@string/editor_save"
            android:textColor="@color/white"
            android:layout_alignParentRight="true"
            android:background="@color/colorPrimaryDark"/>
    </RelativeLayout>
</LinearLayout>