当活动不在屏幕上时,显示DialogFragment会抛出异常

时间:2017-03-16 20:33:50

标签: android android-activity android-dialogfragment

我在一个名为CounterActivity的活动中,一个计数器,让我们假设从100下降到0,第二个间隔。当计数器变为0时显示DialogFrament,如下所示:

MessageFragment dialog = new MessageFragment();
dialog.show(getSupportFragmentManager(), "MessageFragment");

该活动的主要布局具有以下属性集android:keepScreenOn="true",这样只要活动可见,屏幕就不会超时。如果我再打开另一个应用程序,则会在CounterActivity上调用onStop。如果仍在后台运行的计数器变为0而不是显示DialogFragment,则抛出以下异常:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

1 个答案:

答案 0 :(得分:0)

当您的活动因屏幕原因而未显示在屏幕上时,您无法进行片段交易(您的活动可能会被杀死然后恢复,因此,不会再次进行任何UI更改)。

因此,当您的活动未激活时,您必须避免任何UI更改。您有多种解决方案来处理问题: 1 - 你可以简单地注册一个布尔“showDialogOnResume”,然后覆盖你的“public void onResume()”:

Timestamps

如果你在活动中这样做(不是在片段中),我强烈建议改为覆盖“onPostResume()”。看看this post,特别是jed回答和pjv评论。

甚至可能发生你没有打电话的事情:

@Override
public void onResume() {
    super.onResume();
    if(showDialogOnResume) {
        /*build your dialog here*/
        dialog.show(getSupportFragmentManager(), "MessageFragment");
    }
}

在你的“onActivityResult()”上;正如苏菲安在评论中对杰德的回答所说的那样。

基本上:避免在活动生命周期中任何UI更改。仅在您的活动处于活动状态时才允许。如果您不能这样做(其他线程,如AsyncTasks),请获取答案,以某种方式保存,并对您的活动结果执行更改。因为如果用户从未恢复您的活动,则无需进行更改。