21

アプリケーションを新しい Google Maps API v2 に移植しようとしていますが、マーカーの操作に問題があります。

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

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

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

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

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

ありがとう。

編集: 2 種類のマーカーを使用した現在のアプリケーションのマップのスクリーンショット: 2 種類のマーカーを含む現在のアプリケーションのマップのスクリーンショット

4

4 に答える 4

24

私もこの問題に遭遇しました。私の解決策は次のとおりです。

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() もあります。マーカーを作成するときに int id を指定できない理由、またはマーカー オブジェクトをマップに追加する前にアクセスできない理由がわかりません。

更新: ほぼ4 年後、Google はMarker.setTag(Object tag)任意のデータをマーカーに関連付ける方法を追加しました。

于 2012-12-05T00:10:06.423 に答える
18

これが私が使用することに決めたソリューションであり、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());.
   ...
}
于 2012-12-06T19:16:13.907 に答える
2

マーカーのgetId方法を使用できます

于 2012-12-05T10:06:12.447 に答える