Кнопка закрытия кнопки закрытия даже при использовании 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();
}
}