2014/12/20

Google Maps Android API v2 の Marker は Drag 後に Position がアップデートされない

Google Maps Android API v2 では以下のようにドラッグ可能な Marker を作ることができます。

Marker marker = mGoogleMap.addMarker(
        new MarkerOptions()
                .position(location)
                .draggable(true));


GoogleMap クラスは Marker の情報を保存しておいてくれないので、上記のように作成した Marker のインスタンスは何らかの形で自分で保持しておかないといけないという制約があります。
ところが、Marker をドラッグ後に Marker#getPosition() を呼んでも、ドラッグ前の Position しか取得できません。 「ドラッグした」というイベントを捕まえて、自分で更新しないといけないようですちょっとイマイチな仕様だと思うのは私だけでしょうか…?


具体的には以下のような実装で、ドラッグ後のインスタンスに差し替えればよいかと思います。
// 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);
    }
};


0 件のコメント: