我正在尝试在用户点击地图时添加标记。我在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
被覆盖或因为它不起作用而被覆盖,而地图不是卫星。
有人能帮助我吗?
答案 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);
}
}