Почему moveCamera вызывает исключение при вызове вне метода getMapAsync?

#android #google-maps

#Android #google-карты

Вопрос:

Я работаю над приложением, которое позволяет пользователям размещать теги на карте Google. Для этого мне нужно иметь возможность перемещать положение камеры карты в определенные координаты широты / долготы. Вот связанные методы:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_map_screen, container, false);
    mMapFrag = (SupportFragmentManager) getChildFragmentManager().findFragmentById(R.id.mapFragment);
    mMapFrag.getMapAsync(this);
    CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(mLat, mLon));
    mMap.moveCamera(center);
    return view;
}

@Override
public void onResume() {
    super.onResume();
    mMapFrag = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
    mMapFrag.getMapAsync(this);
    CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(mLat, mLon));
    mMap.moveCamera(center);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
}
  

moveCamera() вызывает исключение NullPointerException. У кого-нибудь есть представление о том, почему это происходит?

Комментарии:

1. Похоже, у вас уже есть mMap переменная экземпляра уровня класса. Зачем вообще использовать объект GoogleMap в качестве параметра в вашей moveMapCamera() функции? Просто используйте mMap вместо этого.

2. Да, вы правы. На самом деле у меня нет этого метода в моем коде. Вместо этого я вызываю это в методе onCreate. Может ли это иметь какое-то отношение к проблеме?

3. Я пытался использовать getMapAsync() и обратный вызов onMapReady() для создания экземпляра карты. Похоже, это все еще не работает. У меня такое ощущение, что обратный вызов onMapReady() занимает слишком много времени. Есть ли способ дождаться завершения обратного вызова onMapReady() перед выполнением дополнительного кода?

Ответ №1:

Обратный вызов onMapReady() выдает раздутый / сгенерированный объект map, который вы можете использовать в своем коде, который является асинхронным обратным вызовом. До этого объект map остается неинициализированным.

 @Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    map.moveCamera(center);
}
  

измените onMapReady() код с помощью приведенного выше фрагмента.

Кроме того, если вы хотите сделать это и в вашем onResume, вы можете проверить, равен ли объект map нулю и равен ли он нулю

 if(mapFrag == null){
    mapFrag = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
    mapFrag.getMapAsync(this)
}
  

Используйте приведенный выше фрагмент в вашем onResume()
Это должно сработать.

Ответ №2:

Переместите эту строку в onMapReady .. После инициализации переменной map.

 map.moveCamera(center);
  

В противном случае отображение равно нулю. Не имеет значения, какой метод вы для него вызвали. Там, где он у вас сейчас есть, будет null.

Кроме того, выберите правильную переменную mMap or map для использования. Затем вы также захотите выполнить инициализацию mapFrag в onCreateView . У вас есть строка для поиска фрагмента, но вы ничего с ним не делаете