我在我的应用程序中有一个架构问题。我使用了一个带有导航抽屉和多个片段的活动。现在,假设我有两个片段A和B。导航结构如下:
A
A
A1
A2
B
B1
B2
A1、A2是A fragment类型,B1、B2是B fragment类型。同一类型的fragment(如A1、A2)之间唯一的区别在于数据。
我的第一种方法:
当用户点击A1、A2、B1或B2时,我只需创建该类型的一个新实例并替换fragment即可。
Fragment fragment =A.newInstance();
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment).commit();
mDrawerLayout.closeDrawer(rlDrawer);
}
注意:我不想将它们添加到返回堆栈中。
后来我意识到这种方法是低效的,因为每次都会创建一个新的实例,即使它们是相同类型的。就像我之前说的,区别只在于数据。所以,我采用了下一种方法。
第二种方法:
现在我的活动拥有Fragment A和B的数据成员(引用)。现在我将检查它是否为空,如果为空则创建一个新实例,否则只需更改数据:
if (A == null) {
a = A.newInstance();
} else {
((A) a).changeData();
}
replaceFragment(a);
这种方法的问题在于,当我从片段 A1 切换到 B1 时,A1 片段被销毁,但其引用仍留在活动中。现在,当我从 B1 切换回 A1 时,它不会创建一个新实例,如上面的代码所示,但同时 onCreate() 方法会在 Fragment A 上调用。
在 Fragment 的 onDestroy() 被调用时,我应该立即从活动中删除引用吗?
我的第二个方法正确吗?
有更好的方法吗?
先谢谢了。