Фрагмент PopBackStack

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

у меня есть один фрагмент активности:

Шаг 1: я прикрепляю один фрагмент в onCreate этой активности в начальном именованном фрагменте a как:

это onCreate активности фрагмента

@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_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, когда я снова нажимаю назад, он показывает мне пустой Содержание фрагментов. Он никогда не показывает первый фрагмент, который я добавил на Шаге 1 в OnCreate действия.

прокомментируйте, пожалуйста. Что я делаю не так ?

спасибо

3 ответов


вы не должны добавлять свой первый фрагмент в backstack, так как нажатие клавиши возврата просто отменит действие, которое вы сделали. Поэтому, если вы замените фрагмент и нажмете назад, он отменит замену, которую вы сделали. Но если вы нажмете на кнопку и ... --1--> ' fragmenttransaction, он просто удалит его и покажет вам пустую страницу. Поэтому я думаю, что удаление первого фрагмента из backstack должно сделать трюк. Попробуй и позволь мне. знать!

@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() " (=сохранить обратный действия) вы сохраните удалить фрагмент A как действие при нажатии на кнопку Назад.

если вы .replace() фрагмент A фрагмент B, и "addToBackStack()" вы будет сохранен remove B и добавить A как действие при нажатии на кнопку Назад.

Итак, вы видите, почему это не хорошая практика, чтобы добавить свой первый fragmenttransaction к backstack? Это просто приведет к удалению фрагмента A путем отжимать назад, приводящ к в пустой странице. Надеюсь, этого достаточно.

кроме того, как только вы удалили addToBackStack() для вашего первого фрагмента вам не нужно переопределять onBackPressed(), потому что он будет работать, как это предполагается. Он просто закончит работу, когда в backstack ничего не останется, не показав вам сначала эту пустую страницу.


ваши строки:

if(fm.getBackStackEntryCount() > 1){

должно быть:

if (fm.getBackStackEntryCount() > 0) {

вы кладете 3 фрагмента на backstack. После того, как вы вытащите первые две записи, количество записей на backstack затем равно 1. Таким образом, вы не можете получить первый фрагмент, который вы добавили в backstack.


вы используете эту manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

попробуйте использовать это вместо manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

Дайте мне знать, если это работает для U