在后栈中添加同一片段的多个实例,之前添加的实例的数据仍然存在

时间:2017-04-14 10:45:19

标签: android android-fragments android-listfragment fragmentmanager

我有一个常见的列表片段,我将其重复用于对不同的列表进行充气。

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

考虑使用相同的列表片段,我有两个列表产品销售

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

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

考虑以下情况,

  1. 如果我选择“产品”选项,然后选择“销售”选项,请单独选 创建列表片段的实例,当前是Sales 列表将可见。产品列表将位于后台。

  2. 此外,如果我选择产品选项,则产品列表将是 从堆栈中弹出。但它包含与销售相关的数据 列表(以某种方式列表片段中与B相关的参数 仍然存在)。

  3. 我在对片段进行充气时使用产品和销售列表片段的唯一标签。

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

    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 个答案:

答案 0 :(得分:1)

我终于能够发现问题所在。我的结局是一个小错误。

我使用静态变量将片段实例保存在List Fragment中。所以下面的情况发生了。

1)创建产品清单。

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

2)创建销售清单。

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

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

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

我刚删除静态变量并将其替换为普通变量,问题就解决了。