【问题标题】:FragmentManager in RecyclerView adapterRecyclerView 适配器中的 FragmentManager
【发布时间】:2020-05-02 16:35:22
【问题描述】:

我有一个包含 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();
            }
        });

然后它按预期工作,但我想从 recyclerview 做。

有什么办法可以做到吗?

【问题讨论】:

    标签: android android-fragments android-recyclerview fragmentmanager


    【解决方案1】:

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

    【讨论】:

    • 我已经与子片段管理器进行了交易,并在主要活动中覆盖了 onBackPressed。但是我如何将点击监听器带到主机片段?如何从 recyclerview 获取图像 id 到主机片段中?
    • 您可以为点击监听器创建一个接口,然后您应该在片段中设置监听器 onViewCreated 回调。
    • 我这样做了,但现在我不知道如何从适配器获取视图以使用它们(即共享元素)。例如,在单击侦听器中的适配器视图中,我有transaction.addSharedElement(holder.Image,"transition"); 如何将图像从适配器获取到片段?我的片段的 onClick 是从界面覆盖的public void onImageClick(int position) {}
    • 没关系,我明白了。我必须从适配器中的 ViewHolder 传递 ItemView 以及位置。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2018-11-23
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多