2016-07-20 34 views
5

Próbuję unikać dodawania tego samego fragmentu backStack z tą metodą:Próbując uniknąć dodać sam fragment dwukrotnie backStack, popBackStackImmediate zawsze return false

public static void replaceFragment(FragmentManager fragmentManager, Fragment fragment, Boolean addToBackStack) { 
     String backStateName = fragment.getClass().getName(); 
     boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0); 

     if (addToBackStack && !fragmentPopped && fragmentManager.findFragmentByTag(backStateName) == null) { 
      fragmentManager 
        .beginTransaction() 
//     .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, android.R.anim.fade_in, android.R.anim.fade_out) 
        .replace(R.id.container, fragment) 
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) 
        .addToBackStack(backStateName) // was 'backStateName' 
        .commit(); 
     } else { 
      if (!addToBackStack) 
       fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
      fragmentManager 
        .beginTransaction() 
//     .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, android.R.anim.fade_in, android.R.anim.fade_out) 
        .replace(R.id.container, fragment) 
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) 
        .disallowAddToBackStack() 
        .commit(); 
     } 
    } 

nawigacyjny Szuflada zawiera: ImageView z profilePhoto który otwiera ProfileMainFragment i mało kategorie, które otwiera MainFragmentCategory. Boolean addToBackStack jest false gdy fragment wybrane truenavigationDrawerMenu i gdy jest wybrane w obrębie fragmentu (ruch z MainFragmentCategory do DetialFragmentCategory) lub przycisk profilePhoto w navigationDrawer.

fragmentPopped jest zawsze false, dlaczego tak jest? Nawet jeśli kliknę profilePhoto i ponownie profilePhoto w navigationDrawer. Powinien unikać dodawania go do backStack przez drugi (i trzeci, i czwarty ...) czas, ale tak się nie stało.

Każdy pomysł, jak mogę to naprawić?

+0

Czy mogę zapytać, co próbujesz osiągnąć, aby zapobiec dodaniu tego samego fragmentu dwukrotnie do backStack? BackStack przypomina histaminę nawigacji. Jeśli użytkownik przejdzie z A> B> A> C, użytkownik wróci do C. Powinien wrócić do A zamiast B. – Joshua

+0

Chcę uniknąć czegoś takiego: A> B> B> B i spraw, aby wyglądało jak to: A> B. – y07k2

+0

Co się dzieje, gdy użytkownik kliknie na szufladę, a następnie sprawdzi bieżące przejście. Jeśli jest taki sam, nie zastępuj go. – Joshua

Odpowiedz

6

Możesz dodać następujący kod przed zastąpieniem fragmentu.

// Replace fragmentCotainer with your container id 
Fragment currentFragment = fragmentManager.findFragmentById(R.id.fragmentCotainer); 
// Return if the class are the same 
if(currentFragment.getClass().equals(fragment.getClass())) return; 
+1

Tego właśnie potrzebuję, dzięki! – y07k2