Удаленный фрагмент Android и вид из BackStack
![enter image description here]()
Я понимаю, что этот вопрос задан до того, как предыдущие ответы дошли до меня. Сценарий выглядит следующим образом: у нас есть фрагмент панели (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 до C я устанавливаю Boolean addToBackStack как false, чтобы transaction.addToBackStack(null);
не вызывался. Это снова работает хорошо, но после этого начинается моя проблема.
Когда пользователь нажимает на C и возвращается в A, я все еще вижу раздутый вид C под видом A.
Любая помощь будет оценена по достоинству. Надеюсь, моя диаграмма поможет сохранить это просто.
Ответы
Ответ 1
Несколько способов справиться с этим:
-
У меня был подобный поток в моем приложении и то, как я решил это, заменив фрагмент входа с помощью AlertDialog, который выстрелил из основного действия.
Таким образом, в вашем случае на экране появляется фрагмент A, и если основное действие предполагает, что ему нужно отобразить диалоговое окно входа в систему, оно отображает AlertDialog. Это сработало для меня.
-
Когда включен фрагмент A, он может проверить, существует ли фрагмент C, запросив FragmentManager. Если он существует, удалите его.
Ответ 2
Я решил это.. внутри строки...
getFragmentManager().popBackStack();
или
getSupportFragmentManager().popBackStack()
это работает, когда вы добавляете фрагменты и поддерживаете backstack (не заменяете).
Ответ 3
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, если вы перейдете к f3, так что там будет небольшой сбой.
Это на самом деле все, что вам нужно сделать, и этот ответ также может помочь вам.
Ответ 4
Не сообщая FM, что вы хотите, чтобы переход с B на C был добавлен в backStack, означает, что когда вы нажимаете назад, FM не имеет записи о добавлении C, поэтому он не удаляет его.
Ответ 5
Шаг 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();
, вы откроете фрагмент A.
PS: В работе используйте getSupportFragmentManager()
. Если вы находитесь в Фрагменте, используйте getFragmentManager()