IllegalArgumentException: width and height must be > 0 during zoomOut in Google MapView
I'm trying to zoom in on a Google MapView on step in the oncreateMethod of my Activity. Everytime I try to zoom the map via the mapController I get an IllegalArgumentException:
04-15 10:16:51.012: ERROR/AndroidRuntime(528): java.lang.RuntimeException: Unable to start activity ComponentInfo{android.client/android.client.ui.showstores.StoreMap}: java.lang.IllegalArgumentException: width and height must be > 0
This Exception is thrown if I call the zoomOut or zoomIn function of MapController. Sadly the zoomIn function I'm using does not take any arguments.
The onCreateMethod where I'm calling the zoom functions looks like this:
mapView = (MapView) findViewById(R.id.map);
mapView.setBuiltInZoomControls(true);
MapController mapController = mapVie开发者_如何学编程w.getController();
mapController.zoomIn();
I'm a little bit at loss here because I'm doing nothing special.
The whole stacktrace is:
04-15 10:16:51.012: ERROR/AndroidRuntime(528): java.lang.RuntimeException: Unable to start activity ComponentInfo{android.client/android.client.ui.showstores.StoreMap}: java.lang.IllegalArgumentException: width and height must be > 0
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.os.Handler.dispatchMessage(Handler.java:99)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.os.Looper.loop(Looper.java:123)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.app.ActivityThread.main(ActivityThread.java:4203)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at java.lang.reflect.Method.invokeNative(Native Method)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at java.lang.reflect.Method.invoke(Method.java:521)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at dalvik.system.NativeStart.main(Native Method)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): Caused by: java.lang.IllegalArgumentException: width and height must be > 0
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.graphics.Bitmap.nativeCreate(Native Method)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at com.google.android.maps.ZoomHelper.createSnapshot(ZoomHelper.java:305)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at com.google.android.maps.ZoomHelper.doZoom(ZoomHelper.java:137)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at com.google.android.maps.ZoomHelper.doZoom(ZoomHelper.java:126)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at com.google.android.maps.MapView.doZoom(MapView.java:1459)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at com.google.android.maps.MapView.doZoom(MapView.java:1468)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at com.google.android.maps.MapController.zoomIn(MapController.java:427)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.client.ui.showstores.StoreMap.onCreate(StoreMap.java:58)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
04-15 10:16:51.012: ERROR/AndroidRuntime(528): ... 11 more
I found a workaround for that situation.
int zoomSteps = 2;
int currentLatitudeSpan = mMapView.getLatitudeSpan();
int currentLongitudeSpan = mMapView.getLongitudeSpan();
int zoomedLatitudeSpan = 2 * zoomSteps * currentLatitudeSpan;
int zoomedLongitudeSpan = 2 * zoomSteps * currentLongitudeSpan;
mMapController.zoomToSpan(zoomedLatitudeSpan, zoomedLongitudeSpan);'
This snippet zooms the map twice
Android doesn't set the width and height of views until later, so it'll be 0 in onCreate. I think views specify their sizes in a method called "onLayoutChanged" or something similar, maybe you can override it and do the zoom there.
You might try to call the zoom methods in onWindowFocusChanged(boolean hasFocus) instead of onCreate or onResume.
精彩评论