通过打开新活动清除后堆栈

时间:2014-08-20 08:54:40

标签: java android android-fragments back-stack

在我的应用程序的主要活动中,有一个容纳碎片的容器 当用户单击“默认”片段(显示的第一个片段)中的按钮时,片段会更改,操作栏按钮也会更改。

这个新片段的操作栏中的一个按钮打开另一个活动。

在该活动中,当用户单击后退按钮时,活动将关闭,MainActivity(打开新活动的片段)中显示的片段仍然存在(这很好)。

但是,如果用户再次单击后退按钮,则不会返回上一个片段。虽然它在活动未打开时确实返回。

事实证明,打开活动会清除后台堆栈(通过Log来验证来自FragmentManager类的计数),而我不确定这是否应该像这样或不,它有点道理。不幸的是,这不是我想要的行为。

MainActivity: Fragment A (default) ---> Fragment B ---> Acivity B

因此,我的问题是,如果有活动恢复,我如何保留背斜?

我尝试搜索类似的问题,但我发现的所有问题实际上都要求如何清除背斜。

2 个答案:

答案 0 :(得分:2)

试试:

@Override
public void onBackPressed() {
    Intent intent = new Intent(A_Acticity.this, B_Activity.class);
    startActivity(intent);
}

希望它有所帮助! :)

答案 1 :(得分:1)

读取documentation,有一种方法可以根据事务名称或commit提供的id弹出后台堆栈。使用名称可能更容易,因为它不需要跟踪可能改变的数字并加强“唯一的后栈条目”逻辑。

由于每个Fragment只需要一个后向堆栈条目,因此将后面的状态名称设为Fragment的类名(via getClass().getName())。然后在替换片段时,使用popBackStackImmediate()方法。如果返回true,则表示后端堆栈中存在Fragment的实例。如果没有,实际执行Fragment替换逻辑。

private void replaceFragment (Fragment fragment){
  String backStateName = fragment.getClass().getName();

  FragmentManager manager = getSupportFragmentManager();
  boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);

  if (!fragmentPopped){ //fragment not in back stack, create it.
    FragmentTransaction ft = manager.beginTransaction();
    ft.replace(R.id.content_frame, fragment);
    ft.addToBackStack(backStateName);
    ft.commit();
  }
}