在example关于在 Android 文档中使用 fragment ,当应用程序处于“双 View ”模式时,只要应用程序需要显示不同标题的详细信息,就会重新创建详细信息 fragment 。 FragmentTransaction.replace()
用于将每个旧的详细信息 fragment 实例替换为新的。
这是推荐的做法吗?当真正的 Intent (没有双关语意)是更新 UI 显示的内容而不是 UI 本身时,创建一个新的 UI 实例不是很浪费吗?在我看来,创建新实例的唯一原因是,如果有人打算将它们添加到后台堆栈,以便用户可以回溯步骤。否则,直接更新 fragment 是否安全/可取?
在示例的情况下,这意味着一个类似于 DetailsFragment.setShownIndex()
的方法。这将被调用,传递新的标题索引,而不是重新创建 DetailsFragment
。
假设我们有一个示例版本,其中一个 Activity 管理两个 fragment ,但一次只显示一个,根据需要交换每个 fragment 。 Activity 是否可以为每个 fragment 创建一个实例,保留对每个 fragment 的引用,然后根据需要简单地从自身添加或删除这两个实例?
一个可能的后果是,当标题 fragment 处于 resumed
状态(即在“前景”中)时,选择标题将导致调用 DetailsFragment .setShownIndex()
在详细信息 fragment 处于 stopped
状态时。
好主意?坏主意?
提前致谢。
最佳答案
如您所说,创建新 Fragment 实例的主要原因是为了便于使用返回堆栈。重用现有 fragment 也是完全安全的(使用 FragmentManager.findFragmentById()
或 FragmentManager.findFragmentByTag()
查找)。有时您需要充分利用 fragment 方法,如 isVisible()
、isRemoving()
等,这样您就不会在 时非法引用 UI 组件>DetailsFragment
已停止
。
无论如何,在您提出的具有 2 个 fragment 的单 Pane Activity 中,您的 setShownIndex
方法可以在 DetailsFragment
中设置一个私有(private)字段,该字段在 onCreateView
中加载> 或 onActivityCreated
。
例如,
DetailsFragment df = getFragmentManager().findFragmentByTag("details");
if (df != null) {
df.setShownIndex(getSelectedIndex());
} else {
df = DetailsFragment.newInstance(getSelectedIndex());
}
fragmentTransaction.replace(R.id.frame, df, "details").commit();
在这两种情况下,无论是新建还是重用df,onCreateView
和onActivityCreated
都会在DetailsFragment
被添加到容器中时被调用.
但如果您想要返回堆栈,我强烈建议您只创建新实例,否则您只是为 DetailsFragment
的内容实现自己的返回堆栈。
关于android - 可以更新 fragment 而不是创建新实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9061706/