activity 不在屏幕上时显示 DialogFragment 会引发异常
Showing DialogFragment throws exception when activity is not on screen
我在一个名为 CounterActivity
的 Activity 中有一个计数器,可以说从 100 到 0 有第二个间隔。当计数器变为 0 时显示 DialogFrament
,如下所示:
MessageFragment dialog = new MessageFragment();
dialog.show(getSupportFragmentManager(), "MessageFragment");
activity 的主布局设置了以下属性 android:keepScreenOn="true"
,这样只要 activity 可见,屏幕就不会超时。如果我随后打开另一个应用程序,则会在 CounterActivity
上调用 onStop。如果在后台仍为 运行 的计数器变为 0 而不是显示 DialogFragment,则会抛出以下异常:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
当您的 activity 由于 UI 原因不在屏幕上时,您无法进行片段交易(您的 activity 可能会被杀死然后恢复,因此,任何 UI 更改不会再制作了)。
因此,当您的 activity 未激活时,您必须避免任何 UI 更改。您有多种解决方案来处理问题:
1-您可以简单地注册一个布尔值 "showDialogOnResume",然后覆盖您的 "public void onResume()" :
@Override
public void onResume() {
super.onResume();
if(showDialogOnResume) {
/*build your dialog here*/
dialog.show(getSupportFragmentManager(), "MessageFragment");
}
}
如果您在 activity(不是片段)中执行此操作,我强烈建议您改为覆盖 "onPostResume()"。查看 this post 尤其是 jed answer 和 pjv 评论。
您甚至可能没有打电话 :
super.onActivityResult();
在你的 "onActivityResult()" 上;正如 Sufian 在对 jed answer 的评论中所说。
基本上:避免在 activity 生命周期内进行任何 UI 更改。仅当您的 activity 处于活动状态时允许它。如果您不能这样做(其他线程如 AsyncTasks),请获取答案,以某种方式保存它,然后对 activity 结果执行更改。因为如果用户永远不会恢复您的 activity,您就不需要进行更改。
我在一个名为 CounterActivity
的 Activity 中有一个计数器,可以说从 100 到 0 有第二个间隔。当计数器变为 0 时显示 DialogFrament
,如下所示:
MessageFragment dialog = new MessageFragment();
dialog.show(getSupportFragmentManager(), "MessageFragment");
activity 的主布局设置了以下属性 android:keepScreenOn="true"
,这样只要 activity 可见,屏幕就不会超时。如果我随后打开另一个应用程序,则会在 CounterActivity
上调用 onStop。如果在后台仍为 运行 的计数器变为 0 而不是显示 DialogFragment,则会抛出以下异常:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
当您的 activity 由于 UI 原因不在屏幕上时,您无法进行片段交易(您的 activity 可能会被杀死然后恢复,因此,任何 UI 更改不会再制作了)。
因此,当您的 activity 未激活时,您必须避免任何 UI 更改。您有多种解决方案来处理问题: 1-您可以简单地注册一个布尔值 "showDialogOnResume",然后覆盖您的 "public void onResume()" :
@Override
public void onResume() {
super.onResume();
if(showDialogOnResume) {
/*build your dialog here*/
dialog.show(getSupportFragmentManager(), "MessageFragment");
}
}
如果您在 activity(不是片段)中执行此操作,我强烈建议您改为覆盖 "onPostResume()"。查看 this post 尤其是 jed answer 和 pjv 评论。
您甚至可能没有打电话 :
super.onActivityResult();
在你的 "onActivityResult()" 上;正如 Sufian 在对 jed answer 的评论中所说。
基本上:避免在 activity 生命周期内进行任何 UI 更改。仅当您的 activity 处于活动状态时允许它。如果您不能这样做(其他线程如 AsyncTasks),请获取答案,以某种方式保存它,然后对 activity 结果执行更改。因为如果用户永远不会恢复您的 activity,您就不需要进行更改。