#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
. У вас есть строка для поиска фрагмента, но вы ничего с ним не делаете