在我的应用程序的主要活动中,有一个容纳碎片的容器 当用户单击“默认”片段(显示的第一个片段)中的按钮时,片段会更改,操作栏按钮也会更改。
这个新片段的操作栏中的一个按钮打开另一个活动。
在该活动中,当用户单击后退按钮时,活动将关闭,MainActivity
(打开新活动的片段)中显示的片段仍然存在(这很好)。
但是,如果用户再次单击后退按钮,则不会返回上一个片段。虽然它在活动未打开时确实返回。
事实证明,打开活动会清除后台堆栈(通过Log
来验证来自FragmentManager
类的计数),而我不确定这是否应该像这样或不,它有点道理。不幸的是,这不是我想要的行为。
MainActivity: Fragment A (default) ---> Fragment B ---> Acivity B
因此,我的问题是,如果有活动恢复,我如何保留背斜?
我尝试搜索类似的问题,但我发现的所有问题实际上都要求如何清除背斜。
答案 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();
}
}