Фрагмент PopBackStack
Я получаю странную проблему, используя фрагменты и выскакивая их.
У меня есть одна функция фрагмента:
Шаг 1: Я прикрепляю один фрагмент в onCreate этой активности в начале имени фрагмента A как:
Это onCreate of Fragment Activity
@Override
protected void onCreate(Bundle savedBundleState) {
super.onCreate(savedBundleState);
setContentView(R.layout.activity_base_new);
Fragement_Home home = new Fragement_Home();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
}
Шаг: 2 После этого я приложил Fragment к следующему коду:
Fragment_More moreFragment = new Fragment_More();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();
Шаг 3: После этого я добавил еще один фрагмент на Fragment_More следующим образом:
Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();
и вот моя функция фрагмента onBackPressedButton Lisetener:
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
Fragment f = fm.findFragmentById(R.id.frameContent);
if(fm.getBackStackEntryCount() > 1){
fm.popBackStack();
} else{
finish();
}
}
Вот проблема, которую я получаю:
Когда я вернусь назад с шага 3, он дает мне предыдущий фрагмент успешно, как описано onBackPressed, он будет popbackstack и перенесет меня в предыдущий фрагмент. Но из Fragment_More, когда я снова нажимаю, он показывает мне чистый контент FRAGMENT. Он никогда не показывает первый фрагмент, который я добавил на шаге 1 в OnCreate Activity.
Прокомментируйте. Что я делаю неправильно?
Спасибо
Ответы
Ответ 1
Вы не должны добавлять свой первый фрагмент в стопку, так как нажатие клавиши возврата просто отменяет действие, которое вы сделали. Поэтому, если вы замените фрагмент и вы нажмете назад, он изменит вашу замену. Но если вы вернетесь к фрагментарному взаимодействию ".add()
", он просто удалит его и покажет вам пустую страницу. Поэтому я думаю, что удаление первого фрагмента из задней стопки должно сделать трюк. Попробуйте и дайте мне знать!
@Override
protected void onCreate(Bundle savedBundleState) {
super.onCreate(savedBundleState);
setContentView(R.layout.activity_base_new);
Fragement_Home home = new Fragement_Home();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().add(R.id.frameContent, home).commit();
}
Пример:
Итак, скажем, у вас есть два фрагмента, называемых A и B
Если вы .add()
фрагмент A на странице, а "addToBackStack()
" (= сохранить обратное действие), вы сохраните фрагмент REMOVE A как действие при нажатии на кнопку назад.
Если вы .replace()
фрагмент A по фрагменту B, а также "addToBackStack()
", вы сохраните удаление B и добавьте A как действие при нажатии на кнопку назад.
Итак, вы понимаете, почему это не очень хорошая практика, чтобы добавить ваш первый фрагментарный переход в заднюю часть? Это просто приведет к удалению фрагмента A, нажимая назад, что приведет к пустой странице. Надеюсь, этого достаточно.
Кроме того, как только вы удалили addToBackStack()
в свой первый фрагмент, вам не нужно переопределять onBackPressed()
, потому что он будет работать так, как предполагается. Он просто завершит действие, когда в задней части экрана ничего не останется, показывая вам эту пустую страницу.
Ответ 2
Ваша строка:
if(fm.getBackStackEntryCount() > 1){
должен быть:
if (fm.getBackStackEntryCount() > 0) {
Вы помещаете 3 фрагмента в стопку. После того, как вы вытащите первые две записи, количество записей в backstack тогда равно 1. Таким образом, вы не можете извлечь первый фрагмент, добавленный в стопку.
Ответ 3
вы используете это
manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
попытайтесь использовать это вместо
manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();
Сообщите мне, если он работает для u