web-dev-qa-db-ja.com

さまざまなマーカーアクションを使用してAPIv2をマップします

アプリケーションを新しいGoogleMaps API v2に移植しようとしていますが、マーカーを操作するときに問題が発生します。

私のコンテキスト:バスとバス停を示す地図があります。古いライブラリでは、バス停用に独自のItemizedOverlayを、バス用にもう1つ持っていました。それぞれに異なるOnTapListenerがあり(実際には、バルーンを表示するために外部ライブラリを使用しています)、ユーザーがバスマーカーをタップしても何も起こりませんが、バス停マーカーをタップすると、その情報を含むアクティビティが開きます。また、ItemizedOverlayで、各マーカーをモデルのバス停オブジェクトにマッピングしました。

新しいAPIでは、2つの主な問題があります。

  • GoogleMapオブジェクトのsetOnInfoWindowClickListener()またはsetOnMarkerClickListener()メソッドを使用してリスナーを設定します。つまり、マップ全体で1つのリスナーしか設定できないため、バス停とバスのタップを区別できません。
  • 両方のマーカーのonClickメソッドは、Markerオブジェクトのみを受け取ります。このオブジェクトから、バス停番号などの情報を取得してアクティビティを開くことができません(タイトル文字列を解析するよりも良い方法があることを願っています!O_O)

これらの2つの問題は、Markerの異なるサブクラスを使用して解決できると思いますが、コンストラクターがなく、マップに追加するときに参照を取得するため、カスタム実装を使用できるかどうかわかりません。

APIは新しいため、同様の問題に関する情報はWeb上にあまりありません。私はこれを解決する方法を見つけようとしてきましたが、何も得られませんでした。誰かがこれに対する可能な解決策を知っていますか?

ありがとう。

編集:2種類のマーカーが付いた現在のアプリケーションのマップのスクリーンショット: A screenshot from my current application's map with two types of marker

20
Sloy

私もこの問題に遭遇しました。私の解決策は:

_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)を追加しました。

23
rockgecko

これが私が使用することに決めたソリューションであり、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());.
   ...
}
18
martinpelant

マーカーのgetIdメソッドを使用できます

2
ignacio_gs

そのように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;
}
0
Ciro Mine