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