多次调用OnCreateView /使用ActionBar和Fragments

我将我的应用程序的一部分从活动切换到碎片,以便我可以使用整洁的ActionBar选项卡。

但是,在完成转换之后,我遇到了一个问题:每当切换到另一个选项卡时,都会重新创buildFragment。 onCreate和onCreateView每次到达一个选项卡都会被调用。

我有4个选项卡,每个选项卡打开其中一个片段:

Fragment ShopFragment = new WebActivity(); Fragment SearchFragment = new SearchActivity(context); Fragment StoreFragment = new StoreLocatorActivity(context, this); Fragment BlogsFragment = new BlogsActivity(context, this); 

这是我的听众代码:

  class MyTabsListener implements ActionBar.TabListener { public Fragment fragment; public MyTabsListener(Fragment fragment) { this.fragment = fragment; } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { ft.hide(fragment); } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { ft.replace(R.id.fragment_container, fragment); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } } 

有人能指点我的方向吗?

当你调用FragmentTransaction.replace(…)时 ,Android将有效地执行一系列FragmentTransaction.remove(…) (对于当前添加到该容器的所有碎片)和FragmentTransaction.add(…)分段)。 从FragmentManager移除一个片段会导致片段被破坏,其状态将不再被pipe理。 最明显的是,当你重新添加片段时,所有的视图都将被重置。 注意:因为您正在重复使用同一个Fragment实例,所以Fragment仍然会保留任何实例variables的值。

解决这个问题的一个办法是在切换时使用FragmentTransaction.detach(Fragment)和FragmentTransaction.attach(Fragment) 。 这将导致重新创build片段视图onCreateView()将调用onDestroyView()onCreateView() ),但实例状态包将被保存并在调用之间返回给您,因此可以保持视图状态。 这是FragmentPagerAdapter在尝试在碎片之间切换时采用的方法。

或者,你可以允许碎片被销毁,但是独立地维护它们的保存状态。 这将使用更less的内存,但以较慢的切换时间为代价。 要注意的方法是FragmentManager.saveFragmentInstanceState(Fragment)和FragmentManager.setInitialSavedState(Fragment.SavedState) ,加上/去掉。 这是FragmentStatePagerAdapter采取的方法。

您可以查看FragmentPagerAdapter的源 代码和FragmentStatePagerAdapter的源代码以获取实现提示。

有显示 / 隐藏选项,所以片段不需要重新绘制/重新创build, onCreate()onCreateView()将不会被重新调用。