对此有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)
此错误的原因是什么,以及如何解决?
答案 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