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
для подробного представления? В чем причина или преимущество? Должен ли я использовать его тоже?
Ответы
Ответ 1
Контейнер detail - это FrameLayout
, потому что отображаемый Fragment
будет заменен с помощью метода FragmentTransaction
replace()
.
Первым аргументом replace()
является идентификатор контейнера, чьи фрагменты будут заменены. Если FrameLayout в этом примере был заменен фрагментом, то и фрагмент WorkStationListFragment
и любой фрагмент детали в настоящее время будут заменены новым фрагментом. Инкапсулируя фрагмент в FrameLayout, вы можете заменить только детали.
Ответ 2
Добавьте фрагмент в действие с помощью <fragment>
, если вам не нужно реагировать на изменения в пользовательском интерфейсе. В противном случае используйте <FrameLayout>
Макет кадра - это тип группы просмотра, которая используется для блокировки области на экране.