Кнопка закрытия кнопки закрытия даже при использовании FragmentTransaction.addToBackStack()

Ни один из других вопросов, которые я прочитал в stackoverflow, не смог помочь с моей проблемой. Насколько я могу судить, я делаю все правильно.

У меня есть поток master/detail с фрагментами.

При создании основного действия основной фрагмент загружается следующим кодом:

    Fragment frag;
    frag = new MainListFragment();//<-- **the master fragment**

    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.replace(R.id.fragment_container, frag);
    Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount());
    transaction.commit();

Главный фрагмент имеет ListView; нажатие на элемент списка вызывает фрагмент детали следующим образом:

@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
    super.onListItemClick(listView, view, position, id);


    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    SubListFragment frag = new SubListFragment();//<-- **the detail fragment**

    transaction.replace(R.id.fragment_container, frag);
    transaction.addToBackStack(null);
    transaction.commit();
    fm.executePendingTransactions();
    Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount());

}

Теперь, согласно LogCat, BackStackEntryCount изменяется от 0 до 1 после перехода от основного фрагмента к фрагменту детали: enter image description here

Так почему же, когда я нажимаю кнопку "Назад", находясь в фрагменте детали, приложение закрывается вместо возврата к главному фрагменту?

Ответы

Ответ 1

Вы должны добавить popBackStack() вызов onBackPressed() метод активности.

Пример:

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

Ответ 2

@Ответ Bobbake4 потрясающий, но есть одна небольшая проблема. Скажем, у меня три фрагмента A, B и C. A - основной фрагмент (фрагмент, который показывает, когда я запускаю свое приложение), B и C - это фрагменты, которые я могу перемещать из ящика навигации или из A. Теперь, когда я использую кнопку возврата из B или C, я возвращаюсь к предыдущему фрагменту (A) в порядке, но заголовок предыдущего фрагмента (фрагмент B или C) теперь отображается в заголовке actionBar фрагмента A. У меня есть снова нажать кнопку "Назад", чтобы "по-настоящему" завершить обратную навигацию (чтобы отобразить представление и правильное название фрагмента и вернуться к нему)

Вот как я решил эту проблему. Объявите эти переменные.

 public static boolean IS_FRAG_A_SHOWN = false;
 public static boolean IS_FRAG_B_SHOWN = false;
 public static boolean IS_FRAG_C_SHOWN = false;

В MainActivity моего приложения, где я занимаюсь обработкой навигационных методов, у меня есть метод displayView(position), который обрабатывает переключение моих фрагментов.

private void displayView(int position) {
    IS_FRAG_A_SHOWN = false;
    IS_FRAG_B_SHOWN = false;
    IS_FRAG_C_SHOWN = false;
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
        case 0:
            fragment = new FragmentA();
            IS_FRAG_A_SHOWN = true;
            break;
        case 1:
            fragment = new FragmentB();
            IS_FRAG_B_SHOWN = true;
            break;
        case 2:
            fragment = new FragmentC();
            IS_FRAG_C_SHOWN = true;
            break;

        default:
            break;
    }

Наконец, в моем методе onBackPressed я делаю это:

public void onBackPressed() {
    if(fragmentManager.getBackStackEntryCount() != 0) {
        fragmentManager.popBackStack();
        if (IS_FRAG_A_SHOWN) { //If we are in fragment A when we press the back button, finish is called to exit
            finish();
        } else  {
            displayView(0); //else, switch to fragment A
        }

    } else {
        super.onBackPressed();
    }
}