3

类似的问题,但对于试图为 MapView 实现 onTap 事件的人(如我)来说,问题出在哪里可能并不明显。问题/问题是这样的:

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

MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, mContext);

通常,如果您从活动中执行此操作,则使用以下内容就足够了:

MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, this);

这是您可以在各种教程(包括 Google 的 HelloItemizedOverlay 示例)中找到的一行,您可能已经从其中一个教程中复制了它。但是,如果您尝试将此代码移动到活动主线程以外的任何位置(例如,移动到 AyncTask 中),this则将无法工作。如果您认为(像我一样)更改thisgetBaseContext()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)

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

4

2 回答 2

3

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

MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, MyActivity.this);

甚至更好:

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

mapView实际显示 ItemizedOverlay 的 MapView 实例在哪里。

于 2012-08-23T07:44:22.167 回答
1

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

感谢@robguinness :D

于 2013-01-22T07:07:59.323 回答