等到谷歌地图在MapFragment中有大小

时间:2014-01-27 14:42:34

标签: android google-maps google-maps-android-api-2

我的活动在LinearLayout中包含MapFragment。我做了以下

在onCreate中

  • 我在onCreate方法中使用setContentView来扩展此布局 我的活动。
  • 使用GoogleMap
  • 获取getMap()的句柄
onStart中的

  • 我从SQLite数据库中获取了一些位置坐标
  • 将相应的标记添加到地图
  • 将这些积分添加到LatLngBounds.Builder
  • 使用newLatLngBounds(Builder.build(), 10)
  • 为相机设置动画

根据maps api参考,我不应该在确保地图有大小之前调用newLatLngBounds(LatLngBounds bounds, int padding)。我确实在这一点上得到了IllegalStateException。但等到地图有大小的正确方法是什么?

3 个答案:

答案 0 :(得分:11)

solution by rusmus对我不起作用。我改用了这个:

    map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
        @Override
        public void onMapLoaded() {
            map.animateCamera(cameraUpdate);
        }
    });

如果您知道地图大小,则可以避免在显示地图之前等待并移动相机。我们最终使用显示尺寸作为地图尺寸的近似值(但如果您想要更精确,可以找出确切的尺寸):

    final DisplayMetrics display = getResources().getDisplayMetrics();
    final int padding = display.widthPixels / 20;
    final CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(
        boundsBuilder.build(), display.widthPixels, display.heightPixels, padding);
    map.moveCamera(cameraUpdate);

答案 1 :(得分:8)

我过去成功使用过以下代码:

final LatLngBounds.Builder builder = new LatLngBounds.Builder();
final View mapView = fragment.getView();
final GoogleMap map = fragment.getMap():

//Add points to builder. And get bounds...
final LatLngBounds bounds = builder.build();

// Pan to see all markers in view.
// Cannot zoom to bounds until the map has a size.

if (mapView.getViewTreeObserver().isAlive()) {
    mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        public void onGlobalLayout() {
            mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50), 1500, null);         
        }
    });
}

答案 2 :(得分:1)

使用最新的Google服务,您可以使用MapFragment.getMapAsync。 直接来自文档

  

设置一个回调对象,该对象将在准备好使用GoogleMap实例时触发。