Android:何时/为啥我应该使用 FrameLayout 而不是 Fragment?

Posted

技术标签:

【中文标题】Android:何时/为啥我应该使用 FrameLayout 而不是 Fragment?【英文标题】:Android: when / why should I use FrameLayout instead of Fragment?Android:何时/为什么我应该使用 FrameLayout 而不是 Fragment? 【发布时间】:2013-10-27 12:36:51 【问题描述】:

我正在为大屏幕构建一个布局,它应该由 2 个不同的部分组成,一个左侧和一个右侧。为此,我认为使用 2 Fragments 是正确的选择。

然后我看了一下使用 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_
    android:layout_
    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_
        android:layout_
        android:layout_weight="1"
        tools:layout="@android:layout/list_content" />

    <FrameLayout
        android:id="@+id/workstation_detail_container"
        android:layout_
        android:layout_
        android:layout_weight="3" />

</LinearLayout>

我现在的问题是:为什么在详细视图中使用FrameLayout 而不是Fragment 本身?原因或优势是什么?我也应该使用它吗?

【问题讨论】:

【参考方案1】:

详细信息容器是FrameLayout,因为显示的Fragment 将使用FragmentTransactionreplace() 方法替换。

replace() 的第一个参数是要替换 Fragments 的容器的 ID。如果此示例中的 FrameLayout 被替换为 Fragment,则 WorkStationListFragment 和当前显示的任何详细 Fragment 都将被新的 Fragment 替换。通过将 Fragment 封装在 FrameLayout 中,您可以只替换细节。

【讨论】:

这确实有帮助。在我的情况下,我不需要替换片段,所以现在我知道我可以离开 FrameLayout,直接使用 Fragment【参考方案2】:

fragment 标记: 可用于通过 XML 立即加载 Fragment,但不能用 transaction.replace() 方法替换。可以按名称或类属性加载片段。

FrameLayout 标签: 只能通过程序加载片段,片段也可以通过 transaction.replace() 方法替换。可以通过 FragmentTransction 添加/替换片段。

FragmentContainerView 标签: FragmentContainerView 是 FrameLayout 的子视图,也是最推荐加载片段的视图,它支持片段标签的属性:(名称和类),因此可以从 XML 加载片段,但与片段不同标记,片段可以被 transaction.replace() 替换。由于我们知道它是 FrameLayout 的子代,因此支持 FrameLayout 的所有功能,我们可以像在 FrameLayout 的情况下一样添加片段。

另外,FrameLayout 的动画相关问题在 FragmentCotainerView 中得到解决:

之前,尝试自定义进入和退出动画 片段导致了一个问题,其中进入的片段将是 在退出的 Fragment 下方,直到它完全退出屏幕。 这导致了令人不快且错误的动画 在 Fragment 之间转换。

检查这个link。

【讨论】:

以上是关于Android:何时/为啥我应该使用 FrameLayout 而不是 Fragment?的主要内容,如果未能解决你的问题,请参考以下文章

为啥/何时应该使用静态声明变量?

何时/为啥不应该在我的 DataContracts 上使用 IsReference=true?

为啥以及何时应该在块的末尾使用逗号?

为啥我们需要复制构造函数以及何时应该在 java 中使用复制构造函数

我应该何时(而不是如何)在 Android 上测试 UI 组件?

<script> 标签何时应该可见,为啥可以?