Android fragment 未添加到返回堆栈

标签 android android-fragments fragmenttransaction fragment-backstack

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

NavigationDrawer --> RootFragment(Not added to back Stack) --> Detail Fragment (Added to Back Stack)

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

@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();
        }
    }

当我从添加到返回堆栈的详细信息 fragment 中单击返回按钮时,我收到了警报消息。相反,我会回到根 fragment 。

但是,如果我像这样更新代码,按下后退按钮会将用户带回 Root View 。因此,即使将详细 fragment 添加到后台堆栈,getFragmentManager().getBackStackEntryCount() 看起来也是零。

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

下面是我如何调用 rootFragment 中的细节 fragment 。

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

这是从抽屉导航侧面菜单打开的 Root View 。

<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>

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

谢谢。

最佳答案

假设您正在使用支持 fragment ,您必须在您的 Activity 中使用 getSupportFragmentManager()。使用 getFragmentManager(),您将获得 native fragment 管理器。但是,在支持 fragment 类中,getFragmentManager() 返回支持 fragment 管理器,这可能有点令人困惑。

关于Android fragment 未添加到返回堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34977250/

相关文章:

java - 如何获取 MPAndroidChart 上的滚动偏移量?

android - 使用 AndroidAnnotations 和 Fragments 编译库项目

android - 如果一个 fragment 不再在前景中,调用哪个方法?

android - Fragment.setAllowEnterTransitionOverlap(false);不起作用(进入和退出动画重叠)

android - 提交已经调用的错误,同时更改 fragment

java - Android ListView ,如何无边距定位 ListView ?

android - Titanium Android Activity 不保持状态

java - IntelliJ IDEA 12 - Android GUI 设计器未成功更改应用程序主题

Android:通过使用标签而不是 ID 查找容器来添加 fragment

android - 非法状态异常 : Fragment already added - during app startup on Android OS 4. 3