android - 可以更新 fragment 而不是创建新实例吗?

标签 android android-activity transactions lifecycle fragment

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,onCreateViewonActivityCreated都会在DetailsFragment被添加到容器中时被调用.

但如果您想要返回堆栈,我强烈建议您只创建新实例,否则您只是为 DetailsFragment 的内容实现自己的返回堆栈。

关于android - 可以更新 fragment 而不是创建新实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9061706/

相关文章:

objective-c - 如何使用 sqlite 在 Xcode 中开始、回滚、提交事务

android - Network Changed Broadcast Receiver 在一加手机中不执行

android - 您如何在模拟器或Android测试之外构建和测试Android应用程序的数据层?

java - ksoap2 相当于 didStart/didEndElement?

android - 如何正确地将数据从 recyclerView 获取到设置了 RV 的 Activity?

mysql - 如果发生 MySQL/InnoDB 'lock wait timeout',锁在空闲时是否仍会被授予?

android - 语法错误 : Cannot use import statement outside a module | on android :app:bundleReleaseJsAndAssets

android - 将 fragment 从一个 Activity 加载到另一个已经在后台的 Activity

android - 浏览器 Intent 导致应用程序重新创建 Activity

node.js - 如何处理 firebase 事务 api 上的空值