来自 Fragment 的 onBackPressed 显示 Activity 两次
onBackPressed from Fragment Displays Activity Twice
我有一个最小 SDK 21、目标 25 的应用程序。使用:android.app.DialogFragment
和 android.support.v7.app.AppCompatActivity.
最初的 Activity
是一个启动器,它可以启动 3 个活动中的 1 个和 1 个 DialogFragment
。 DialogFragment
可以依次启动 Activity
(这是 3 个活动之一)。我遇到的问题仅与正在加载的 DialogFragment
和该片段然后加载应用程序然后 returning 到启动器有关。
当 Fragment
return 立即进入 Launcher(无需加载 Activity
)时,此操作正常。我可以检测到 Fragment
是通过启动器加载的,并且 onBackPress()
可以正常处理它。
但是,当Fragment
加载另一个Activity
然后onBackPress()
用于return到Fragment
然后onBackPress()
习惯return到启动器,我有问题。目前处理这种情况的方式是 Fragment
使用标志 FLAG_ACTIVITY_CLEAR_TASK
和 FLAG_ACTIVITY_NEW_TASK
以及 FLAG_ACTIVITY_CLEAR_TOP
通过 Intent
加载启动器(这似乎是解决某人类似问题的方法)。我已经尝试了这些标志的其他变体,也没有使用这些标志。我还尝试在 DialogFragment
中使用 onBackPress()
而不使用 Intent 加载 Activity
,应用程序终止,我需要它 return启动器。
在这种情况下,使用这些标志,当我 return 到启动器时,启动器显示然后清除然后重新显示(在另一个 onBackPress()
上,应用程序然后正确终止)。问题是启动器显示两次。我假设首先显示的 Launcher 是加载的原始副本,然后被新副本替换。我还没有找到一种方法(在这种情况下)加载启动器的原始副本(如果这实际上是正在发生的事情)。如前所述,这是 DialogFragment
.
如何解决这个问题,使 Launcher Activity 在这种情况下不显示两次?
为什么不直接将 return 片段中的 activity 完成到启动器 activity?
如果你真的必须使用一个意图,试试Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
尝试重写 onBackPressed()
方法,如下所示:
@Override
public void onBackPressed() {
int count = fragmentManager.getBackStackEntryCount();
if (count == 1) {
finish();
} else {
fragmentManager.popBackStack();
}
}
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStackImmediate();
}
else {
super.onBackPressed();
}
在 onBackPressed()
方法中使用它。
我有一个最小 SDK 21、目标 25 的应用程序。使用:android.app.DialogFragment
和 android.support.v7.app.AppCompatActivity.
最初的 Activity
是一个启动器,它可以启动 3 个活动中的 1 个和 1 个 DialogFragment
。 DialogFragment
可以依次启动 Activity
(这是 3 个活动之一)。我遇到的问题仅与正在加载的 DialogFragment
和该片段然后加载应用程序然后 returning 到启动器有关。
当 Fragment
return 立即进入 Launcher(无需加载 Activity
)时,此操作正常。我可以检测到 Fragment
是通过启动器加载的,并且 onBackPress()
可以正常处理它。
但是,当Fragment
加载另一个Activity
然后onBackPress()
用于return到Fragment
然后onBackPress()
习惯return到启动器,我有问题。目前处理这种情况的方式是 Fragment
使用标志 FLAG_ACTIVITY_CLEAR_TASK
和 FLAG_ACTIVITY_NEW_TASK
以及 FLAG_ACTIVITY_CLEAR_TOP
通过 Intent
加载启动器(这似乎是解决某人类似问题的方法)。我已经尝试了这些标志的其他变体,也没有使用这些标志。我还尝试在 DialogFragment
中使用 onBackPress()
而不使用 Intent 加载 Activity
,应用程序终止,我需要它 return启动器。
在这种情况下,使用这些标志,当我 return 到启动器时,启动器显示然后清除然后重新显示(在另一个 onBackPress()
上,应用程序然后正确终止)。问题是启动器显示两次。我假设首先显示的 Launcher 是加载的原始副本,然后被新副本替换。我还没有找到一种方法(在这种情况下)加载启动器的原始副本(如果这实际上是正在发生的事情)。如前所述,这是 DialogFragment
.
如何解决这个问题,使 Launcher Activity 在这种情况下不显示两次?
为什么不直接将 return 片段中的 activity 完成到启动器 activity?
如果你真的必须使用一个意图,试试Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
尝试重写 onBackPressed()
方法,如下所示:
@Override
public void onBackPressed() {
int count = fragmentManager.getBackStackEntryCount();
if (count == 1) {
finish();
} else {
fragmentManager.popBackStack();
}
}
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStackImmediate();
}
else {
super.onBackPressed();
}
在 onBackPressed()
方法中使用它。