有类似的问题,但对于试图为 MapView 实现 onTap 事件的人(如我)来说,问题出在哪里可能并不明显。问题/问题是这样的:
您正在尝试在 MapView 中实现自定义的 ItemizedOverlay,如下所示:
MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, mContext);
通常,如果您从活动中执行此操作,则使用以下内容就足够了:
MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, this);
这是您可以在各种教程(包括 Google 的 HelloItemizedOverlay 示例)中找到的一行,您可能已经从其中一个教程中复制了它。但是,如果您尝试将此代码移动到活动主线程以外的任何位置(例如,移动到 AyncTask 中),this
则将无法工作。如果您认为(像我一样)更改this
为getBaseContext()
or 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)
此错误的原因是什么,您如何解决?