每次我用fragmentManager中的另一个片段替换片段都会增加

时间:2016-03-26 20:48:46

标签: java android android-fragments

我正在使用导航视图开发一个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();
        }
    }

1 个答案:

答案 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)返回到该片段状态。

管理片段状态和后台堆栈很棘手。如果我能告诉你我刚刚编写的大量代码来处理这个问题,那么你的眼球可能会流行(但代码是专有的,所以我不能)。