アプリケーションを新しいGoogleMaps API v2に移植しようとしていますが、マーカーを操作するときに問題が発生します。
私のコンテキスト:バスとバス停を示す地図があります。古いライブラリでは、バス停用に独自のItemizedOverlayを、バス用にもう1つ持っていました。それぞれに異なるOnTapListenerがあり(実際には、バルーンを表示するために外部ライブラリを使用しています)、ユーザーがバスマーカーをタップしても何も起こりませんが、バス停マーカーをタップすると、その情報を含むアクティビティが開きます。また、ItemizedOverlayで、各マーカーをモデルのバス停オブジェクトにマッピングしました。
新しいAPIでは、2つの主な問題があります。
これらの2つの問題は、Markerの異なるサブクラスを使用して解決できると思いますが、コンストラクターがなく、マップに追加するときに参照を取得するため、カスタム実装を使用できるかどうかわかりません。
APIは新しいため、同様の問題に関する情報はWeb上にあまりありません。私はこれを解決する方法を見つけようとしてきましたが、何も得られませんでした。誰かがこれに対する可能な解決策を知っていますか?
ありがとう。
編集:2種類のマーカーが付いた現在のアプリケーションのマップのスクリーンショット:
私もこの問題に遭遇しました。私の解決策は:
_private Map<Marker, MyModel> markerMap = new HashMap<>();
private GoogleMap mMap;
private void doMarkers(){
MarkerOptions opt = new MarkerOptions();
//Fill out opt from MyModel
Marker marker = mMap.addMarker(opt);
markerMap.put(marker, myModel);
}
_
次に、OnMarkerClickListenerコールバックで、クリックされたマーカーを使用してHashMapからモデルを引き出します。何らかの理由で文字列を返すメソッドMarker.getId()もあります。マーカーを作成するときにintidを指定できない理由、またはマーカーオブジェクトをマップに追加する前にアクセスできない理由がわかりません。
更新:ほぼ4年 Googleは任意のデータをマーカーに関連付けるためのメソッドMarker.setTag(Object tag)
を追加しました。
これが私が使用することに決めたソリューションであり、AFAIKはどのような状況でも機能するはずです。
private HashMap<String, MyModel> markers= new HashMap<String, MyModel>();
MyModel item = ...
MarkerOptions markerOptions = ...
markers.put(mMap.addMarker(markerOptions).getId(), item);
@Override
public void onInfoWindowClick(Marker marker) {
MyModel mapItem = (MyModel) markers.get(marker.getId());.
...
}
マーカーのgetId
メソッドを使用できます
そのようにHashMarkerを使用できます。この例では、Arraylist内のy個のチャージポイントと各ポイントは、座標を持つ新しいArrayListを含みます。そして、アイデアはあなたがデポイントIDを取得することです。
HashMapを作成する
マーカー= new HashMap();
次に、マーカーを作成してマップに追加します
最終マーカーマーカー= map.addMarker(new MarkerOptions()。position(new LatLng(coordinates.get(j).getLat()、coordinates.get(j).getLon()))。title(point.getName()) );
次に、ポイントIDをマーカー値とともに保存できます
Markers.put(marker、point.getId());
そして最後に、InfoWindowをクリックするとid値を取得できます
public void onInfoWindowClick(マーカーマーカー){
final long id = Marcadores.get(marker);
Log.e("Real Marker ID", id+"");
}
OR
マーカーをクリックすると
public boolean onMarkerClick(Marker arg0){
final long id = Marcadores.get(marker);
Log.e("Real Marker ID", id+"");
return false;
}