Удаленный фрагмент Android и вид из BackStack

Введите описание изображения здесь

Я понимаю, что этот вопрос задан до того, как предыдущие ответы дошли до меня. Сценарий выглядит следующим образом: у нас есть фрагмент панели (A), который приводит пользователя к экрану входа в систему (B). При успешном входе в систему они переходят к списку (c). При обратном нажатии я хотел бы вернуться к A, так как пользователю больше не нужно будет видеть экран входа в систему. Кроме того, при успешном входе в систему мы сохраняем детали в общих предпочтениях и автоматизируем вход в систему B в следующий раз, и все это работает как запланировано.

У меня есть следующий метод FragmentHelper:

public static void goToNextFragement(Fragment fragment, int container, boolean addToBackStack, Fragment ctx) { // Create new fragment and transaction FragmentTransaction transaction = ctx.getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack transaction.replace(container, fragment); if(addToBackStack) transaction.addToBackStack(null); // Commit the transaction transaction.commit(); } 

В транзакции из B в CI установить Boolean addToBackStack как false, чтобы transaction.addToBackStack(null); Не вызывается. Это снова работает хорошо, но после этого начинается моя проблема.

Когда пользователь нажимает на C и возвращается в AI, он все еще может видеть увеличенный вид C под видом A.

Любая помощь будет оценена по достоинству. Надеюсь, моя диаграмма поможет сохранить это просто.

Solutions Collecting From Web of "Удаленный фрагмент Android и вид из BackStack"

Пара способов справиться с этим:

  1. У меня был подобный поток в моем приложении, и так, как я решил, это заменил фрагмент входа с помощью AlertDialog, который был запущен из основного действия. Таким образом, в вашем случае на экране появляется фрагмент A, и если основное действие предполагает, что ему нужно отобразить диалоговое окно входа в систему, оно отображает AlertDialog. Это сработало для меня.

  2. Когда фрагмент A включен, он может проверить, существует ли фрагмент C, спросив FragmentManager. Если он существует, удалите его.

Я решил это … внутри линии …

 getFragmentManager().popBackStack(); 

или

 getSupportFragmentManager().popBackStack() 

Это работает, когда вы добавляете фрагменты и поддерживаете backstack (не заменяете).

F1 -> f2

 Fragment2 f2 = new Fragment2(); this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.main_content,f2).addToBackStack(null).commit(); 

Здесь нет ничего необычного. Затем, в фрагменте f2 этот код приведет вас к фрагменту f3.

F2 -> f3

 Fragment3 f3 = new Fragment3(); getActivity().getSupportFragmentManager().popBackStack(); getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.main_content, f3).addToBackStack(null).commit(); 

Я не уверен, читая документы, если это должно сработать, этот метод транзакций сотовой связью считается асинхронным, и, возможно, лучшим способом было бы вызвать popBackStackImmediate (). Но насколько я могу судить по своим устройствам, он работает безупречно.

Указанная альтернатива будет:

 final FragmentActivity activity = getActivity(); activity.getSupportFragmentManager().popBackStackImmediate(); activity.getSupportFragmentManager().beginTransaction().replace(R.id.main_content, f3).addToBackStack(null).commit(); 

Здесь на самом деле будет кратковременное возвращение к f1 beofre, перемещающемуся к f3, так что небольшой сбой там.

Это на самом деле все, что вам нужно сделать, и этот ответ также может помочь вам.

Не сообщая FM, что вы хотите, чтобы переход с B на C был добавлен в backStack, означает, что когда вы нажимаете назад, FM не имеет записи о добавлении C, поэтому он не удаляет его.

Шаг 1: Когда вы находитесь в фрагменте A и хотите открыть фрагмент B

 getFragmentManager().beginTransaction() .replace(android.R.id.content, new FragmentB(), FragmentB.class.getName() .addToBackStack(null) .commit(); 

Шаг 2: Когда вы находитесь в фрагменте B и хотите открыть фрагмент C

 getFragmentManager().beginTransaction() .replace(android.R.id.content, new FragmentC(), FragmentC.class.getName() .disallowAddToBackStack() // << this to make Fragment B, not included in the backstack .commit(); 

Шаг 3: Когда вы находитесь во Фрагменте C и нажимаете кнопку возврата устройства или getFragmentManager().popBackStack(); Вы откроете Фрагмент А.

PS: В работе используйте этот getSupportFragmentManager() . Если вы используете Fragment, используйте этот getFragmentManager()