Проблема фрагментов обратного нажатия в Android

У меня есть четыре фрагмента: A, B, C, D. Теперь я перехожу от A -> B, поэтому мой код будет

от А до Б

getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content_frame, new B())
    .addToBackStack("A")
    .commit();

Теперь от B к C, поэтому код будет

getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content_frame, new C())
    .addToBackStack("B")
    .commit();

Теперь от C к D. Но я не хочу включать C в backstack, потому что при обратном нажатии я не хочу, чтобы фрагмент C отображался.

 getActivity().getSupportFragmentManager()
     .beginTransaction()
     .replace(R.id.content_frame, new D())
     .commit();

Теперь, когда я нажимаю кнопку «Назад», он будет работать отлично до A. Теперь, если я повторю тот же процесс еще раз. Теперь снова нажмите «От фрагмента D» и я буду отправлен прямо на фрагмент «А», а не на фрагмент «В». Не могли бы вы понять ошибку, которую я делаю в приведенном выше коде?


person mohammedali sunasara    schedule 17.11.2015    source источник
comment
@HareshChhelana Это не проблема, вопрос показывает, что не вызывается добавление в задний стек. Проблема заключается в том, как работают транзакции фрагментов. Прочтите этот ответ stackoverflow.com/questions/12529499 /   -  person Zach    schedule 17.11.2015
comment
@ Зак .. На самом деле я не перешел по этой ссылке   -  person mohammedali sunasara    schedule 17.11.2015
comment
Да, это не дает четкого ответа, просто дает обзор того, как это работает. У меня были похожие проблемы, и в основном мне приходилось определять свой собственный backstackchangelistener, который определяет, что происходит при вызовах обратного стека.   -  person Zach    schedule 17.11.2015


Ответы (2)


Вы должны предоставить такое же строковое значение для addToBackStack для одного стека.

.replace(R.id.content_frame, new B())
.addToBackStack("stack") 

.replace(R.id.content_frame, new C())
.addToBackStack("stack") 
person user3037028    schedule 17.11.2015

Вот код BackStackChangedListener.

public  static void performNoBackStackTransaction( final FragmentManager fragmentManager, String tag, Fragment fragment) {
    final int newBackStackLength = fragmentManager.getBackStackEntryCount() +1;

    fragmentManager.beginTransaction()
            .replace(R.id.content_frame, fragment, tag)
            .addToBackStack(tag)
            .commit();

    fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            int nowCount = fragmentManager.getBackStackEntryCount();
            if (newBackStackLength != nowCount) {
                // we don't really care if going back or forward. we already performed the logic here.
                fragmentManager.removeOnBackStackChangedListener(this);

                if ( newBackStackLength > nowCount ) { // user pressed back
                    fragmentManager.popBackStackImmediate();
                }
            }
        }
    });
}
person mohammedali sunasara    schedule 19.11.2015