我正在使用新的Android Google Maps API

我创建一个包含MapFragment的 Activity 。在 Activity onResume中,我将标记设置为GoogleMap对象,然后为包含所有标记的 map 定义边界框。

这使用以下伪代码:

LatLngBounds.Builder builder = new LatLngBounds.Builder();
while(data) {
   LatLng latlng = getPosition();
   builder.include(latlng);
}
CameraUpdate cameraUpdate = CameraUpdateFactory
   .newLatLngBounds(builder.build(), 10);
map.moveCamera(cameraUpdate);

调用map.moveCamera()会使我的应用程序崩溃,并带有以下堆栈:
Caused by: java.lang.IllegalStateException:
    Map size should not be 0. Most likely, layout has not yet

    at maps.am.r.b(Unknown Source)
    at maps.y.q.a(Unknown Source)
    at maps.y.au.a(Unknown Source)
    at maps.y.ae.moveCamera(Unknown Source)
    at com.google.android.gms.maps.internal.IGoogleMapDelegate$Stub
        .onTransact(IGoogleMapDelegate.java:83)
    at android.os.Binder.transact(Binder.java:310)
    at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a
        .moveCamera(Unknown Source)
    at com.google.android.gms.maps.GoogleMap.moveCamera(Unknown Source)
    at ShowMapActivity.drawMapMarkers(ShowMapActivity.java:91)
    at ShowMapActivity.onResume(ShowMapActivity.java:58)
    at android.app.Instrumentation
        .callActivityOnResume(Instrumentation.java:1185)
    at android.app.Activity.performResume(Activity.java:5182)
    at android.app.ActivityThread
        .performResumeActivity(ActivityThread.java:2732)

如果-我使用newLatLngBounds()方法而不是newLatLngZoom()工厂方法,则不会发生相同的陷阱。
onResume是将标记绘制到GoogleMap对象上的最佳位置吗?还是我应该绘制标记并将相机位置设置在其他位置?

最佳答案

您可以在 OnCameraChangeListener 中使用简单的 newLatLngBounds 方法。一切都会正常工作,您无需计算屏幕尺寸。 map 大小计算后发生此事件(据我了解)。

例:

map.setOnCameraChangeListener(new OnCameraChangeListener() {

    @Override
    public void onCameraChange(CameraPosition arg0) {
        // Move camera.
        map.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 10));
        // Remove listener to prevent position reset on camera move.
        map.setOnCameraChangeListener(null);
    }
});

08-15 21:32