我的应用有一个MainActivity
,其中有三个标签(A
,B
,C
)。
标签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:
也许最好的解决方案是完全不同的方法?
答案 0 :(得分:2)
我应该保留对MainActivity中所有片段的引用,还是应该 每次我需要它们时都要新建它们吗?
这取决于...... 我能想到的唯一两个原因是表现并保持片段的状态。
如果你总是创建一个新的片段,GC将有很多工作要做,如果你使用大量的位图或大量的数据,这可能会导致一些性能问题。您可以通过在活动中保留对片段的引用或使用方法FragmentManager.findFragmentByTag(String)或FragmentManager.findFragmentById(int)获取片段或ID来重用片段。使用它们,您可以重用已创建的片段,默认情况下应该这样做。
此外,如果您的片段包含某些数据,您将丢失它们,或者将其缓存到其他位置,以便在片段被销毁时重新创建它。在重用Fragment时,您可以使用onSavedInstanceState()重新创建状态。
因此,是的,您应该重用Fragment,因为它可能会导致系统性能或使用反模式来保存一些数据。