在back-stack中添加同一个fragment的多个实例,之前添加的实例的数据仍然存在

Posted

技术标签:

【中文标题】在back-stack中添加同一个fragment的多个实例,之前添加的实例的数据仍然存在【英文标题】:Adding Multiple instance of the same fragment in back-stack, data of previous added instance persists 【发布时间】:2017-09-10 14:54:40 【问题描述】:

我有一个常见的 List Fragment,我将其用于扩充不同的列表。

我按照@DevrimTuncer 到this Question 提供的答案来实现它。

假设我有两个列表 ProductSales 使用相同的列表片段进行膨胀。

如果我从导航抽屉中选择产品,则会加载一个新的列表片段,其中包含与 产品 相关的数据。

同样,如果我单击销售选项,则会创建一个与销售相关的新实例。

考虑以下场景,

    如果我选择产品选项,然后选择销售选项,请分开 列表片段的实例已创建,当前,Sales 列表将可见。产品列表将在后台堆栈中。

    此外,如果我选择产品选项,产品列表将为 从堆栈中弹出。但它包含与销售相关的数据 列表(不知何故列表片段中与 B 相关的参数 仍然存在)。

我对产品和销售列表片段使用唯一标签,同时膨胀片段。

下面是我用来给片段充气的方法。

private void openListFragment(Bundle arguments, String listName)

    boolean fragmentPopped = mFragmentManager.popBackStackImmediate (listName, 0);

    if(!fragmentPopped && mFragmentManager.findFragmentByTag(listName) == null)
    
        mFragmentManager
                .beginTransaction()
                .replace(R.id.list_container, ListFragment.newInstance(arguments))
                .addToBackStack(listName)
                .commit();
    

listName 参数对于 A 和 B 是唯一的。

我有点坚持。

【问题讨论】:

【参考方案1】:

我终于能够确定问题所在。这是我的一个小错误。

我使用静态变量将片段实例保存在列表片段中。于是发生了下面的场景。

1) 创建产品列表。

创建列表片段的新实例并创建指向内存的静态变量。

2) 创建销售清单。

创建了列表片段的新实例,但静态变量被重新使用,因为它是静态的并被分配了一个新值。

3) 从后台弹出产品列表。

静态变量仍保存先前的值,并在其中存储了销售片段实例。因此弹出的片段显示了错误的列表。

我只是把静态变量去掉,换成普通变量,问题就解决了。

【讨论】:

以上是关于在back-stack中添加同一个fragment的多个实例,之前添加的实例的数据仍然存在的主要内容,如果未能解决你的问题,请参考以下文章

Fragment中添加menu

Fragment中的ViewPager的Fragment添加子Fragment要放在onAttach中添加

Android Fragment的使用

如何在 Activity 的 Fragment 中添加按钮或 textView

在 Fragment 中添加 onOptionsItemSelected 调用

如何在 Android 中将选项菜单添加到 Fragment