11

Android用に、Googleマップを搭載したアプリケーションを作成しています。画面にはたくさんのマーカーがあり、マーカーをクリックすると、各マーカーのカスタマイズ可能なバルーンを準備しています。つまり、クリックしたマーカーによって異なる情報を持っているということです。

setInfoWindowAdapter を使用してマーカーのビューの内容を設定し、メソッド getInfoContents をオーバーライドします。

問題は次のとおりです。このメソッドは情報ウィンドウのコンテンツの一般的な実装ですが、各マーカーは独自の情報を表示する必要があります。したがって、私が理解している限り、情報ウィンドウに表示するために必要な情報をデータ構造からロードするには、どのマーカーがクリックされたかを getInfoContents(Marker marker) で検出する必要があります。問題は、クリックされたマーカー「マーカー」が表すエンティティを特定するにはどうすればよいかということです。つまり、情報ウィンドウを表示するようにトリガーされた getInfoContents にオブジェクト マーカーだけがある場合、どの情報を表示するのが適切かをどのように検出できますか? 私は、marker.getTitle() を使用して文字列 Title を比較することについて考えましたが、これにより、情報ウィンドウに Title を表示する必要があり、これは望ましくありません。marker.getId() もありますが、そういうIDはAPIで生成されていて制御できません

何か案は?

4

5 に答える 5

23

への返信:

問題は、クリックされたマーカー「マーカー」が表すエンティティを特定するにはどうすればよいかということです。[...] marker.getId() もありますが、そのような ID は API によって生成され、制御できません。

あなたはそれを制御することができます。マーカーは addMarker() によって返されるため、その ID を取得して保存できます。コードは次のとおりです。

Map <String, Integer> markers = new HashMap<String, Integer>();

...

MarkerOptions mo = new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker))
.position(new LatLng(mLat, mLon))
.flat(true) 
.snippet("Click here for details")
.rotation(0)
.title(title);

マーカーをマップに追加するときは、その ID をコンテナに保存します

MyClass myObject = new MyClass(lat, lon); // The class that you are rendering on the map with Markers, for example "Monument"
Marker mkr = map.addMarker(mo);
markers.put(mkr.getId(), myObject.getId()); 

次に、マーカーをクリックすると、次のように「myObject」の id を回復できます

map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
    public void onInfoWindowClick(Marker marker) {
        int id = markers.get(marker.getId());
        // Now id contains which Monument (or your preferred class) was clicked                         
    }
});
于 2014-02-23T17:02:08.603 に答える
4

より良いオプションがあり、これはグーグルが提案するものです:

Tag :Objectマーカーに関連付けられた です。たとえば、 にはObject、マーカーが表すものに関するデータを含めることができます。これは、個別に保管するよりも簡単ですMap<Marker, Object>String別の例として、データ セットの ID に対応する IDを関連付けることができます。Google Maps Android API は、このプロパティの読み取りも書き込みも行いません。

ソース

したがって、次のようなことができます。

for (ListItem it: mList) {
    Marker mk = mMap.addMarker(new MarkerOptions().position(it.getLatLng()).title(it.getName()).snippet(it.getAddress()));
    mk.setTag(it.getID());
}

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        Integer id = (Integer) marker.getTag();
        return false;
    }
});
于 2017-09-20T06:24:45.430 に答える
-1
  map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
                public void onInfoWindowClick(Marker marker) {

                    double lat=marker.getPosition().latitude;
                    double lng=marker.getPosition().longitude;


                }
            });
于 2020-08-09T16:40:34.133 に答える