我正在为大屏幕构建一个布局,它应该包含两个不同的部分,一个是左边的,另一个是右边的。为此,我认为使用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
本身用于详情视图?是什么原因或优势?我也应该使用它吗?
答案 0 :(得分:38)
详细信息容器是FrameLayout
,因为显示的Fragment
将使用FragmentTransaction
的{{3}}方法替换。
replace()
的第一个参数是其片段将被替换的容器的ID。如果此示例中的FrameLayout被片段替换,则当前显示的WorkStationListFragment
和任何细节片段都将被新片段替换。通过将Fragment封装在FrameLayout中,您可以只替换细节。
答案 1 :(得分:2)
片段标记::可用于立即通过XML加载片段,但不能由transaction.replace()方法代替。可以按名称或类属性加载片段。
FrameLayout标记:只能通过编程方式加载片段,并且片段也可以由transaction.replace()方法替换。可以通过FragmentTransction添加/替换片段。
FragmentContainerView标记: FragmentContainerView是FrameLayout的子级,也是建议加载片段的视图,它支持fragment标签的属性:(名称和类),因此可以从XML加载片段,但与fragment不同标记,可以用transaction.replace()替换一个片段。我们知道它是FrameLayout的子级,因此支持FrameLayout的所有功能,我们可以像添加FrameLayout一样添加片段。
此外,在FragmentCotainerView中解决了与FrameLayout动画相关的问题:
以前,尝试自定义影片的输入和退出动画 片段引起了一个问题,即输入片段将是 在退出的片段下方,直到它完全退出屏幕为止。 这导致了令人不快且错误的动画,当 在片段之间过渡。
选中此link。