Android - Master/Detail 带扩展母版的布局

Android - Master/Detail layout with expanded master

我正在尝试创建一个 master/detail 布局,如果未显示详细信息,主布局会占用所有可用 space。 我找到的所有示例,包括来自 Android Studio 的 master/detail 模板,都始终显示详细信息部分,即使是空的。

我想实现以下目标:

这应该是布局,当没有显示细节时。

[[        master        ]]

(扩展主视图填满整个屏幕)

当显示细节时,这应该是布局。

[[ master ][   detail   ]]

(大纲和细节并排)

这是我当前的布局,但我尝试了不同的组合:

<?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:orientation="horizontal">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/master"
        android:name="com.example.MyMasterFragment"
        android:layout_width="0dp"
        android:layout_weight="0.5"
        android:layout_height="match_parent"/>

    <FrameLayout
        android:id="@+id/details"
        android:layout_width="0dpt"
        android:layout_weight="0.5"
        android:layout_height="match_parent"/>
</LinearLayout>

这使得 "details" 占据了 50% 的宽度,即使 "details" 没有实际内容(这是可以理解的,因为权重分布自由 space 均匀)。

设置明细内容的代码也很简单:

Fragment details = new MyDetailsFragments();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();

我该如何更改布局才能

  1. "master"占整个宽度只要不加细节
  2. 添加 MyDetailsFragment 后,"master" 占用较少 space(例如,可用宽度的 50%),"details" 占用其余部分

这是否可以仅通过 XML 声明来完成,还是我还必须以编程方式进行操作(例如,在添加 "details" 时更改布局参数)?

如果 "master" 是一个显示多个 RecyclerView 的 ViewPager 并且 "details" 是一个 ScrollView 中的内容(这使得使用 "wrap_content" 成为一个问题,因为它们的大小不是很好定义)?

就我个人而言,如果我要实现这一点,那么我会使用 XML 中的详细信息片段将其可见性设置为 "Gone",当然,我的方法是以编程方式进行的,因此我将设置一旦我膨胀细节片段,可见性回到 "Visible"。

充气前的这个

<FrameLayout
    android:id="@+id/details"
    android:layout_width="0dpt"
    android:layout_weight="0.5"
    android:layout_height="match_parent"
    android:visibility="gone"/> // Keep it gone before

充气后,

View b = findViewById(R.id.details);
b.setVisibility(View.VISIBLE);

让我知道它现在是否合适,否则我们将寻找替代方案