Android - Макет Master / Detail с расширенным мастером - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь создать макет мастер / деталь, где мастер занимает все доступное пространство, если деталь не отображается. Во всех найденных мною примерах, включая шаблон master / detail из 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. «мастер» занимал всю ширину, пока не добавляются детали
  2. когда добавлен MyDetailsFragment, "master" занимает меньше места e (например, 50% доступной ширины), а «детали» занимают все остальное

Можно ли это сделать исключительно с помощью объявлений XML, или мне также нужно делать что-то программно (например, изменение параметры макета при добавлении «деталей»)?

Изменится ли ваш ответ, если «master» - это ViewPager, показывающий несколько RecyclerViews, а «details» - это содержимое в ScrollView (что делает использование wrap_content проблемой в качестве их размер не очень хорошо определен)?

1 Ответ

0 голосов
/ 18 июня 2020

Лично, если бы я достиг этого, я бы использовал фрагмент деталей в XML, чтобы его видимость была установлена ​​на «Gone», и, конечно же, мой подход программный, поэтому я бы снова установил видимость на «Visible» как только я надуваю фрагмент Details.

Это перед надуванием

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

Сообщите мне, подходит ли он сейчас, иначе мы будем искать альтернатива

...