Android Google Maps v2:点击监听器没有响应

时间:2013-09-05 07:00:20

标签: android google-maps google-maps-android-api-2

我正在尝试在用户点击地图时添加标记。我在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 个答案:

答案 0 :(得分: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);
    }
});

请注意,onActivityCreated中调用了getMap(),如果不使用自定义布局,则不需要inflater.inflate(R.layout.map, container, false)

你甚至不需要map.xml布局!

您正在延长SupportMapFragment,但是您正在为另一个MapView(不是默认情况下绑定到SupportMapFragment的那个)充气,这就是您没有在地图中查看更改的原因。因为您使用View获取的默认getMap(),但您正在查看另一个。请参阅docs about getMap()

public final GoogleMap getMap ()
     

获取与此包装的视图关联的基础GoogleMap   片段。

希望它有所帮助;)

答案 1 :(得分:2)

你正在为你的地图放置一个听众,但你需要为你的标记做一个听众。

map.setOnMarkerClickListener(this);

...

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

或标记之上的InfoWindows:

map.setOnInfoWindowClickListener(this);

此外,您初始化地图使其显示卫星几乎是正确的:

map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

将其更改为:

map.setMapType(GoogleMap.MAP_TYPE_HYBRID);

答案 2 :(得分:1)

而不是做map = getMap(),后来几行我有了这段代码:

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

所以我只是把代码放在那一行上面就完成了。

答案 3 :(得分: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);
    }
}