RecyclerView适配器中的FragmentManager

问题描述 投票:0回答:1

我有一个活动,其中的viewpager包含2个标签。每个选项卡都是一个具有2个子片段的主机片段。第一个片段是recyclerviews,它使用FragmentTransactions打开其他片段。我在为他们创建不同的堆栈时遇到麻烦。

所以在我的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();
            }
        });

然后按预期方式工作,但我想从recyclerview进行。

有什么办法可以做到?

android android-fragments recycler-adapter fragmentmanager
1个回答
0
投票

您应将项目单击侦听器逻辑放入选项卡的主机片段中。然后,在两个主机片段中,都应使用子片段管理器进行必需的事务。因此,事务被保留在主机片段的后堆栈中。然后,您必须管理这些不同的堆栈,它们是活动的片段堆栈,host1的片段堆栈和host2的片段堆栈。为此,您必须在活动中覆盖onBackPressed,然后询问当前可见的主机片段是否存在事务。如果存在,则应弹出该事务并返回onBackPressed回调。如果没有,则让该活动通过调用super处理事件。

© www.soinside.com 2019 - 2024. All rights reserved.