У меня есть фрагмент 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, чтобы очистить его от стека, но произошла одна и та же проблема.