2017-04-01 98 views
-1

我試圖以一種非常簡單的方式管理片段。我創建了一個實用工具類,它將碎片添加到後臺堆棧中,當我們按下後退按鈕時,前一個片段就出現了。我對此表示滿意。但是,當我試圖清除所有碎片,並顯示根片段時,我無法正確地做到這一點。以下是我的工具類:如何管理堆棧中的碎片?

public class FragmentUtil { 
private FragmentUtil() { 
} 

public static void animatedReplace(FragmentActivity activity, int containerId, Fragment fragment, Bundle args, boolean addToBackStack){ 
    FragmentTransaction transaction=activity.getSupportFragmentManager().beginTransaction(); 
    fragment.setArguments(args); 
    if(addToBackStack){ 
     transaction.addToBackStack(fragment.getClass().getName()); 
    } 
    transaction.setCustomAnimations(R.anim.slide_from_right, R.anim.slide_to_left,R.anim.slide_from_left,R.anim.slide_to_right); 
    transaction.replace(containerId,fragment); 
    transaction.commit(); 
} 

public static void clearBackStackToHome(FragmentActivity activity){ 
    FragmentManager manager = activity.getSupportFragmentManager(); 
    manager.popBackStack(DashboardFragment.class.getName(),FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 
} 

當我想以另一個片段,我傳遞「真」爲addToStack在animatedReplace方法。當我想清除後臺時,我傳遞「false」並調用clearBackStackToHome方法。任何人都可以幫助我,我做錯了什麼?

回答

0

作出檢查backStack是否爲空的條件。當所有的碎片從堆棧中刪除,然後顯示您的根片段

0

試試這個:在你的實用工具類

public void clearBackStack() { 
    FragmentManager manager = activity.getSupportFragmentManager(); 
    if (manager.getBackStackEntryCount() > 0) { 
     FragmentManager.BackStackEntry first = manager 
       .getBackStackEntryAt(0); 
     manager.popBackStack(first.getId(), 
       FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 
} 

確保在你的根/ animatedReplace()你通過boolean addToBackStack = false第一個片段。

以便它不會被清除。

編輯

要使用它OnBackPressed()您的活動覆蓋onBackPressed()並添加以下代碼:

@Override 
    public void onBackPressed() { 
     FragmentManager fm = getSupportFragmentManager(); 
     if (fm.getBackStackEntryCount() > 0) { 
      FragmentManager.BackStackEntry first = fm 
        .getBackStackEntryAt(0); 
      fm.popBackStack(first.getId(), 
        FragmentManager.POP_BACK_STACK_INCLUSIVE); 
      Log.i("MainActivity", "popping backstack"); 
     } else { 
      super.onBackPressed(); 
     } 
    } 
+0

嗨rafsanahmad007!該解決方案工作得很好。但是,如何在onBackPressed()上實現它? –

+0

@HiteshPamnani我編輯了答案.. – rafsanahmad007

+0

每當用戶點擊後退按鈕時都會發生。我想在某個過程之後纔會發生。例如,在完成付款過程後,用戶可以點擊返回按鈕並導航到根片段。 –

0

是的,你可以管理片段回來按在onBackPressed()的方法你的MainActivity。 只是覆蓋onBackPressed(),並檢查backStack計數,如果計數爲零,然後導航到您的根片段或從應用程序退出。此外,您可以根據檢查後面堆棧中的哪個片段來實現代碼。

@Override 
public void onBackPressed() { 


    FragmentManager fm = getSupportFragmentManager(); 
    int count = fm.getBackStackEntryCount(); 
    if (count >= 1) { 
     if (fm.findFragmentById(R.id.main_container) instanceof yourFragment) { 

      super.onBackPressed(); 

     } 
    } else { 
     // Show your root fragment here 
    } 

}