首页 > 解决方案 > RecyclerView 适配器中的 FragmentManager

问题描述

我有一个包含 2 个选项卡的 viewpager 的活动。每个选项卡都是一个包含 2 个子片段的主机片段。第一个片段是使用 FragmentTransactions 打开其他片段的回收视图。我在为他们创建不同的 backstack 时遇到了麻烦。

所以在我的 onBindViewHolder 的 recyclerview 适配器中,我有这样的 onclicklistener:

        holder.image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirstFragment fragment1 = new FirstFragment();
                SecondFragment fragment2 = new SecondFragment();
                FragmentManager fm = ((FragmentActivity) view.getContext()).getSupportFragmentManager();
                FragmentTransaction transaction = fm.beginTransaction();

                transaction
                        .replace(R.id.frame_container, fragment2,"Tag")
                        .addToBackStack(null)
                        .commit();
            }
        });

如果我从 recyclerview 进行这样的事务,两个选项卡的后台堆栈是相同的,所以如果我在 tab1 上打开第二个片段,然后在 tab2 上打开,如果我返回 tab1 并按回,tab2 上的第二个片段被弹出欧陆。

如果我在 recyclerview 之外的 FirstFragment 中创建一个按钮,并像这样从 FirstFragment 进行片段事务:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.replace(R.id.frame_container, SecondFragment.newInstance(), "Tag");
                ft.addToBackStack(null);
                ft.commit();
            }
        });

然后它按预期工作,但我想从回收站视图中完成。

有什么办法可以做到这一点?

标签: androidandroid-fragmentsandroid-recyclerviewfragmentmanager

解决方案


您应该将您的项目单击侦听器逻辑携带到选项卡的主机片段中。然后在您的两个主机片段中,您应该使用子片段管理器进行所需的事务。因此,事务被保存在主机碎片的后台堆栈中。然后你必须管理这些不同的堆栈,它们是活动的片段堆栈、主机 1 的片段堆栈和主机 2 的片段堆栈。为此,您必须在活动中覆盖 onBackPressed,然后询问当前可见的主机片段是否有事务。如果有,您应该弹出该事务并在 onBackPressed 回调中返回。如果没有让活动通过调用超级来处理事件。


推荐阅读