Реализация задних стеков с фрагментами
Я пытаюсь реализовать задний стек при использовании фрагментов, но при использовании кнопки "Назад" меня выводят из приложения на домашний экран.
Активность открывает фрагмент А; Фрагмент 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);
У него также есть много других вариантов стека.