Android RuntimeException onCreateDialog 没有为 id 创建对话框
我有一个应用程序,您可以使用它来显示和关闭多个对话框:
showDialog(...)
removeDialog(...)
我稍微玩了一下该应用程序,当屏幕上没有任何对话框时,我按下菜单按钮,然后转到主 Android 屏幕。
一段时间后,我再次进入我的应用程序,有时,我会收到此 RuntimeException:
java.lang.IllegalArgumentException: Activity#onCreateDialog did not create a dialog for id 4
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
at android.app.ActivityThread.access$2200(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4595)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Activity#onCreateDialog did not create a dialog for id 4
at android.app.Activity.createDialog(Activity.java:878)
at android.app.Activity.restoreManagedDialogs(Activity.java:867)
at android.app.Activity.performRestoreInstanceState(Activity.java:815)
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1096)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2565)
... 11 more
Any idea?
非常感谢。
更新,更多信息:
当前的 onCreateDialog 实现是:
protected Dialog onCreateDialog(int id){
Builder b = new AlertDialog.Builder(this);
if(id == 4){
b.setMessage(...);
b.setItems(items, new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
Intent i = new Intent(Current.this, Another.class);
startActivity(i);
}
});
return b.create();
}
return null;
}
为了调用此函数,我这样做:
removeDialog(4);
showDialog(4);
I've an application that you can show and close several Dialogs with:
showDialog(...)
removeDialog(...)
I play a little bit with the application and when there is no any Dialog on the screen, I press the menu button and I go to the main android screen.
After a while, I enter again into my application and sometimes, I get this RuntimeException:
java.lang.IllegalArgumentException: Activity#onCreateDialog did not create a dialog for id 4
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
at android.app.ActivityThread.access$2200(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4595)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Activity#onCreateDialog did not create a dialog for id 4
at android.app.Activity.createDialog(Activity.java:878)
at android.app.Activity.restoreManagedDialogs(Activity.java:867)
at android.app.Activity.performRestoreInstanceState(Activity.java:815)
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1096)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2565)
... 11 more
Any idea?
Thank you very much.
UPDATE, more information:
The current onCreateDialog implementation is:
protected Dialog onCreateDialog(int id){
Builder b = new AlertDialog.Builder(this);
if(id == 4){
b.setMessage(...);
b.setItems(items, new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
Intent i = new Intent(Current.this, Another.class);
startActivity(i);
}
});
return b.create();
}
return null;
}
In order to call this function I do:
removeDialog(4);
showDialog(4);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您是否实现了此处所示的OnCreateDialog?当您第一次调用 showDialog(4) 时,将调用 OnCreateDialog(4),您需要创建对话框并从此方法返回它。
Have you implemented OnCreateDialog as presented here? When you call showDialog(4) for the first time, OnCreateDialog(4) will be called and you need to create the dialog and return it from this method.
您是否在
onCreateDialog
中正确返回对话框?如果您要在对话框创建中执行dialog.show(),但返回一些其他对话框,您可能会得到这样的结果。或者您是否在 onPrepareDialog 中对对话框对象进行任何类型的操作
Are you properly returning the dialog in
onCreateDialog
? If you were to do dialog.show() in dialog create but return some other dialog you could perhaps get a result like that.Or are you doing any sort of manipulation in of the dialog object in
onPrepareDialog
在 API 级别 8 中,
onCreateDialog(int)
为 已弃用,转而使用onCreateDialog(int,Bundle)
。如果您仅实现后一种方法并在 API 级别低于 8 的设备上运行应用程序,您会收到所描述的错误消息。解决方案是实现
onCreateDialog(int)
In API level 8,
onCreateDialog(int)
was deprecated in favor ofonCreateDialog(int,Bundle)
. If you implement only the latter method and run the app on a device with an API level lower than 8, you get the described error message.The solution is to implement
onCreateDialog(int)
对于SDK版本< 8、如果在 onCreateDialog 中返回 null,则会出现异常 java.lang.IllegalArgumentException。
For SDK version < 8, if you return null in onCreateDialog you get Exception java.lang.IllegalArgumentException.
在经历了同样的问题(并发现从
onPause
中调用removeDialog
无法可靠工作)后,我开发了一种似乎有效的解决方法(尽管这确实是一种黑客行为) 。如 grepcode 链接由 antslava 发布,在方法
performRestoreInstanceState
中,onRestoreInstanceState
在restoreManagedDialogs
之前调用,并传递相同的内容Bundle savingInstanceState
的实例。因此,有机会修改从
onRestoreInstanceState
方法中传递到restoreManagedDialogs
的Bundle savingInstanceState
。为了防止恢复任何和所有托管对话框,可以通过以下方式实现
onRestoreInstanceState
:这会导致
Bundle
由键"android:savedDialogs"< 引用/code> 从
Bundle savingInstanceState
中删除,这随后会导致对restoreManagedDialogs
的调用在发现找不到此键时立即返回:这将导致
onCreateDialog
在恢复活动时不会被调用,有效地“隐藏”任何对话框,从而防止发生必须从onCreateDialog
返回null
的情况。这不是“一刀切”的解决方案,但考虑到我的要求,它似乎符合要求。通过检查多个平台版本(1.6、2.1、2.2、2.2.2 和 4.0.3)的 grepcode 中的代码,在考虑到这些现有实现的情况下,该解决方案似乎应该能够一致地工作。
After experiencing this same issue (and finding that calling
removeDialog
from withinonPause
doesn't work reliably), I developed a workaround that seems to function (although it's admittedly a hack).As seen in the grepcode link posted by antslava, in method
performRestoreInstanceState
,onRestoreInstanceState
is called right beforerestoreManagedDialogs
and is passed the same instance ofBundle savedInstanceState
.Thus, there is opportunity to modify the
Bundle savedInstanceState
that is passed torestoreManagedDialogs
from within theonRestoreInstanceState
method.To prevent any and all managed dialogs from being restored, one could implement
onRestoreInstanceState
in the following way:This causes the
Bundle
referenced by key"android:savedDialogs"
to be removed fromBundle savedInstanceState
, which subsequently causes the call torestoreManagedDialogs
to immediately return when it finds that this key cannot be found:This will cause
onCreateDialog
to not be called while restoring the Activity, effectively "hiding" any dialogs, thus preventing the scenario where one must returnnull
fromonCreateDialog
from occurring.This isn't a 'one size fits all' solution, but given my requirements it seems to fit the bill. By reviewing the code in grepcode for several platform versions (1.6, 2.1, 2.2, 2.2.2, and 4.0.3), it appears that this solution should work consistently given these existing implementations.