【发布时间】:2014-06-11 05:36:31
【问题描述】:
我在 stackoverflow 上发现了很多类似的问题,但他们的解决方案在我的情况下不起作用。它们尤其与onSaveInstanceState 方法和支持库有关。
我有 Activity 在一个事件上运行此代码:
MyDialogFragment.showMyDialog(name, this, this);
name参数是String对象。第二个参数(this)是刚刚的Activity 类对象,第三个参数(也是this)是简单的接口。这个我的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)
一般来说,这是重现我的异常的步骤:
- 输入
Activity- 收到事件,因此显示MyDialogFragment。 - 按否定按钮关闭对话框。
- 再次输入
Activity- 再次显示MyDialogFragment。 - 在 EditText 中键入一些代码。
- 此时验证需要一些时间。与服务器等连接,并返回否定结果。所以需要再次显示
MyDialogFragment。但此刻我遇到了异常。
但是,当我跳过第二点并开始输入错误代码进行验证时,MyDialogFragment 将毫无问题地显示出来。奇怪的行为。
我尝试过使用非静态方法setRetainInstance(true) 和commitAllowingStateLoss。但是没有区别。
【问题讨论】:
-
你能发布你的Dialog的showMyDialog方法吗?
-
@kupsef 我在我的问题中发布的这个方法的主体。如您所见,这只是两行代码。
-
如果您使用支持库,您必须调用 getSupportFragmentManager 而不是 getFragmentManager。此外,如果您在片段内,则必须使用 getChildFragmentManager。
-
@MattiaFranchetto 感谢您的建议,但我没有使用支持库
标签: android android-fragments android-dialogfragment illegalstateexception