3

これと同様の質問がありますが、 MapView の onTap イベントを実装しようとしている人 (私のような人) にとって、問題がどこにあるのかは明らかではないかもしれません。問題/質問はこれです:

次のように、カスタマイズされた ItemizedOverlay を MapView に実装しようとしています。

MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, mContext);

通常、アクティビティからこれを行う場合は、次を使用するだけで十分です。

MyCustomItemizedOverlay mOverlay = new MyCustomItemizedOverlay(drawable, this);

これは、さまざまなチュートリアル (Google の HelloItemizedOverlay の例を含む) で見つけることができる行であり、そのうちの 1 つからコピーした可能性があります。ただし、このコードをアクティビティのメイン スレッド以外の場所 (たとえば、AyncTask 内) に移動しようとすると、機能しthisません。(私のように)またはに変更しよthisうとすると、MapView で ItemizedOverlay をタップしようとすると、次のエラーが発生します。getBaseContext()getApplicationContext()

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 が表示されるアクティビティ コンテキストを指定する必要があるという事実にあります。これはエラー メッセージからすぐにはわかりませんが、この混乱の原因は 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 に答える