2016-04-10 162 views
2

我有一些碎片将被以下方法替换。我认为我的代码有问题,因为我想阻止将多个片段添加到后端堆栈中。如果我点击片段B两次,所有实例将被添加到后退栈中,并且按下后退按钮将通过两个创建的实例。Android碎片 - 如果已经存在,则从碎片堆栈中移除碎片

public void replaceFragment(Fragment fragment, boolean addToBackStack, boolean customAnimation) { 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    String tag = fragment.getClass().getSimpleName(); 
    if (customAnimation) { 
     transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_bottom, R.anim.slide_in_bottom, R.anim.slide_out_bottom); 
    } 
    transaction.replace(R.id.fragment_container, fragment, tag); 

    // remove from back stack if exists 
    // always return false! 
    boolean f = manager.popBackStackImmediate(tag, 0); 

    if (addToBackStack) { 
     transaction.addToBackStack(tag); 
    } 
    transaction.commit(); 
} 

回答

4

保持简单,只需添加到后退堆栈(如果需要)。 如果添加的片段是同一类的当前片段,不添加到后退堆栈:

public void replaceFragment(Fragment frag) { 
    FragmentManager manager = getSupportFragmentManager(); 
    if (manager != null){ 
     FragmentTransaction t = manager.beginTransaction(); 
     Fragment currentFrag = manager.findFragmentById(R.id.content_frame); 

     //Check if the new Fragment is the same 
     //If it is, don't add to the back stack 
     if (currentFrag != null && currentFrag.getClass().equals(frag.getClass())) { 
      t.replace(R.id.content_frame, frag).commit(); 
     } else { 
      t.replace(R.id.content_frame, frag).addToBackStack(null).commit(); 
     } 
    } 
} 
+1

这是我真正需要的。谢谢丹尼尔。我有个问题。为什么你将'null'作为返回堆栈名称?如果我传递片段标签会发生什么? – Alireza