-1

このチュートリアルに従って、少し異なるものを作成しました。このチュートリアルでは、事前定義されたアイテムが挿入されたオーバーレイがどのように機能するかを示しましたが、アイテムを動的に追加したい場合はどうすればよいですか? 次に、空のオーバーレイから開始する必要があります。

それ以外の :

MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);

GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
itemizedoverlay.addOverlay(overlayitem);

mapOverlays.add(itemizedoverlay);

これはチュートリアルで期待したとおりに機能します。これを配置する必要があります。

MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);
mapOverlays.add(itemizedoverlay);

アイテムによるオーバーレイの初期化を省略します。

このアプローチはマップのスタックにつながり、数回タップした後、null 例外が原因でアプリが追い出されます。

1.これは予想される動作ですか? それは私にはバグのようです...

2.期待される動作を実現するにはどうすればよいですか?(空のオーバーレイから始めて、項目を動的に追加できます)

そして、私が達成したいのは、アイテムでオーバーレイを開始するのではなく、addOverlayを動的に使用することです。このようにして、

4

1 に答える 1

2

私が理解している限り、ItemOverlayあなたが意味するのはItemizedOverlay. もしそうなら、あなたは正しい軌道に乗っています。ItemizedOverlayはマップ アイテムのコンテナーであるため、アイテムを追加/削除するたびに、ItemizedOverlay最後にフォーカスされたアイテムを に設定し、メソッドを-1呼び出しpopulate()てコンテンツの変更についてマップビューに通知する必要があります。

ItemizedOverlayUI スレッド コンテキストでコンテンツを変更する必要があることを覚えておいてください;)

ここにも文書化されていないトリックがあります。アイテムがない場合でも、最後にフォーカスされたインデックスを設定して実行する必要があります(したがって、初期化段階でこれを行う必要があり-1ます)populate()

したがって、コードは次のようになります。

MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);
mapOverlays.add(itemizedoverlay);

setLastFocusedIndex(-1); //reset initial position
populate(); //notify about our content


//now try to add new item
GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
itemizedoverlay.addOverlay(overlayitem);
setLastFocusedIndex(-1); //reset initial position
populate(); //notify about our content
于 2012-08-16T17:24:29.700 に答える