在显示对话框中,我得到“无法在onSaveInstanceState之后执行此操作” [英] On showing dialog i get "Can not perform this action after onSaveInstanceState"

查看:119
本文介绍了在显示对话框中,我得到“无法在onSaveInstanceState之后执行此操作”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有些用户正在报告,如果他们在通知栏中使用快速操作,他们将会关闭一个强制。



我在通知中显示一个快速的操作调用TestDialog类。
在TestDialog类按下snooze按钮后,我将显示SnoozeDialog。

  private View.OnClickListener btnSnoozeOnClick(){
return new View.OnClickListener(){

public void onClick(View v){
showSnoozeDialog();
}
};
}

private void showSnoozeDialog(){
FragmentManager fm = getSupportFragmentManager();
SnoozeDialog snoozeDialog = new SnoozeDialog();
snoozeDialog.show(fm,snooze_dialog);
}

错误是 IllegalStateException:在onSaveInstanceState



IllegarStateException被触发的代码行是:

  snoozeDialog.show(fm,snooze_dialog); 

该类扩展了FragmentActivity,SnoozeDialog类扩展了DialogFragment p>

以下是错误的完整堆栈跟踪:

  java.lang.IllegalStateException:在android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)上的onSaveInstanceState 
后无法执行此操作
在android.support.v4 .app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338)
在android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
在android.support.v4.app.BackStackRecord .commit(BackStackRecord.java:574)
在android.support.v4.app.DialogFragment.show(DialogFragment.java:127)
在com.test.testing.TestDialog.f(TestDialog.java :538)
at com.test.testing.TestDialog.e(TestDialog.java:524)
at com.test.testing.TestDialog.d(TestDialog.java:519)
at com.test.testing.g.onClick(TestDialog.java:648)
a t android.view.View.performClick(View.java:3620)
在android.view.View $ PerformClick.run(View.java:14292)
在android.os.Handler.handleCallback(Handler .java:605)
在android.os.Handler.dispatchMessage(Handler.java:92)
在android.os.Looper.loop(Looper.java:137)
在android。 app.ActivityThread.main(ActivityThread.java:4507)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511 )
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:790)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)

我无法重现此错误,但我收到了很多错误报告。



有人可以帮助我如何解决这个错误?

解决方案

这意味着你 commit() show()情况下的DialogFragment)片段之后 onSaveInstanceState()



Android将会将您的片段状态保存在 onSaveInstanceState()。所以,如果您在 onSaveInstanceState()片段状态之后的 commit()片段将丢失。



因此,如果Activity被杀死并重新创建,则片段不会添加到不好的用户体验的活动中。这就是为什么Android不会不惜一切代价造成国家损失的原因。



简单的解决方案是检查状态是否已保存。

  boolean mIsStateAlreadySaved = false; 
boolean mPendingShowDialog = false;

@Override
public void onResumeFragments(){
super.onResumeFragments();
mIsStateAlreadySaved = false;
if(mPendingShowDialog){
mPendingShowDialog = false;
showSnoozeDialog();
}
}

@Override
public void onPause(){
super.onPause();
mIsStateAlreadySaved = true;
}

private void showSnoozeDialog(){
if(mIsStateAlreadySaved){
mPendingShowDialog = true;
} else {
FragmentManager fm = getSupportFragmentManager();
SnoozeDialog snoozeDialog = new SnoozeDialog();
snoozeDialog.show(fm,snooze_dialog);
}
}

注意:onResumeFragments()将在片段恢复时调用。


Some user are reporting, if they use the quick action in the notification bar, they are getting a force close.

I show a quick action in the notification who calls the "TestDialog" class. In the TestDialog class after pressing the button "snooze", I will show the SnoozeDialog.

private View.OnClickListener btnSnoozeOnClick() {
    return new View.OnClickListener() {

        public void onClick(View v) {
            showSnoozeDialog();
        }
    };
}

private void showSnoozeDialog() {
    FragmentManager fm = getSupportFragmentManager();
    SnoozeDialog snoozeDialog = new SnoozeDialog();
    snoozeDialog.show(fm, "snooze_dialog");
}

The error is IllegalStateException: Can not perform this action after onSaveInstanceState.

The code line where the IllegarStateException gets fired is:

snoozeDialog.show(fm, "snooze_dialog");

The class is extending "FragmentActivity" and the "SnoozeDialog" class is extending "DialogFragment".

Here is the complete stack trace of the error:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:127)
at com.test.testing.TestDialog.f(TestDialog.java:538)
at com.test.testing.TestDialog.e(TestDialog.java:524)
at com.test.testing.TestDialog.d(TestDialog.java:519)
at com.test.testing.g.onClick(TestDialog.java:648)
at android.view.View.performClick(View.java:3620)
at android.view.View$PerformClick.run(View.java:14292)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4507)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)

I can't reproduce this error, but I am getting a lot of error reports.

Can anybody help that how can I fix this error?

解决方案

That mean you commit() (show() in case of DialogFragment) fragment after onSaveInstanceState().

Android will save your fragment state at onSaveInstanceState(). So, if you commit() fragment after onSaveInstanceState() fragment state will be lost.

As a result, if Activity get killed and recreate later the fragment will not add to activity which is bad user experience. That's why Android does not allow state loss at all costs.

The easy solution is to check whether state already saved.

boolean mIsStateAlreadySaved = false;
boolean mPendingShowDialog = false;

@Override
public void onResumeFragments(){
    super.onResumeFragments();
    mIsStateAlreadySaved = false;
    if(mPendingShowDialog){
        mPendingShowDialog = false;
        showSnoozeDialog();
    }
}

@Override
public void onPause() {
    super.onPause();
    mIsStateAlreadySaved = true;
}

private void showSnoozeDialog() {
    if(mIsStateAlreadySaved){
        mPendingShowDialog = true;
    }else{
        FragmentManager fm = getSupportFragmentManager();
        SnoozeDialog snoozeDialog = new SnoozeDialog();
        snoozeDialog.show(fm, "snooze_dialog");
    }
}

Note: onResumeFragments() will call when fragments resumed.

这篇关于在显示对话框中,我得到“无法在onSaveInstanceState之后执行此操作”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆