2016-07-20 2 views
5

Я пытаюсь избежать добавления тот же фрагмент в backStack с помощью этого метода:Попытка избежать добавить тот же фрагмент дважды backStack, popBackStackImmediate всегда возвращает ложь

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(); 
     } 
    } 

панель навигации содержит: ImageView с profilePhoto, который открывает ProfileMainFragment и несколько которые открывается MainFragmentCategory. Boolean addToBackStack является false когда фрагмент выбран из navigationDrawerMenu и true, когда выбран в пределах фрагмента (шаг от MainFragmentCategory к DetialFragmentCategory) или нажмите profilePhoto в navigationDrawer.

fragmentPopped всегда false, почему это так? Даже если я нажму profilePhoto и снова profilePhoto в navigationDrawer. Следует избегать добавления его в backStack для второго (и третьего и четвертого ...) времени, но это не так.

Любая идея, как я могу исправить это?

+0

Могу ли я спросить, что вы пытаетесь сделать, чтобы дважды не добавить один и тот же фрагмент в backStack? BackStack похож на навигацию histroy. Если пользователь переходит от A> B> A> C, пользователь нажимает обратно на C. Он должен вернуться к A вместо B. – Joshua

+0

Я хочу избежать чего-то вроде этого: A> B> B> B и заставить его выглядеть это: A> B. – y07k2

+0

Как насчет того, когда пользователь нажимает на ящик, вы проверяете текущее смещение. Если это то же самое, то не заменяйте его. – Joshua

ответ

6

Вы можете добавить следующий код перед заменой фрагмента.

// 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

Вот что мне нужно, спасибо! – y07k2

Смежные вопросы