好的是更新片段而不是创建新实例?

Jul*_* A. 11 lifecycle android transactions fragment android-activity

在Android文档中使用片段的示例中,当应用程序处于"双视图"模式时,只要应用程序需要显示不同标题的详细信息,就会重新创建详细信息片段. FragmentTransaction.replace()用于将每个旧的详细信息片段实例换成​​新的.

这是推荐的做法吗?当真正的意图(没有双关语意图)要更新UI显示的内容而不是UI本身时,创建新的UI实例并不浪费.在我看来,创建新实例的唯一原因是,如果有人打算将它们添加到backstack,那么用户可以回溯步骤.否则,直接更新片段是否安全/可取?

在该示例的情况下,它将意味着一种方法DetailsFragment.setShownIndex().这将被调用,传入新的标题索引,而不是重新创建DetailsFragment.

假设我们有一个示例版本,其中一个活动管理两个片段,但一次只显示一个片段,根据需要交换每个片段.活动是否可以创建每个片段的实例,保留对每个片段的引用,然后根据需要简单地添加或删除这两个实例?

这可能是粘性的一个结果是,当标题片段处于resumed状态(即在"前景"中)时,选择标题将导致在DetailsFragment.setShownIndex()细节片段处于stopped状态时进行调用.

好主意?馊主意?

提前致谢.

Tal*_*tle 5

就像你说的,创建新Fragment实例的主要原因是为了便于使用后端堆栈.这也是绝对安全的重用现有的片段(寻找它使用两种FragmentManager.findFragmentById()FragmentManager.findFragmentByTag()).有时候,你需要好好利用的片段的方法,如isVisible(),isRemoving()等让你不非法引用UI组件时DetailsFragmentstopped.

无论如何,在您建议的带有2个片段的单窗格活动中,您的setShownIndex方法可以设置一个私有字段,DetailsFragment其中加载了onCreateViewonActivityCreated.

例如,

DetailsFragment df = getFragmentManager().findFragmentByTag("details");
if (df != null) {
    df.setShownIndex(getSelectedIndex());
} else {
    df = DetailsFragment.newInstance(getSelectedIndex());
}
fragmentTransaction.replace(R.id.frame, df, "details").commit();
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,DF是否新建或重新使用,onCreateView并且onActivityCreated将被调用时,DetailsFragment被添加到容器中.

但是如果你想要一个后台堆栈,我强烈建议你只创建新实例,否则你只是为了实现自己的内容而实现自己的后台堆栈DetailsFragment.