2014/12/20
Google Maps Android API v2 の Marker は Drag 後に Position がアップデートされない
1 2 3 4 | Marker marker = mGoogleMap.addMarker( new MarkerOptions() .position(location) .draggable( true )); |
GoogleMap クラスは Marker の情報を保存しておいてくれないので、上記のように作成した Marker のインスタンスは何らかの形で自分で保持しておかないといけないという制約があります。
ところが、Marker をドラッグ後に
Marker#getPosition()
を呼んでも、ドラッグ前の Position しか取得できません。
「ドラッグした」というイベントを捕まえて、自分で更新しないといけないようです1。具体的には以下のような実装で、ドラッグ後のインスタンスに差し替えればよいかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | // Marker を保持するための Map private Map<String, Marker> mMarkers = new HashMap<>(); @Override public void onActivityCreated( @Nullable final Bundle savedInstanceState) { super .onActivityCreated(savedInstanceState); mMapView.getMapAsync( new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // ドラッグ検知用のリスナ登録 googleMap.setOnMarkerDragListener(mOnMarkerDragListener); // 地図上に Marker を表示し、mMarkers に保持する for (LatLng location : mLocations) { Marker marker = googleMap.addMarker( new MarkerOptions() .position(location) .draggable( true )); mMarkers.put(marker.getId(), marker); } } }); } private final GoogleMap.OnMarkerDragListener mOnMarkerDragListener = new GoogleMap.OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker marker) { } @Override public void onMarkerDrag(Marker marker) { } @Override public void onMarkerDragEnd(Marker marker) { // ドラッグが終わったら、インスタンスを差し替える mMarkers.put(marker.getId(), marker); } }; |