IllegalStateException: View size is too small after padding

那年仲夏 提交于 2019-12-04 03:09:44

From the documentation

Do not change the camera with this camera update until the map has undergone layout (in order for this method to correctly determine the appropriate bounding box and zoom level, the map must have a size). Otherwise an IllegalStateException will be thrown. It is NOT sufficient for the map to be available (i.e. getMap() returns a non-null object); the view containing the map must have also undergone layout such that its dimensions have been determined. If you cannot be sure that this has occured, use newLatLngBounds(LatLngBounds, int, int, int) instead and provide the dimensions of the map manually.

Thus, your problem may be that the map doesn't have a size when you are calling mapa.animateCamera(cameraUpdate) or mapa.moveCamera(cameraUpdate).

Anyway, as you say that the exception is being thrown when you rotate your device, I would say that the real issue is that the padding that you are using when calling newLatLngBounds (ViewUtils.dpAPixeles(MARKERS_DP_OFFSET, contexto)) is causing problems (maybe the padding is bigger than the View's height / 2?). There is a registered issue (4773) related to Google Maps that may help you solve your problem. As stated there, one possible workaround is to set the cameraUpdate depending on the orientation:

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    cu = CameraUpdateFactory.newLatLngBounds(bounds, ViewUtils.dpAPixeles(MARKERS_DP_OFFSET, contexto));
} else {
    // Use another method to get your camera update, for example CameraUpdateFactory.newLatLng(latLng);
}

I have tried a lot of the solution but none of them really solve my problem which was the padding exceeds the actual size of the map.

my solution is to but a small padding and then zoom out to give the same result.

this code is from my app and it works fine for me.

    public static void fitThePoints(GoogleMap map, ArrayList<LatLng> points) {
    //Calculate the markers to get their position
    LatLngBounds.Builder b = new LatLngBounds.Builder();
    for (LatLng point : points) b.include(point);

    //Change the padding as per needed
    map.moveCamera(CameraUpdateFactory.newLatLngBounds(b.build(), ConvertUtils.dp2px(30)));
    map.moveCamera(CameraUpdateFactory.zoomTo(map.getCameraPosition().zoom - 0.5f));
}

Set padding 300 to 150. it working for me.

  map.animateCamera(
                CameraUpdateFactory.newLatLngBounds(boundsLatLongs, 150),
                1000, null);

Had the error with react-native-maps

Solution was to give the map view component a minimum width and height, as it was being laid out before its parent view was.

For Android, I have also tried various solutions and finally found the main reason behind the crash.

The Main Reason behind the crash is Split Screen Support/Multi-Window support in Android 7 - 7.1.2 (API: 24 – 25).

LatLngBounds with padding set based on the percentage of the device width so that it works on small devices. This works even on small devices with 4inch displays, however, it fails in multi-window mode in Android 7.0 and devices that support multi-window mode before that, eg. Galaxy S7.

The solution is to choose the minimum metric between width and height since in Multi-window mode the height can be smaller than the width:

final int width = getResources().getDisplayMetrics().widthPixels;
final int height = getResources().getDisplayMetrics().heightPixels;
final int minMetric = Math.min(width, height);
final int padding = (int) (minMetric * paddingPercentage);

You can choose the padding percentage based on your requirements.

For Move Camera,

googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(), width, height, padding));

For Animate Camera,

googleMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(), width, height, padding));
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!