Фрагмент Android не добавлен в Back Stack

Я делаю приложение на основе NavigationDrawer. У меня есть иерархия, как показано ниже

NavigationDrawer --> RootFragment (не добавлен в задний стек) --> Detail Fragment (добавлен в задний стек)

Теперь я пытаюсь показать пользователю сообщение, когда он пытается выйти из приложения, нажав кнопку «Назад». Вот код, который я использую для этого.

@Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0) {
            getFragmentManager().popBackStack();
        }
        else if (getFragmentManager().getBackStackEntryCount() == 0) {
            new AlertDialog.Builder(this)
                    .setMessage("Are you sure you want to exit?")
                    .setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            MainActivity.this.finish();
                        }
                    })
                    .setNegativeButton("No", null)
                    .show();

        }
        else
        {
            super.onBackPressed();
        }
    }

Когда я нажимаю кнопку «Назад» из фрагмента сведений, который добавляется в задний стек, я получаю предупреждающее сообщение. Вместо этого я хотел бы вернуться к корневому фрагменту.

Но если я обновлю код таким образом, нажатие кнопки «Назад» вернет пользователя к корневому представлению. Таким образом, похоже, что getFragmentManager().getBackStackEntryCount() равен нулю, даже если подробный фрагмент добавляется в задний стек.

@Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0) {
            getFragmentManager().popBackStack();
        }
        else
        {
            super.onBackPressed();
        }
    }

Вот как я называю фрагмент детали из rootFragment.

FragmentManager fragmentManager = getFragmentManager();
                Fragment fragment = SubCategoryListFragment.newInstance(false);
                fragmentManager.beginTransaction()
                        .add(R.id.subCategoryDetails, fragment)
                        .addToBackStack(null)
                        .commit();

Вот корневой вид, который открывается из бокового меню панели навигации.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">


    <android.support.v7.widget.RecyclerView
        android:id="@+id/categoriesRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:cacheColorHint="@android:color/transparent"/>

    <FrameLayout
        android:id="@+id/subCategoryDetails"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></FrameLayout>


</FrameLayout>

Что я здесь делаю неправильно? Каков правильный способ реализовать это?

Спасибо.


person Zach    schedule 24.01.2016    source источник


Ответы (2)


Предполагая, что вы используете фрагменты поддержки, вы должны использовать getSupportFragmentManager() в своей деятельности. С getFragmentManager() вы получаете встроенный менеджер фрагментов. Однако в классах вспомогательных фрагментов getFragmentManager() возвращает диспетчер вспомогательных фрагментов, что может немного сбивать с толку.

person patloew    schedule 24.01.2016

Передайте допустимый тег вместо нуля в этом выражении

addToBackStack(null) 
person nvinayshetty    schedule 24.01.2016