java.lang.NullPointerException:未初始化CameraUpdateFactory,在“onResume”上调用方法

时间:2014-11-04 07:46:25

标签: android android-fragments android-mapview android-maps-v2

我将从Detail Activity中获取数据,因此我在“onResume”上更新了Map,并且它在animateCamera方法上崩溃了。我尝试了SO中提供的所有解决方案。请找到以下代码:

异常:java.lang.NullPointerException:未初始化CameraUpdateFactory

private void zoomToShowAllMarkers(final GoogleMap map) {

        final LatLngBounds.Builder builder = new LatLngBounds.Builder();
        for (MapLocations marker : arrMarkers) {
            final LatLng pos = new LatLng(marker.getLatitude(),marker.getLongitude());
             builder.include(pos);
            map.addMarker(new MarkerOptions().position(pos));

              map.animateCamera(CameraUpdateFactory.newLatLngZoom(pos, 17.0f));

        }
}


public void onResume() {
        super.onResume();
        if(mapView!=null &&  mapView.isShown())
        mapView.onResume();
        zoomToShowAllMarkers(map);
    }

3 个答案:

答案 0 :(得分:2)

来自http://developer.android.com/reference/com/google/android/gms/maps/CameraUpdateFactory.html

  

在使用此类中的任何方法之前,您必须执行其中一个方法   以下是为了确保初始化此类:

     
      
  • 等待GoogleMap从您添加到应用程序的MapFragmentMapView开始提供。您可以通过调用GoogleMap方法并检查返回的对象是否为空来验证getMap()是否可用。
  •   
  • 致电initialize(Context)。只要不GooglePlayServicesNotAvailableException抛出,这个类就会   正确初始化。
  •   

你必须确保它已被初始化,然后才能调用它上面的任何方法。

答案 1 :(得分:1)

我认为您应该将zoomToShowAllMarkers(map);方法放在if声明下,因为当您尝试使用animateCamera时,mapView可能是null,如下所示:

public void onResume() {
    super.onResume();
    if(mapView!=null &&  mapView.isShown()) {
        mapView.onResume();
        zoomToShowAllMarkers(map);
    }
}

答案 2 :(得分:0)

我正在测试的设备有一个过时的Google Play服务版本。为了避免空指针,我只是对null进行了简单的检查。当用户尝试访问地图时,他们会收到提示,说明他们已经过时了。

private void setupMap() {
    final GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

    MapsInitializer.initialize(this);

    double lat = getIntent().getDoubleExtra("lat", 37.6329946);
    double lng = getIntent().getDoubleExtra("lng", -122.4938344);
    float zoom = getIntent().getFloatExtra("zoom", 15);

    LatLng position = new LatLng(lat, lng);
    if(null != map) {
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, zoom));
        map.addMarker(new MarkerOptions().position(position));

        map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
            @Override
            public void onMapLoaded() {
                map.snapshot(new GoogleMap.SnapshotReadyCallback() {
                    @Override
                    public void onSnapshotReady(Bitmap bitmap) {
                        mapLoaded(bitmap);
                    }
                });
            }
        });
    }
}