【问题标题】:What's the ideal way to manage multiple Fragments in a single Activity?在单个 Activity 中管理多个 Fragment 的理想方式是什么?
【发布时间】:2015-10-10 19:38:58
【问题描述】:

我有一个 Activity,比如说 MainActivity。 在 MainActivity 的 onCreate 中,我正在加载 FragmentOne。 FragmentOne 有一个ListView,在单击一个项目时,它会在MainActivity 中加载FragmentTwo。 现在我的问题是,当MainActivity 正在显示FragmentTwo 并且如果onCreateMainActivity 被调用,比如在方向改变等之后MainActivity 再次加载FragmentOne。 同一流程中的另一个问题是OptionsMenu,每次创建片段时,都会多次附加菜单。现在我已经维护了一个标志并得到了savedInstance 的帮助。有没有其他办法?

请注意,我正在开发 sdk,因此我希望 Activity 中的代码量最少

提前致谢。

【问题讨论】:

  • @SaketMittal 我之前已经经历过,那个问题是关于 Fragment 之间的通信,我的问题更可能是关于处理 Activity-Fragment 生命周期。

标签: java android android-fragments


【解决方案1】:

我为单个活动中的多个片段创建了演示。 MultiFragment

它很容易使用,您必须在getContentId 中传递要放置片段的布局ID。

现在,当您想在 Activity 或 Fragment 中加载片段时,只需调用 loadFragmentloadFragmentForResult

【讨论】:

    【解决方案2】:

    检查 Fragment.setRetainInstance(boolean) :

    public void setRetainInstance(布尔保留)

    控制是否在 Activity 重新创建期间保留片段实例
    (例如来自配置更改)。这只能与不在后台堆栈中的片段一起使用。如果设置,片段生命周期将略有不同>重新创建活动时:

    onDestroy() 不会被调用(但 onDetach() 仍然会被调用,因为 >fragment 正在与其当前活动分离)。 onCreate(Bundle) 不会被调用,因为片段没有被重新创建。 onAttach(Activity) 和 onActivityCreated(Bundle) 仍然会被调用。

    【讨论】:

    • 没有帮助,发帖前试过了。我在两个片段中都有这个:@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); Log.d("Fragments", "onCreate of FragmentTwo"); } 日志有点像这样:D/Fragments﹕ onCreate of MainActivity D/Fragments﹕ onCreate of FragmentOne D/Fragments﹕ onCreate of FragmentTwo 旋转屏幕后D/Fragments﹕ onCreate of MainActivity D/Fragments﹕ onCreate of FragmentOne
    • @SwapnilBhoite 无论如何,为什么您的活动不应该重新加载片段? You could check the doc about runtime change