android - 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();
}
});
然后它按预期工作,但我想从回收站视图中完成。
有什么办法可以做到这一点?
解决方案
您应该将您的项目单击侦听器逻辑携带到选项卡的主机片段中。然后在您的两个主机片段中,您应该使用子片段管理器进行所需的事务。因此,事务被保存在主机碎片的后台堆栈中。然后你必须管理这些不同的堆栈,它们是活动的片段堆栈、主机 1 的片段堆栈和主机 2 的片段堆栈。为此,您必须在活动中覆盖 onBackPressed,然后询问当前可见的主机片段是否有事务。如果有,您应该弹出该事务并在 onBackPressed 回调中返回。如果没有让活动通过调用超级来处理事件。
推荐阅读
- linux - 用 shell 脚本中的随机数替换 XML 属性值
- reactjs - React Native:重新渲染太多。React 限制渲染次数以防止无限循环
- c# - 如何在循环的每次迭代后将值传递给单独的变量,或传递给数组以供后续在循环中使用/使用?
- spring - 使用 JDBC 的 Spring Integration 消息传递应用程序
- python - 如何禁用 QWizard 所有页面的后退按钮?
- django - 如何创建表单控制部分?
- amazon-dynamodb - (DynamoDB 集合)集合查询是否需要 sortKey?
- django - 刷新页面时如何限制选择的选项(依赖选择)?
- reactjs - 在 React js 中调度异步操作时如何返回空操作?
- php - 如何在 Laravel 的模型中变异为布尔值?