删除BackStack的顶部片段

时间:2016-04-27 10:02:44

标签: android android-fragments

我想要做的是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中删除Top Fragment但是使用popBackStack是错误的,因为它显示了顶部片段,我只需要从BackStack中删除它。

任何想法?

1 个答案:

答案 0 :(得分:0)

我想要做的是实现onBackPressed,即按下后退按钮将处理上一个片段,但我不想处理先前的实例而是新的实例,所以我使用了问题& #39;代码。要做到这一点,我正在向BackStack添加片段,以便知道哪个片段是之前的[Backstack的顶部],然后创建它的新实例。所以我得到它的名字然后创建它的新实例然后从BackStack中删除它[这就是问题,我无法从后台堆栈中删除它]。

最后我发现我根本不需要使用BackStack来了解我刚刚使用ArrayList String来保存每个事务的先前片段是什么片段的名称或标签,例如在交易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();
}

并且它很有效,如需要!