我正在为android实现标准导航抽屉模式,用户可以从抽屉导航到大约10个片段。目前,每次点击不同的导航抽屉项目时,我都会创建一个新的片段:
// When a new navigation item at index is clicked
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
Fragment newFragment = null;
if (index == 0)
fragment = new Fragment0();
...
ft.replace(R.id.container, newFragment);
ft.commit();
我一直想知道做以下事情是否更有效率:
// Somewhere in onCreate
Fragment[] fragments = new Fragment[n];
fragments[0] = new Fragment0();
fragments[1] = new Fragment1();
...
// When a new navigation item (at index) is clicked
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.replace(R.id.container, fragments[index]);
ft.commit();
我主要担心的是一些片段拥有大量数据(相当大的列表和大量视图)。是否存在将所有这些片段保存在内存中的任何问题,并且它是否会提供每次实例化新片段的任何优势(除了片段之间的更快切换)?是否有普遍接受的“更好”的解决方案?
答案 0 :(得分:5)
我有类似的问题。我采用了类似于你的方法,为了节省处理器的负担,我对每次调用做了以下调整,为Fragment对象创建一个实例: (在我在selectItem方法中使用的上下文中)
switch (position) {
case 0:
if (fragmentOne == null)
fragmentOne = new FragmentOne();
getSupportFragmentManager().beginTransaction().......
break;
case 1:
if (fragmentTwo == null)
fragmentTwo = new FragmentTwo();
getSupportFragmentManager()......
FragmentOne和FragmentTwo是两个不同的Fragment类,fragmentOne和fragmentTwo是它们在MainActivity中声明为字段的对象
修改强>:
我想补充说明如何使用包含片段的数组的类似方法。而不是在onCreate中创建新片段,而是在单击项目时执行此操作。在onCreate中,向抽屉发送一个调用,以选择在启动时默认选择的片段。
//somewhere in onCreate
if (savedInstanceState == null) {
selectItem(defaultFragment);
}
else
selectItem(selectedFragment);
//selectItem is method called by DrawerItemClickListener as well
//in selectItem: when navigation item at index is clicked, the listener calls this
switch (index) {
case 0:
if (fragments == null) {
fragments = new Fragment[n];
fragment[0] = new Fragment0();
}
else if (fragments[0] == null) {
fragments[0] = new Fragment0();
}
break;
....
}
FragmentTransaction ft = fragmentManager.beginTransaction();
...
ft.replace(R.id.container, fragments[index]);
ft.commit();
无需在onCreate上实例化片段,因为这会使启动变慢。在需要时创建它们,然后使用相同的一个(如果存在)。只有在第一次加载新片段时才会创建新片段。