Реализация задних стеков с фрагментами

Я пытаюсь реализовать задний стек при использовании фрагментов, но при использовании кнопки "Назад" меня выводят из приложения на домашний экран.

Активность открывает фрагмент А; Фрагмент A имеет интерактивный TextView, который открывает фрагмент B (это работает). Нажатие НАЗАД должно вернуть меня к фрагменту А, но вместо этого он выводит меня на домашний экран.

Вот призыв к открытию фрагмента А в onCreate:

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.fragment_layout_container, new FragmentLogin(), "fragment_login")
            .addToBackStack("login_screen")
            .commit();

    Log.d("Back", getFragmentManager().getBackStackEntryCount() +" <- Entry Count at LoginActivity.onCreate" );

На этом этапе журнал печатает 0 <- Entry Count at LoginActivity.onCreate, Что-то, что я сделал неправильно, не позволяет печатать это 1.

Затем у фрагмента А есть этот слушатель:

    forgottenPassword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_layout_container, new FragmentForgottenPassword(), "fragment_password")
                    .addToBackStack("forgotten_password")
                    .commit();

            Log.d("Back", getFragmentManager().getBackStackEntryCount() + " <- Entry Count at FragmentLogin.onCreateView.Listener");
        }
    });

Лог здесь печатает 1 <- Entry Count at FragmentLogin.onCreateView.Listener, Здесь слушатель работает и открывает фрагмент B - но кнопка "Назад" возвращает меня на домашний экран.

3 ответа

Решение

Используйте это в своей Деятельности, это должно выскочить фрагменты, уже добавленные в backstack

 @Override
 public void onBackPressed()
 {
     if (getFragmentManager().getBackStackEntryCount() > 0) {
         getFragmentManager().popBackStack();
     } else {
         super.onBackPressed();
     }
 }

Попробуйте как это,

 public void replaceFragment(Fragment fragment, boolean addToBackStack) {

    FragmentTransaction transaction = getFragmentManager()
            .beginTransaction();

    if (addToBackStack) {
        transaction.addToBackStack(null);

    } else {
        getFragmentManager().popBackStack(null,
                FragmentManager.POP_BACK_STACK_INCLUSIVE);

    }
    transaction.replace(R.id.fragment_layout_container, fragment);
    transaction.commitAllowingStateLoss();
    getFragmentManager().executePendingTransactions();

}

и использовал это так,

replaceFragment(new FragmentForgottenPassword(), true);

Есть библиотека GitHub, которая сделает эту работу за вас!
https://github.com/rathodchintan/Fragment-Back-Stack
Всякий раз, когда вы отображаете любой новый фрагмент, просто вставьте этот фрагмент в стек, используя следующий код. // здесь этот фрагмент наш первый фрагмент
homeListFragment = new HomeListFragment(); fragmentStack.push(homeListFragment);
У него также есть много других вариантов стека.

Другие вопросы по тегам