有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在开发一个带有导航视图的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) 个答案

  1. # 1 楼答案

    你正在做一个replace()和一个addToBackStack()。假设您有片段实例1。运行代码并将其替换为片段实例2。addToBackStack()调用意味着片段管理器必须保留片段实例1,因为您可能会按下后退按钮,它必须撤消替换并重新显示片段1。这将发生在第三、第四、第五个片段上,并且不断发生,直到内存耗尽。注意,我说的是“实例”。片段是否都是同一个类并不重要;当你说new MyFragment()时,你正在创建一个新实例。每个实例都会占用越来越多的内存,直到用完为止

    如果片段已经在后堆栈中,您可能希望导航回该片段,而不是每次都进行替换。假设您将DataListFragment替换为DataDetailsFragment。如果用户希望使用导航按钮(而不是后退按钮)导航到DataListFragment,则可以调用fragmentManager.popBackStack()模拟按下后退按钮并重新显示DataListFragment

    如果您不能简单地跟踪导航,那么可以使用addToBackStack(String name)标记后堆栈条目,然后稍后使用FragmentManager.popBackStack (String name, int flags)返回到该片段状态

    管理片段状态和后堆栈是很棘手的。如果我能向你展示我为处理这个问题而编写的大量代码,你的眼球可能会跳出来(但代码是专有的,所以我不能)