Подтвердить что ты не робот

Android: когда/почему я должен использовать FrameLayout вместо Fragment?

Я строю макет для больших экранов, который должен состоять из двух разных частей: левого и правого. Для этого я думал, что использование 2 фрагментов - правильный выбор.

Затем я взглянул на пример навигации с помощью Master/Detail-Flow. Он имеет 2-панельный макет, где справа находится навигация, а слева - подробный вид.

Но в этом примере, отличном от того, что я ожидал увидеть, для подробного представления есть FrameLayout, который затем содержит Fragment, а не непосредственно Fragment.

Формат XML выглядит следующим образом (пример):

<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:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:baselineAligned="false"
    android:divider="?android:attr/dividerHorizontal"
    android:orientation="horizontal"
    android:showDividers="middle"
    tools:context=".WorkStationListActivity" >

    <fragment
        android:id="@+id/workstation_list"
        android:name="de.tuhh.ipmt.ialp.history.WorkStationListFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        tools:layout="@android:layout/list_content" />

    <FrameLayout
        android:id="@+id/workstation_detail_container"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3" />

</LinearLayout>

Теперь мой вопрос: почему используется FrameLayout вместо Fragment для подробного представления? В чем причина или преимущество? Должен ли я использовать его тоже?

4b9b3361

Ответ 1

Контейнер detail - это FrameLayout, потому что отображаемый Fragment будет заменен с помощью метода FragmentTransaction replace().

Первым аргументом replace() является идентификатор контейнера, чьи фрагменты будут заменены. Если FrameLayout в этом примере был заменен фрагментом, то и фрагмент WorkStationListFragment и любой фрагмент детали в настоящее время будут заменены новым фрагментом. Инкапсулируя фрагмент в FrameLayout, вы можете заменить только детали.

Ответ 2

Добавьте фрагмент в действие с помощью <fragment>, если вам не нужно реагировать на изменения в пользовательском интерфейсе. В противном случае используйте <FrameLayout> Макет кадра - это тип группы просмотра, которая используется для блокировки области на экране.