java - 每次我用 fragment 管理器中的另一个 fragment 替换 fragment 时都会增加

标签 java android android-fragments

我正在开发一个带有导航 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/

相关文章:

java - Netbeans 中 javax.swing.JInternalFrame 和 JInternalFrame 有什么区别

android - 使用 setDefaultUncaughtExceptionHandler (reportDropResult) 捕获未处理的异常时线程卡住

安卓远程设备管理

android - SQLite 数据库结合 fragment

java - 使用应用程序图标作为向上按钮从 ActionBarActivity 返回 Fragment?

java - 使用 Java 中的文本文件查找数字的平均值

java - 在我的 war 文件的 ant 构建中包含没有扩展名的文件

java - 使用 Roslyn 从 C# 分析到 Java 分析

android - 我们可以在android VideoView中播放.swf文件吗?

android - 我如何在我的抽屉导航项目选择中用 Intent 替换 fragment