Android 片段未添加到返回堆栈
Android Fragment not added to Back Stack
我正在做一个基于 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();
}
}
当我从添加到返回堆栈的详细信息片段中单击返回按钮时,我收到了警告消息。相反,我会回到根片段。
但是,如果我像这样更新代码,按下后退按钮会将用户带回到根视图。因此,即使将详细片段添加到后台堆栈,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>
我在这里做错了什么?实现这个的正确方法是什么?
谢谢。
在此语句中传递有效标记而不是 null
addToBackStack(null)
假设您正在使用支持片段,您必须在 Activity 中使用 getSupportFragmentManager()
。使用 getFragmentManager()
您将获得本机片段管理器。但是,在support fragment 类, getFragmentManager()
returns support fragment manager中,可能有点混乱。
我正在做一个基于 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();
}
}
当我从添加到返回堆栈的详细信息片段中单击返回按钮时,我收到了警告消息。相反,我会回到根片段。
但是,如果我像这样更新代码,按下后退按钮会将用户带回到根视图。因此,即使将详细片段添加到后台堆栈,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>
我在这里做错了什么?实现这个的正确方法是什么?
谢谢。
在此语句中传递有效标记而不是 null
addToBackStack(null)
假设您正在使用支持片段,您必须在 Activity 中使用 getSupportFragmentManager()
。使用 getFragmentManager()
您将获得本机片段管理器。但是,在support fragment 类, getFragmentManager()
returns support fragment manager中,可能有点混乱。