【问题标题】:Android - Master/Detail layout with expanded masterAndroid - 具有扩展主控的主控/细节布局
【发布时间】:2020-10-08 11:55:23
【问题描述】:

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

我想实现以下目标:

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

[[        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>

这使得“细节”占据了 50% 的宽度,即使“细节”没有实际内容(这是可以理解的,因为权重均匀地分配了可用空间)。

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

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”占用的空间更少(例如可用宽度的 50%),“details”占用其余空间

这可以完全通过 XML 声明来完成,还是我也必须以编程方式完成(例如,在添加“细节”时更改布局参数)?

如果“master”是一个显示多个 RecyclerViews 的 ViewPager 并且“details”是一个 ScrollView 中的内容(这使得使用“wrap_content”成为一个问题,因为它们的大小没有很好地定义),你的答案会改变吗?

【问题讨论】:

    标签: android layout master-detail


    【解决方案1】:

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

    充气前的这个

    <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);
    

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

    【讨论】:

    • 谢谢。 setVisibility,应该想到的。所以我只是在没有显示细节时将 FrameLayout 设置为 GONE,当我显示细节时,我将其设置为 VISIBLE。
    • 您最初将其保留在 XML 中以使其以编程方式完成更少的工作
    • 我认为你的意思是 b.setVisibility(View.VISIBLE);显示片段膨胀后的细节。
    • 是的,是的。我犯了一个错误,但我已经编辑了答案。
    猜你喜欢
    • 2013-09-18
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多