MapView onTap问题:android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌null不适用于应用程序

时间:2012-08-23 07:44:22

标签: android android-mapview android-alertdialog itemizedoverlay android-context

对此有similar questions,但是对于试图为MapView实现onTap事件的某人(比如我)来说问题可能并不明显。问题/问题是:

您正尝试在MapView中实现自定义的ItemizedOverlay,如下所示:

MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, mContext);

通常情况下,如果您是从活动中执行此操作,则只需使用:

MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, this);

这是您可以在各种教程中找到的一行(包括Google的HelloItemizedOverlay示例),您可能已经从其中一个中复制了它。但是,如果您尝试将此代码移动到活动的主线程以外的任何位置(例如,移动到AyncTask中),则this将无效。如果您认为(就像我一样)将this更改为getBaseContext()getApplicationContext(),那么当您尝试在MapView中点击ItemizedOverlay时,您将遇到以下错误:

08-23 09:59:21.444: E/AndroidRuntime(30056): FATAL EXCEPTION: main
08-23 09:59:21.444: E/AndroidRuntime(30056): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
08-23 09:59:21.444: E/AndroidRuntime(30056):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:589)
08-23 09:59:21.444: E/AndroidRuntime(30056):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326)
08-23 09:59:21.444: E/AndroidRuntime(30056):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
08-23 09:59:21.444: E/AndroidRuntime(30056):    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
08-23 09:59:21.444: E/AndroidRuntime(30056):    at android.app.Dialog.show(Dialog.java:277)
08-23 09:59:21.444: E/AndroidRuntime(30056):    at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
08-23 09:59:21.444: E/AndroidRuntime(30056):    at com.myapp.MyCustomItemizedOverlay.onTap(MyCustomItemizedOverlay.java:32)

此错误的原因是什么,以及如何解决?

2 个答案:

答案 0 :(得分:3)

问题在于您需要指定将显示ItemizedOverlay的 Activity上下文,而不是Application上下文。从错误消息中可以立即清楚地看到这一点,我相信这种混乱的根源可以在Google的MapView Tutorial错误中找到。当您应该引用将显示ItemizedOverlay的活动上下文时,它明确表示引用应用程序上下文。因此,您可以通过将上面引用的行更改为:

来解决此问题
MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, MyActivity.this);

甚至更好:

MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, mapView.getContext());

其中mapView是实际显示ItemizedOverlay的MapView实例。

答案 1 :(得分:1)

创建警告对话框时遇到问题...通过将'getApplicationContext()'更改为'MyActivity.this'来解决....

感谢@robguinness:D