我正在开发一个带有导航 View 的 Android 应用程序,我注意到每次我用另一个 fragment 替换一个 fragment 时, fragment 管理器中的 fragment 总数都会增加,直到我的应用程序因以下错误而崩溃:
A/libc: Fatal signal 11 (SIGSEGV), code 1
我注意到这个数字随着登录 onNavigationItemSelected 函数中的一条消息而增加:
Log.d("fragmentNumber:", fragmentManager.getFragments().size() + "");
这是我在用另一个 fragment 替换 fragment 时调用的函数:
public void showFragment(final Fragment fragment) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (fragment != null) {
fragmentTransaction.replace(R.id.container, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
最佳答案
您正在执行 replace()
和 addToBackStack()
。假设您有 fragment 实例 1。您运行代码并将其替换为 fragment 实例 2。 addToBackStack()
调用意味着 fragment 管理器必须保留 fragment 实例 1,因为您可能会按如果按“后退”按钮,则必须撤消替换并重新显示 fragment 1。这将发生在第三个、第四个、第五个 fragment 上,直至内存耗尽。请注意我说的是“实例”。 fragment 是否都是同一类并不重要;当您说 new MyFragment()
时,您正在创建一个新实例。每个实例都会占用越来越多的内存——直到耗尽。
您可能希望导航回某个 fragment (如果该 fragment 已位于返回堆栈中),而不是每次都进行替换。假设您将 DataListFragment
替换为 DataDetailsFragment
。如果用户想要使用导航按钮(而不是“后退”按钮)导航到 DataListFragment
,您可以调用 fragmentManager.popBackStack()
来模拟按下“后退”按钮,然后重新显示 DataListFragment
。
如果您无法简单地跟踪导航,可以使用 addToBackStack(String name)
标记返回堆栈条目,然后使用 FragmentManager.popBackStack (String name, int flags)
返回到该 fragment 状态。
管理 fragment 状态和返回堆栈很棘手。如果我可以向您展示我刚刚编写的用于处理此问题的大量代码,您的眼球可能会弹出(但代码是专有的,所以我不能)。
关于java - 每次我用 fragment 管理器中的另一个 fragment 替换 fragment 时都会增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36240709/