2016-11-30 6 views
0

У меня есть фрагмент A, B, C, D, E и поток навигации A-> B-> C-> D-> E. Таким образом, вы можете сказать, что A является базовым фрагментом, откуда начинается навигация.Поп-фрагмент непосредственно при стартовом фрагменте, создающем проблему в android

Naviagation поток

Add fragment with Backstack   Navigate to Fragment A   
A          E 
    -> B (Add B to backstack)    -> D (Remove E from backstack) 
B          D 
    -> C (Add C to backstack)    -> C (Remove D from backstack) 
C          C 
    -> D (Add D to backstack)    -> B (Remove C from backstack) 
D          B 
    -> E (Add E to backstack)    -> A (Remove B from backstack) 

             ** Trying to back from A and message pops 

             (Press once again to exit!) 

Добавить фрагмент с backstack

public void pushFragmentWithBackState(Fragment DestinationFragment) throws Exception { 
     try { 
      Fragment SourceFragment = this; 
      int viewResourceID = ((ViewGroup) SourceFragment.getView().getParent()).getId(); 
      FragmentManager fragmentManager = getFragmentManager(); 

      FragmentTransaction ft = fragmentManager.beginTransaction(); 
      ft.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit); 
      ft.add(viewResourceID, DestinationFragment); 
      ft.hide(SourceFragment); 
      ft.addToBackStack(DestinationFragment.getClass().getName()); 
      ft.commit(); 
     } catch (Exception ex) { 
      throw ex; 
     } 

    } 

Вернуться фрагментировать(проверка Navigate фрагментировать)

В этом коде я проверяю, что если в менеджере фрагментов нет обратной записи стека, это означает, что мы находимся на фрагменте A, и я показываю сообщение . Нажмите снова, чтобы выйти или просто обратно из фрагмента.

@Override 
    public void onBackPressed() { 
     // code here to show dialog 
     //super.onBackPressed(); // optional depending on your needs 
     if (getSupportFragmentManager().getBackStackEntryCount() >= 1) { 
      BaseFragment fragment = (BaseFragment) getSupportFragmentManager().getFragments().get(getSupportFragmentManager().getBackStackEntryCount() - 1); 
      if (fragment != null) { 

       if (!fragment.onFragmentBackPressed()) { 
        //super.onBackPressed(); 
        if (back_pressed + 2000 > System.currentTimeMillis()) { 
         finish(); 
        } else { 
         Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show(); 
         back_pressed = System.currentTimeMillis(); 
        } 
       } 
      } else { 
       //super.onBackPressed(); 
       if (back_pressed + 2000 > System.currentTimeMillis()) { 
        finish(); 
       } else { 
        Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show(); 
        back_pressed = System.currentTimeMillis(); 
       } 

      } 
     } else { 
      if (back_pressed + 2000 > System.currentTimeMillis()) { 
       finish(); 
      } else { 
       Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show(); 
       back_pressed = System.currentTimeMillis(); 
      } 
     } 
    } 

ВЫПУСКА

Моя проблема началась, если я пытаюсь перейти от E -> B и удалить все стек исключительно

Из фрагмента E

poptoBackStackFragment(B.class); 

Метод

public boolean poptoBackStackFragment(Class SourceFragmentClass) { 
     getFragmentManager().popBackStack(SourceFragmentClass.getName(),0); 
     return true; 
    } 

Когда я пытаюсь сделать это не будет четкий список фрагментов (getSupportFragmentManager().getFragments()) из fragment manager и с неправильным положением и когда снова запихнуть в потоке для экс. B-> C-> Список D-фрагмент, как:

Найти этот Обратно к фрагменту A

BaseFragment fragment = (BaseFragment) getSupportFragmentManager().getFragments().get(getSupportFragmentManager().getBackStackEntryCount() - 1); 

Пример:

  • список фрагмент 1 позиция фрагмент, имеющий Б
  • фрагмент 4 позиция, имеющая фрагмент C
  • список фрагментов 3 позиции с фрагментом D
  • фрагмент списка размер также 5 вместо 2
  • нет последовательности в добавлении фрагмент в списке Нормально она должна быть позиция 0,1,2, но вместо этого он 1,4,3

И из-за чего моя логика проверки, находится ли я на базовом фрагменте, провалилась, и сообщение идет, даже я не нахожу фрагмент (нажмите еще раз, чтобы выйти).

Почему список фрагментов не ясен, когда я перехожу к B и удаляет весь фрагмент в стек? Я что-то упустил? Пожалуйста помоги.

Примечание: Я также использовал FragmentManager.POP_BACK_STACK_INCLUSIVE, чтобы очистить его от стека, но произошла одна и та же проблема.

ответ

0

Существует нет метода getFragments на FragmentManager, или, скорее, есть, но он скрыт и не предполагается использовать. Не указано, как он должен вести себя где угодно. Я думаю, вы должны использовать getBackStackEntryAt вместо этого, он должен иметь четко определенное поведение.