Карты Google с использованием фрагментов

Я использую карты Google фрагментами (Navigation Drawer). При запуске приложения отображается первый фрагмент с картами Google. Я инициализировал карты Google в методе onViewCreated. В первый раз он показывает, что карты Google прекрасно соответствуют моему местоположению, но когда я выбираю другой фрагмент и возвращаюсь к этому фрагменту, он выдает исключение нулевого указателя.

Здесь в коде возникает исключение:

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, zoom));

Метод:

private void moveCamera(LatLng latLng, float zoom, String title) {
    Log.d(TAG, "moveCamera:  moving the camera to:   " + latLng.latitude + " lon " + latLng.longitude);

    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, zoom));
}

Метод OnViewCreated:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    getLocation();

    mapView =  view.findViewById(R.id.map);
    mapView.onCreate(savedInstanceState);
    mapView.onResume();
    mapView.getMapAsync(this);
}

Метод OnMapReady:

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    mMap.setMyLocationEnabled(true);
    init();
}

private void getLocation() {
    Log.d(TAG, "getDeviceLocation: getting the current device's location");
    mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(getContext());

    try {
        if (mLocationGranted) {

            Task location = mFusedLocationProviderClient.getLastLocation();
            location.addOnCompleteListener(new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {

                    if (task.isSuccessful()) {
                        Log.d(TAG, "device location found");
                        currentLocation = (Location) task.getResult();
                        moveCamera(new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()), DEFAULT_ZOOM, "My Location");
                    } else {
                        Log.d(TAG, "onComplete:  current location is null");
                        Toast.makeText(getContext(), "unable to get current location", Toast.LENGTH_SHORT).show();
                        getLocationPermissions();

                    }
                }
            });
        }

    } catch (SecurityException e) {
        Log.e(TAG, "SecurityException :  " + e.getMessage());
    }


}

Ошибка

Exception: java.lang.NullPointerException: Attempt to invoke virtual method 
void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.map.CameraUpdate) 
on a null object reference`

person Community    schedule 27.06.2018    source источник
comment
где вы вызываете свой метод moveCamera ()?   -  person Ruan_Lopes    schedule 27.06.2018
comment
Внутри метода getLocation   -  person    schedule 27.06.2018
comment
Я обновил код. Пожалуйста, посмотрите   -  person    schedule 27.06.2018


Ответы (1)


Вы получаете NullPointerException, потому что ваша карта не готова, когда вы пытаетесь переместить ее камеру.

Вы можете попробовать сделать следующее

@Override
public void onMapReady(GoogleMap googleMap) {

  mMap = googleMap;
  mMap.setMyLocationEnabled(true);
  init();

  getLocation();

}

делая это, ваш код просто попытается переместить камеру карты, когда карта будет доступна, или изменить логику вашего кода и удалить ваш moveCamere() из метода getLocation() и, например, поместить его в onResume()

person Ruan_Lopes    schedule 27.06.2018