Фрагмент 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