Android Fragment未添加到Back Stack

Zac*_*ach 7 android android-fragments fragmenttransaction fragment-backstack

我正在做一个基于NavigationDrawer的应用程序.我有一个如下所示的层次结构

NavigationDrawer - > RootFragment(未添加到后面的堆栈) - >详细信息片段(添加到后台堆栈)

现在,我试图通过按后退按钮尝试退出应用程序时向用户显示一条消息.这是我正在使用的代码.

@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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我从详细信息片段中单击后退按钮(添加到后台堆栈)时,我收到警报消息.相反,我会回到根片段.

但是,如果我像这样更新代码,按后退按钮会将用户带回到根视图.所以它看起来像getFragmentManager().getBackStackEntryCount()即使将详细片段添加到后台堆栈也是零.

@Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0) {
            getFragmentManager().popBackStack();
        }
        else
        {
            super.onBackPressed();
        }
    }
Run Code Online (Sandbox Code Playgroud)

以下是我从rootFragment调用详细信息片段的方法.

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

这是从导航抽屉侧面菜单打开的根视图.

<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>
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?什么是正确的实现方式?

谢谢.

小智 3

假设您正在使用支持片段,则必须getSupportFragmentManager()在您的活动中使用。您将获得getFragmentManager()本机片段管理器。然而,在支持片段类中,getFragmentManager()返回支持片段管理器,这可能有点令人困惑。