删除 BackStack 的顶部片段



我想做的是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();
}

并且根据需要,它工作得很好!

最新更新