【问题标题】:MapView onTap issue: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an applicationMapView onTap 问题:android.view.WindowManager$BadTokenException:无法添加窗口——令牌 null 不适用于应用程序
【发布时间】:2012-08-23 07:44:22
【问题描述】:

这里有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)

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

【问题讨论】:

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


    【解决方案1】:

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

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

    甚至更好:

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

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

    【讨论】:

      【解决方案2】:

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

      感谢@robguinness :D

      【讨论】:

        猜你喜欢
        • 2011-02-07
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 2019-01-04
        • 2011-12-17
        相关资源
        最近更新 更多