【问题标题】:What is the difference between Fragment and FragmentActivity?Fragment 和 FragmentActivity 有什么区别?
【发布时间】:2012-05-23 11:14:35
【问题描述】:

我的问题是除了明显的继承差异之外,FragmentFragmentActivity 之间的主要区别是什么?每个类最适合哪些场景?我试图了解为什么这两个类都存在......

【问题讨论】:

    标签: android android-fragments android-fragmentactivity


    【解决方案1】:

    FragmentActivity 的一部分,它具有:

    • 它自己的生命周期
    • 接收自己的输入事件
    • 可以在Activity 运行时添加或删除。

    Fragment 必须始终嵌入在 Activity 中。

    Fragments 不是 HoneyComb (3.0) 之前的 API 的一部分。如果您想在针对 HoneyComb 之前的平台版本的应用程序中使用Fragments,您需要将Support Package 添加到您的项目中,并使用FragmentActivity 来保存您的FragmentsFragmentActivity 类具有处理Fragments 的 API,而 HoneyComb 之前的 Activity 类没有。

    如果您的项目仅针对 HoneyComb 或更新版本,您应该使用 Activity 而不是 FragmentActivity 来保存您的 Fragments

    一些细节:

    android.app.FragmentActivity 一起使用。将android.support.v4.app.FragmentFragmentActivity 一起使用。不要将支持包Fragment 添加到Activity,因为它会导致抛出异常。

    需要注意的一点:FragmentManagerLoaderManager 对 FragmentActivity 有单独的支持版本:

    如果您在Activity(HoneyComb 及以上)中使用Fragment,请致电

    • getFragmentManager() 获取android.app.FragmentManager
    • getLoaderManager() 获取android.app.LoaderManager

    如果您在 FragmentActivity(HoneyComb 之前)中使用 Fragment,请致电:

    • getSupportFragmentManager() 获取android.support.v4.app.FragmentManager
    • getSupportLoaderManager() 获取android.support.v4.app.LoaderManager

    所以,不要

    //don't do this
    myFragmentActivity.getLoaderManager(); 
    //instead do this:
    myFragmentActivity.getSupportLoaderManager();
    

    //don't do this:
    android.app.FragmentManager fm = myFragmentActivity.getSupportFragmentManager();
    //instead do this:
    android.support.v4.app.FragmentManager fm = myFragmentActivity.getSupportFragmentManager()
    

    另一个有用的信息是,虽然片段必须嵌入到 Activity 中,但它不必是 Activity 布局的一部分。它可以用作 Activity 的隐形工作者,没有自己的 UI。

    【讨论】:

    • 但是,片段不需要成为活动布局的一部分;您也可以使用没有自己 UI 的片段作为 Activity 的隐形工作者。
    • @uzay95 感谢您指出这一点。我在末尾添加了一个部分来提及它。
    • @GunnarKarlsson 我们可以在 fragmentActivity 中添加片段吗?
    • @Dhasneem 如果您希望您的应用在低于 3.0 的 Android 版本上运行,您可以将 Fragment 添加到 FragmentActivity。否则,您将 Fragment 添加到 Activity。
    • 谢谢!这解决了我的问题!现在我知道为什么我的应用程序(用 Activity 编写)在添加 Facebook 登录按钮后总是在 onCreate 崩溃(他们在他们的示例中使用 android.support.v4.app.Fragment)。当然,崩溃还有其他原因。但你的答案是把它们放在一起的最后一块。
    【解决方案2】:

    FragmentActivity 是我们的经典 Activity,支持片段,仅此而已。因此需要 FragmentActivity,当 Fragment 将附加到 Activity 时。

    Fragment 是一个很好的组件,它复制了 Activity 的基本行为,仍然不是像 Activity 那样的独立应用程序组件,需要附加到 Activity 才能工作。

    查看here了解更多详情

    【讨论】:

    • 顺便说一句,过时的答案,仅适用于希望在 API 11 之前的设备上运行的应用程序。
    • @ToolmakerSteve 你能提供更多细节吗?如果可能,您可以使用最新版本编辑答案吗?
    【解决方案3】:

    将 FragmentActivity 视为可以支持 Fragment 的常规 Activity 类。在honeycomb 之前,活动类不能直接支持Fragment,因此在使用Fragment 的活动中需要这样做。

    如果您的目标分布是 Honeycomb 及以上,您可以改为扩展 Activity。

    片段也被视为“子活动”。它不能没有活动而存在。始终将片段视为子活动,您应该做得很好。因此,活动将是父级,片段是子级的象征关系。

    【讨论】:

      【解决方案4】:

      FragmentActivity 是一个包含 Fragment 的临时活动。 在这几句话中,我向您解释了在 android 3.0(HoneyComb) 中,android 团队在 android sdk 中插入的主要重要变化之一。

      有了这些新概念,您的代码和布局将变得更加灵活和可维护。如果你在谷歌上搜索有很多例子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2012-10-23
        • 2010-10-02
        • 2011-12-12
        相关资源
        最近更新 更多