在我的Android应用程序中,我有片段,其中一个非常重(它从网上加载很多东西),而另一个很轻(如设置面板)。
我用这样的东西在片段之间切换:
private Fragment myFragment1;
private Fragment myFragment2;
......
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.main_fragment, myFragment2);
ft.commit();
我的问题是,当它被替换时,它会进入片段的onStop()和onDestroy()。 因为我没有释放onDestroy()中的重物,所以我的内存泄漏很大......
我想将所有片段保留在内存中,并且只在屏幕上显示/隐藏它们。 这样可以在屏幕上快速切换,而不必每次都加载所有内容。
所以,问题是: 如何更改代码以将所有碎片保留在内存中? 我想像儿子一样:
Fragment1.onPause();
Fragment2.onResume();
而不是:
Fragment1.onPause();
Fragment1.onStop();
Fragment1.onDestroy();
Fragment2.onCreate();
Fragment2.onResume();
还有一件事,我在android 2.2及更多版本上使用android.support.v4.app.Fragment。
非常感谢!
编辑1:
我找到了一些帮助,我做了这个功能:
private void changeFragement(Fragment f, String fragmentTag) {
try {
if (f != null && fragmentTag != null) {
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
Fragment currentFragment = fm.findFragmentById(R.id.main_fragment);
if (currentFragment != null)
ft.hide(currentFragment);
Fragment cachedFragment = fm.findFragmentByTag(fragmentTag);
if (cachedFragment == null)
ft.add(R.id.main_fragment, f, fragmentTag);
else
ft.show(f);
/*Fragment cachedFragment = fm.findFragmentByTag(fragmentTag);
if (cachedFragment == null)
cachedFragment = f;
ft.replace(R.id.main_fragment, cachedFragment, fragmentTag);*/
ft.addToBackStack(null);
ft.commit();
}
} catch (IllegalStateException err) {
}
}
问题是片段没有很好地替换,我不明白“ft.addToBackStack(null);”... 你能帮我纠正一下这段代码吗?
答案 0 :(得分:1)
你做不到。 Android处理活动,服务等的生命周期......包括Fragments。 你需要重新考虑你这样做。
我知道文档中有“背景”片段。也许你可以在那个中加载并与你显示/隐藏的其他片段共享一些状态?