it-roy-ru.com

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

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

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

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

    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

Так почему же, когда я нажимаю кнопку «Назад» во фрагменте сведений, приложение закрывается, а не возвращается к основному фрагменту ??????????

15
scottyseus

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

Пример:

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

Ответ @ 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();
    }
}
0
ojonugwa ochalifu