我是否应该保留对活动中片段的引用

A2i*_*2i_ 6 android reference android-fragments android-activity

我的应用程序有一个MainActivity带有三个选项卡(ABC)。

标签A显示FragmentA1。当我单击此片段中的列表条目时,FragmentA2将显示它(仍在tab中A)。其他选项卡也是如此,某些层次甚至更深(FragmentC4)。

所有片段的所有切换和替换MainActivity都由侦听器处理。(编辑:我不在XML布局中定义片段,而仅在代码中定义)。

我的问题是:

我应该保留对所有片段的引用,MainActivity还是应该在需要时创建新片段?

有哪些(缺点)优势?我是否可以使用替代方法1重用片段,而不是每次都重新创建它们?

选择1:

class MainActivity

  private Fragment fgmtA1;
  private Fragment fgmtA2;
  private Fragment fgmtA3;
  ...
  public onClickItemInA1(int itemId) {
    fgmtA2 = new FragmentA2();
    // put args
    // replace
  }

...
}
Run Code Online (Sandbox Code Playgroud)

选择2:

class MainActivity
...
  public onClickItemInA1(int itemId) {
    FragmentA2 fgmtA2 = new FragmentA2();
    // put args
    // replace
  }  
...
}
Run Code Online (Sandbox Code Playgroud)

选择3:

也许最好的解决方案是完全不同的方法?

Ste*_*ett 2

我应该保留对 MainActivity 中所有片段的引用,还是应该在每次需要时创建它们?

这取决于...我能想到的唯一两个原因是性能和保持片段的状态。

如果你总是创建一个新的 Fragment,GC 将有很多工作要做,如果你使用大量位图或大量数据,这可能会导致一些性能问题。您可以通过在 Activity 中保留对 Fragment 的引用或使用FragmentManager.findFragmentByTag(String)FragmentManager.findFragmentById(int)方法通过标签或 id 获取 Fragment 来重用 Fragment 。有了它们,您可以重用已经创建的片段,这应该是默认完成的。

此外,如果您的片段保存了一些数据,您将丢失它们,或者将其缓存在其他地方以便在片段被破坏时重新创建它。重用 Fragment 时,您可以使用 onSavedInstanceState() 重新创建状态。

因此,是的,您应该重用片段,因为它可能会导致系统性能或使用反模式来保存一些数据而令人头疼。