【问题标题】:Why are always newInstance or object of fragments为什么总是 newInstance 或片段的对象
【发布时间】:2016-07-31 16:42:26
【问题描述】:

如果我们知道已经存在实例,为什么我们总是使用 A.newInstance() 或 A() 实例化片段的新对象。它不会增加 Android 中应用的内存使用量吗?

在我的情况下,我有一个活动和多个片段,这些片段由抽屉片段中的菜单打开。这些片段还可能会打开抽屉菜单中未列出的其他片段。所以我想知道每次通过顶部片段创建二级片段的新实例是否正常。顶级片段也是如此。我的流程解释如下:

  1. 片段 A(第一次新实例)
  2. 片段 B(较低级别的片段/新实例,由 A 实例化)
  3. 返回 A(按向上箭头)
  4. 片段 B(较低级别的片段/再次新实例,由 A 实例化)
  5. 返回 A(按向上箭头)
  6. 片段 X(新实例首次/顶级片段/来自抽屉菜单)
  7. 片段 A(A 的新实例/顶级片段/来自抽屉菜单)

片段 A(顶层/第 7 点)和 B(下层/第 4 点)的多个实例是否正确?当我使用这个策略时?

【问题讨论】:

    标签: java android fragment instance back-stack


    【解决方案1】:

    您不应该在每次“在页面之间切换”时实例化新片段

    您应该在需要时将它们add 使用标签(可选字符串参数)放入 FragmentManager,然后使用该标签 (findFragmentByTag) 和 replace 当前显示的 Fragment 找到它们,如果您能找到另一个.否则,您可以实例化一个新的。

    我认为,您还需要将 Fragments 放在后堆栈 (addToBackStack) 上,因此它们由 FragmentManager 保存

    【讨论】:

    • 这里可能有一些额外的细节。 stackoverflow.com/questions/20825600/…
    • 我正在使用add(),因为当当前片段从Backstack中弹出时,我不想调用前一个片段的onCreateView()方法。但根据您的回复,我认为我需要同时维护 add()replace() 以避免不必要地创建新实例。也没有维护这些东西的例子。每个示例都在演示新的实例实现。
    • 在某些时候您需要初始化一个实例,但您应该能够在稍后使用唯一标签检索该实例,正如我解释的那样
    • 是的,我通过将fragment.toString() 作为第三个参数来使用标签。还有一个问题,检索到的实例能否获得Bundle 中提供的新值并显示正确的数据?
    • 不太确定那个。在findFragmentByTag 返回非空片段后,您始终可以尝试使用一些数据setArguments
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多