我正在使用导航视图开发一个Android应用程序,我注意到每次用另一个片段替换片段时,我的片段管理器中的片段总数会增加,直到我的应用程序因此错误而崩溃:
A/libc: Fatal signal 11 (SIGSEGV), code 1
我注意到我的登录onNavigationItemSelected函数中的数字增加了数字:
Log.d("fragmentNumber:", fragmentManager.getFragments().size() + "");
这是我用另一个片段替换片段时调用的函数:
public void showFragment(final Fragment fragment) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (fragment != null) {
fragmentTransaction.replace(R.id.container, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
答案 0 :(得分:3)
您正在执行replace()
和addToBackStack()
。所以,让我们说你有片段实例1.你运行代码并用片段实例2替换它。addToBackStack()
调用意味着片段管理器必须保持片段实例1,因为你可能会按下返回按钮,它必须撤消替换并重新显示片段1.这将发生在第三个,第四个,第五个片段以及开启和关闭之前,直到内存不足为止。请注意我说"实例"。这些片段是否属于同一类并不重要;当您说new MyFragment()
时,您正在创建新实例。每个实例都会占用越来越多的内存 - 直到你用完为止。
如果它已经在后台堆栈上,您可能希望导航回到片段,而不是每次都替换。我们假设您将DataListFragment
替换为DataDetailsFragment
。如果用户想要使用导航按钮(而不是“后退”按钮)导航到DataListFragment
,则可以调用fragmentManager.popBackStack()
来模拟按“返回”按钮并重新显示DataListFragment
。
如果您无法简单地跟踪导航,则可以使用addToBackStack(String name)
标记后台条目,然后使用FragmentManager.popBackStack (String name, int flags)
返回到该片段状态。
管理片段状态和后台堆栈很棘手。如果我能告诉你我刚刚编写的大量代码来处理这个问题,那么你的眼球可能会流行(但代码是专有的,所以我不能)。