Android:每次点击导航抽屉项目时创build一个新的片段,或者加载之前创build的片段,会更好吗?

我正在实现android的标准导航抽屉模式,用户可以从抽屉导航到大约10个片段。 目前,每当单击不同的导航抽屉项目时,我都会创build一个新的Fragment:

// 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(); 

我主要担心的是,一些片段存有大量的数据(相当大的列表和大量的视图)。 会不会有任何问题在内存中保留所有这些片段,并且是否会比每次实例化新的片段(除了片段之间的更快切换)提供任何优势? 有一个普遍接受的“更好的”解决scheme吗?

Solutions Collecting From Web of "Android:每次点击导航抽屉项目时创build一个新的片段,或者加载之前创build的片段,会更好吗?"

我有一个类似的问题。 我采取了一种类似于你的方法,为了节省处理器上的负载,我对每一个调用创build一个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是两个不同的片段类,fragmentOne和fragmentTwo是它们在MainActivity中声明为字段的对象

编辑

我想补充一下如何在数组中持有这些片段的方法。 不要在onCreate中创build新的片段,而是在单击某个项目时执行此操作。 在onCreate中,发送呼叫到抽屉select默认情况下在启动时select的片段。

 //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上实例化片段,因为这会使启动变慢。 在需要时创build它们,之后使用同一个(如果存在)。 新片段只有在第一次加载时才会创build。