2016-04-10 159 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