7

ユーザーが地図をクリックしたときにマーカーを配置しようとしています。SupportMapFragmentの中で を使用していActionBarActivityます。しかし地図が反応せず、しかもmap.setMapType()操作がうまくいかない。

これが私のコードです:

private GoogleMap map;
private Marker marker;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    ActionBarActivity activity = (ActionBarActivity) getActivity();
    activity.getSupportActionBar().setTitle(R.string.select_location);
    super.onCreateView(inflater, container, savedInstanceState);
    return inflater.inflate(R.layout.map, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Log.d("Map","On view created");
    map = getMap();
            map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
    map.setOnMapClickListener(new OnMapClickListener() {

        @Override
        public void onMapClick(LatLng point) {
            Log.d("Map","Map clicked");
            marker.remove();
            drawMarker(point);
        }
    });

         ...
         Location location = locationManager.getLastKnownLocation(provider);

        if(location!=null){
           //PLACE THE INITIAL MARKER              
           drawMarker(new LatLng(location.getLatitude(),location.getLongitude()));
        }
}

Logcat は「on view created」メッセージを表示しており、マップにはマーカーで現在の場所が表示されているため、コードの最後の部分が実行されています。しかし、onMapClickListenerそれは機能せず、マップは衛星ではないため、オーバーライドされているか何かです。

誰でも私を助けることができますか?

4

4 に答える 4

15

SupportMapFragment を拡張した場合は、次のように簡単に実行できます。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ActionBarActivity activity = (ActionBarActivity) getActivity();
    activity.getSupportActionBar().setTitle(R.string.select_location);  
    return super.onCreateView(inflater, container, savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);

  map = getMap();
  map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
  map.setOnMapClickListener(new OnMapClickListener() {

    @Override
    public void onMapClick(LatLng point) {
        Log.d("Map","Map clicked");
        marker.remove();
        drawMarker(point);
    }
});

getMap() が呼び出されonActivityCreatedinflater.inflate(R.layout.map, container, false)カスタム レイアウトを使用しない場合は必要ないことに注意してください。

map.xml レイアウトも必要ありません!

拡張SupportMapFragmentしているが、別のものMapView(SupportMapFragmentデフォルトで関連付けられているものではない) を拡張しているため、マップに変更が表示されていません。デフォルトのView取得元で操作してgetMap()いたが、別のものを表示しているためです。getMap() に関するドキュメントを参照してください。

public final GoogleMap getMap ()

このフラグメントによってラップされたビューに関連付けられている、基になる GoogleMap を取得します。

それが役に立てば幸い ;)

于 2013-09-05T07:32:21.933 に答える
2

マップのリスナーを配置していますが、マーカーのリスナーを作成する必要があります。

map.setOnMarkerClickListener(this);

...

@Override
public boolean onMarkerClick(Marker arg0) {     
    Log.i(TAG,"marker arg0 = "+arg0);               
    return false;
}

またはマーカーの上にある InfoWindow の場合:

map.setOnInfoWindowClickListener(this);

また、サテライトを表示するマップの初期化はほぼ正しいです。

map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

次のように変更します。

map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
于 2013-09-05T08:32:21.190 に答える
1

map = getMap() を実行する代わりに、数行後に次のコードを作成しました。

        SupportMapFragment fm = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map);
        map = fm.getMap();

そのため、その行の上にコードを配置しただけで完了です。

于 2013-09-05T07:25:06.563 に答える
0

map = getMap() を実行する代わりに、これを試すことができます。

if (map == null) {
    // Try to obtain the map from the SupportMapFragment.
    this.map = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapView))
        .getMap();
    setUpMap(lat, longi, R.drawable.marker2, title);
}

private void setUpMap(double lat, double lng, int drawableResource, String title) {
    if(map != null) {
        marker = map.addMarker(new MarkerOptions().position(new LatLng(lat, lng))
                .title(title)
                .icon(BitmapDescriptorFactory.fromResource(drawableResource)));
        geocoder = new Geocoder(this, Locale.getDefault());
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 15));
        map.animateCamera(CameraUpdateFactory.zoomTo(13), 2500, null);
    }
}
于 2013-09-05T08:19:54.163 に答える