我想做的是onBackPressed
我想创建一个顶部片段的新对象,所以我正在尝试以下代码:
if (getFragmentManager().getBackStackEntryCount() > 1) {
FragmentManager.BackStackEntry backEntry =getFragmentManager().getBackStackEntryAt(getFragmentManager().getBackStackEntryCount()-1);
String Back_fragment_name=backEntry.getName();
if(Back_fragment_name.equals("Frag1")){
Frag1 frag = new Frag();
getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag1").commit();
}else if(Back_fragment_name.equals("Frag2")){
Frag2 frag = new Frag2();
getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag2").commit();
}else if(Back_fragment_name.equals("Frag3")){
Frag3 frag = new Frag3();
getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag3").commit();
}
//getFragmentManager().popBackStack(); //Wrong
} else{
super.onBackPressed();
}
问题是我认为我应该从 BackStack 中删除顶部片段,但使用 popBackStack
是错误的,因为它显示了顶部片段,我只需要从 BackStack 中删除它。
有什么想法吗?
我试图做的是实现onBackPressed
,即按后退按钮将处理前一个片段,但我不想处理以前的实例,而是处理一个新实例,所以我使用了问题的代码。 为此,我将片段添加到 BackStack 中,以便知道哪个片段是以前的 [Backstack 的顶部],然后创建它的新实例。所以我得到了它的名字,然后创建它的新实例,然后从 BackStack 中删除它 [这就是问题所在,我无法从后退堆栈中删除它]。
最后,我发现我根本不需要使用BackStack来知道以前的片段是什么,我只是使用了String
ArrayList
来保存每个交易片段的名称或标签,例如在交易时Frag1
我这样做:
Frag1 frag1 = new Frag1 ();
fragmentTransaction.replace(R.id.RR, frag1 , "frag1").commit();
mPreviousFragmentsNames.add("frag1");
onBackPressed
会是这样的:
if(!Removed_Last_Fragment_Name_From_backList){
// a boolean value, removing this will cause a bad behavior
// that is if back button pressed it transact current shown fragment first then u need to press back again to go to previous one
mPreviousFragmentsNames.remove(mPreviousFragmentsNames.size()-1);
Removed_Last_Fragment_Name_From_backList = true;
}
if (!mPreviousFragmentsNames.isEmpty()) {
String Back_fragment_name = mPreviousFragmentsNames.get(mPreviousFragmentsNames.size()-1);
if(Back_fragment_name.equals("Frag1")){
Frag1 frag = new Frag();
getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag1").commit();
}else if(Back_fragment_name.equals("Frag2")){
Frag2 frag = new Frag2();
getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag2").commit();
}else if(Back_fragment_name.equals("Frag3")){
Frag3 frag = new Frag3();
getFragmentManager().beginTransaction().replace(R.id.RR, frag , "Frag3").commit();
}
} else{
super.onBackPressed();
}
并且根据需要,它工作得很好!