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

时间:2014-06-13 14:20:55

标签: android android-fragments reference android-activity

我的应用有一个MainActivity,其中有三个标签(ABC)。

标签A显示FragmentA1。当我单击此片段中的列表条目时,会显示FragmentA2(仍在选项卡A中)。这同样适用于其他选项卡,某些层次结构更深入(FragmentC4)。

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

我的问题是:

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

(dis)优势是什么?我可以使用Alternative 1重用片段,而不是每次都重新创建它们吗?

备选方案1:

class MainActivity

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

...
}

备选方案2:

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

备选方案3:

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

1 个答案:

答案 0 :(得分:2)

  

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

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

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

此外,如果您的片段包含某些数据,您将丢失它们,或者将其缓存到其他位置,以便在片段被销毁时重新创建它。在重用Fragment时,您可以使用onSavedInstanceState()重新创建状态。

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