问题描述
有些用户在举报,如果他们使用通知栏中的快速操作,他们会被强制关闭.
Some users are reporting, if they use the quick action in the notification bar, they are getting a force close.
我在调用 "TestDialog" 类的通知中显示了一个快速操作.在 TestDialog 类中按下贪睡"按钮后,我将显示贪睡对话框.
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");
}
错误是*IllegalStateException: Can not perform this action after onSaveInstanceState*.
触发 IllegarStateException 的代码行是:
snoozeDialog.show(fm, "snooze_dialog");
该类正在扩展FragmentActivity",而SnoozeDialog"类正在扩展DialogFragment".
The class is extending "FragmentActivity" and the "SnoozeDialog" class is extending "DialogFragment".
这是错误的完整堆栈跟踪:
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?
推荐答案
这很常见 问题.我们通过在 DialogFragment 扩展类中重写 show() 和处理异常解决了这个问题
This is common issue. We solved this issue by overriding show() and handling exception in DialogFragment extended class
public class CustomDialogFragment extends DialogFragment {
@Override
public void show(FragmentManager manager, String tag) {
try {
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit();
} catch (IllegalStateException e) {
Log.d("ABSDIALOGFRAG", "Exception", e);
}
}
}
请注意,应用此方法不会改变 DialogFragment.class 的内部字段:
Note that applying this method will not alter the internal fields of the DialogFragment.class:
boolean mDismissed;
boolean mShownByMe;
在某些情况下,这可能会导致意外结果.最好使用 commitAllowingStateLoss() 而不是 commit()
This may lead to unexpected results in some cases. Better use commitAllowingStateLoss() instead of commit()
这篇关于在显示对话框时,我得到“在 onSaveInstanceState 之后无法执行此操作";的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)