我在我的应用中使用了maps api v2
。我必须在地图上显示我当前的位置和目标位置,以便两个位置在屏幕上可见(在最大可能的缩放级别)。这是我到目前为止所尝试的......
googleMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.mapFragment)).getMap();
if(googleMap != null){
googleMap.setMyLocationEnabled(true);
LatLng targetLocationLatLng = new LatLng(modelObject.getLattitude(), modelObject.getLongitude());
LatLng currentLocationLatLng = new LatLng(this.currentLocationLattitude, this.currentLocationLongitude);
googleMap.addMarker(new MarkerOptions().position(targetLocationLatLng).title(modelObject.getLocationName()).icon(BitmapDescriptorFactory.fromResource(R.drawable.location_icon)));
LatLngBounds bounds = new LatLngBounds(currentLocationLatLng, targetLocationLatLng);
googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 3));
}
应用程序由于以下原因而强行关闭:
java.lang.IllegalStateException:
Map
大小不应为0.很可能,地图视图尚未显示layout
。
如何获得最大可能的缩放级别?请帮帮我。
答案 0 :(得分:19)
在我的项目中,我使用com.google.android.gms.maps.model.LatLngBounds.Builder
根据您的源代码,它应该如下所示:
Builder boundsBuilder = new LatLngBounds.Builder();
boundsBuilder.include(currentLocationLatLng);
boundsBuilder.include(targetLocationLatLng);
// pan to see all markers on map:
LatLngBounds bounds = boundsBuilder.build();
googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 3));
答案 1 :(得分:1)
避免此问题的一个好方法是将ViewTreeObserver用于包含地图片段和侦听器的布局,以确保首次使用addOnGlobalLayoutListener初始化布局(并且没有宽度= 0),如下所示:
private void zoomMapToLatLngBounds(final LinearLayout layout,final GoogleMap mMap, final LatLngBounds bounds){
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds,OVERVIEW_MAP_PADDING));
}
});
}