Sor*_*ban 41 android android-fragments android-activity android-actionbar
我将我的应用程序的一部分从活动切换到碎片,以便我可以使用整洁的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);
Run Code Online (Sandbox Code Playgroud)
这是我的监听器代码:
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) {
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以指点我正确的方向吗?
ant*_*nyt 48
当您调用FragmentTransaction.replace(...)时,Android将有效地执行一系列FragmentTransaction.remove(...)(对于当前添加到该容器的所有片段)和FragmentTransaction.add(...)(对于您提供的)分段).从遗骸中删除片段FragmentManager会导致片段被破坏,其状态将不再被管理.最值得注意的是,当您重新添加片段时,所有视图都将被重置.注意:由于您正在重用相同的Fragment实例,因此Fragment仍将保留任何实例变量的值.
解决此问题的一种方法是在切换时使用FragmentTransaction.detach(Fragment)和FragmentTransaction.attach(Fragment).这将导致重新创建的片段意见(onDestroyView()&onCreateView()将被调用),但实例状态包将被保存和调用,因此可以保持视图状态之间还给你.这是FragmentPagerAdapter尝试在Fragments之间切换时采用的方法.
或者,您可以允许销毁碎片,但可以独立地保留碎片的保存状态.这将使用更少的内存,代价是更慢的切换时间.注意的方法是FragmentManager.saveFragmentInstanceState(Fragment)和FragmentManager.setInitialSavedState(Fragment.SavedState),与添加/删除相结合.这是FragmentStatePagerAdapter采用的方法.
您可以查看FragmentPagerAdapter的源代码和FragmentStatePagerAdapter的源代码以获取实现提示.
| 归档时间: |
|
| 查看次数: |
32566 次 |
| 最近记录: |