Подтвердить что ты не робот

Удаленный фрагмент 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.

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

4b9b3361

Ответ 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()