微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – IllegalStateException:活动已被销毁 – 当应用程序再次尝试再次显示DialogFragment时

我在stackoverflow上发现了很多类似的问题,但是解决方案在我的情况下不起作用.它们与onSaveInstanceState方法支持库特别相连.

我有一个事件运行的Activity这个代码

MyDialogFragment.showMyDialog(name,this,this);

name参数是String对象.第二个参数(这个)就是Activity类的对象,第三个也是简单的接口.这个我的Activity实现了这个接口. showMyDialog()当然是静态方法.这是它的身体:

MyDialogFragment fragment = new MyDialogFragment(listener,"Hello " + name);
fragment.show(activity.getFragmentManager(),"myDialog");

这是第一次尝试的工作.但在第二个我得到这个例外:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.myapp,PID: 20759
java.lang.IllegalStateException: Activity has been destroyed
        at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1345)
        at android.app.BackStackRecord.commitInternal(BackStackRecord.java:597)
        at android.app.BackStackRecord.commit(BackStackRecord.java:575)
        at android.app.DialogFragment.show(DialogFragment.java:230)
        at com.example.myapp.view.dialog.MyDialogFragment.showMyDialog(MyDialogFragment.java:41)
        at com.example.myapp.MyActivity.showMyDialog(MyActivity.java:208)
        at com.example.myapp.MyActivity.onEvent(MyActivity.java:232)
        at com.example.myapp.MyActivity.handleMessage(MyActivity.java:89)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

一般来说,这是重现我的例外的步骤:

>输入活动 – 收到事件,显示MyDialogFragment.
>按负号按钮关闭对话框.
>再次输入活动 – 再次显示MyDialogFragment.
>键入一些代码到EditText.
>此时验证需要一些时间.与服务器连接等,并返回否定结果.所以需要再次显示MyDialogFragment.但在这一刻,我变得异常了.

但是,当我跳过第二点并开始输入错误代码进行验证时,MyDialogFragment将显示没有任何问题.奇怪的行为

我试过非静态方法,setRetainInstance(true)和commitAllowingStateLoss.但没有什么区别.

解决方法

这有点奇怪 – 或者只是这个Android功能错误.我已经添加块尝试捕获以这种方式捕获抛出异常:
MyDialogFragment fragment = new MyDialogFragment(listener,"Hello " + name);
try {
    fragment.show(activity.getFragmentManager(),"myDialog");
} catch (Exception e) {
    e.printstacktrace();
}

当然,异常仍然是抛出(并且捕捉在这一刻),有趣的是我的对话片段正在以正确的方式重新创建,用户可以与之进行交互.

原文地址:https://www.jb51.cc/android/312816.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐