我将部分应用程序从“活动”切换到“碎片”,以便我可以使用整洁的ActionBar选项卡。
然而,在完成转换后,我遇到了一个问题:每当我切换到另一个选项卡时,Fragment都会重新创建。每次进入选项卡时都会调用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) {
}
}
有人可以指出我正确的方向吗?
答案 0 :(得分:47)
当您致电FragmentTransaction.replace(...)时,Android会有效执行一系列FragmentTransaction.remove(...)(针对当前添加到该容器的所有片段)和FragmentTransaction.add(...)(针对您提供的片段)。从FragmentManager
中删除片段将导致片段被破坏,其状态将不再被管理。最值得注意的是,当您重新添加片段时,所有视图都将被重置。注意:由于您正在重用相同的Fragment实例,因此Fragment仍将保留值为任何实例变量。
此问题的一个解决方案是在切换时使用FragmentTransaction.detach(Fragment)和FragmentTransaction.attach(Fragment)。这将导致重新创建Fragment视图(将调用onDestroyView()
& onCreateView()
),但实例状态包将被保存并在调用之间返回给您,因此可以维护视图状态。这是FragmentPagerAdapter尝试在片段之间切换时采用的方法。
或者,您可以允许销毁碎片,但可以独立维护碎片的保存状态。这将使用更少的内存,代价是更慢的切换时间。注意方法是FragmentManager.saveFragmentInstanceState(Fragment)和FragmentManager.setInitialSavedState(Fragment.SavedState),与添加/删除相结合。这是FragmentStatePagerAdapter采取的方法。
您可以查看source for FragmentPagerAdapter和source for FragmentStatePagerAdapter的实施提示。
答案 1 :(得分:7)