2014-02-20 67 views
0

我在我的活动中有五个片段。在点击片段抽屉列表中,我打电话给setFrament()方法。 它从活动中删除以前的片段,并根据需求添加新的片段。 这里是我的代码setFragment方法。getFragmentByTag()永不返回空

protected void setFragment(final int position) { 
    // Remove currently active fragment 
    if (mActiveFragment != null) { 
     Fragment previous; 
     while ((previous = mFragmentManager 
       .findFragmentByTag(mActiveFragment.toString())) != null) { 
      mFragmentManager.beginTransaction().remove(previous).commit(); 
      Log.e("in loop", "stuck"); 
     } 
    } 

    // It's enum, generated according to position 
    FragmentType type = getFragmentType(position); 

    Fragment fragment = mFragmentManager.findFragmentByTag(type.toString()); 
    if (fragment == null) { 
     fragment = createFragment(type); 

    } 

    mFragmentManager 
      .beginTransaction() 
      .replace(R.id.containerFrameLayout, fragment, 
        type.toString()).commit(); 
    // Sets the current selected fragment checked in 
    // Drawer listview 
    mFragmentDrawerList.setItemChecked(position, true); 

    // set Actionbar title 

    getActionBar().setTitle(type + ""); 
    mActiveFragment = type; 

} 

这里,同时改变片段,它一直在prining while循环永远“卡壳”, 我的问题是,为什么 方法remove(Fragment)不会删除从活动之前的片段?

回答

2

commit()是一个异步调用,仅在Android系统重新获得控制权时执行。在离开方法后的一段时间内,碎片不会被移除。

如果你想删除以前的片段(假设只有一个片段),那么你可以将它们添加到后台堆栈中。然后你可以打电话popBackStack(null, 0)这将弹出背部堆栈上的所有内容。尽管侧面抓住了按下“后退”按钮,如果用户要这样做,也会弹出后台。如果您不希望发生这种情况,您必须重写onBackPressed()并自行处理。

编辑:

一种方法是跟踪所有的ID或标记,并分别要求他们remove

LinkedList<Integer> fragmentIds = new LinkedList<Integer>(); 

/*** Add fragment to FragmentManager ***/ 
fragmentIds.add(/** ID of fragment */); 

/** Removing all fragments from FragmentManager **/ 
FragmentManager fm = getFragmentManager(); 
FragmentTransaction transaction = fm.beginTransaction(); 
Fragment fragToRemove; 
for(Integer id : fragmentIds) 
{ 
    fragToRemove = fm.findFragmentById(id); 
    transaction.remove(fragToRemove); 
} 
transaction.commit() 
fragmentIds.clear(); 

不过,你不必调用其中的任何remove,只要您使用相同的容器上replace()方法。 replace()将弹出前一个片段并添加新的片段。只要事务没有推送到后台,前一个片段就从Activity中分离出来并丢弃。

+0

好吧,目前只有一个片段,但可以有很多,这就是我在while循环中使用的原因。我不能使用popBackStack方法,因为它不适合我的需要。任何选择? – jimmy0251

+0

不幸的是,FragmentManager不能很好地处理不在堆栈上的碎片。我能想到的唯一方法是持有对片段的引用,并分别调用每个片段上的remove()。我会更新一些解决方案,但我真的不喜欢他们中的任何一个。 – DeeV