MapFragment или MapView getMap() возвращает null на Lollipop
Я давно использую Google Maps API v2 в версиях Android 4.x без проблем. Теперь я установил последнюю версию Lollipop на свои устройства Nexus (5 и 7), пытаясь материализовать приложение.
Я хочу отметить, что все в порядке с KitKiat, и проблема, которую я описываю, появляется только на Lollipop.
В моем исходном коде XML я использую MapFragment (библиотека Google Play Services версии 6.1.11).
<fragment android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"/>
В Java-коде я переопределяю метод OnPause() для достижения карты:
GoogleMap map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
В этой строке он выдает исключение NullPointerException. В приложении отладчика можно найти фрагмент, однако он не сможет вернуть GoogleMap. Я также пытался использовать MapView. Он также выбрасывает null.
Самое странное для меня - это то, что карта загружается без проблем на самом приложении, но в коде, который я не могу достичь, чтобы работать с ним.
Ответы
Ответ 1
У меня была точно такая же проблема, но это то, что сработало для меня:
Заменить это...
GoogleMap map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
с этим...
GoogleMap map = getMapFragment().getMap();
затем проскользните этого плохого мальчика и дайте ему вихрь...
private MapFragment getMapFragment() {
FragmentManager fm = null;
Log.d(TAG, "sdk: " + Build.VERSION.SDK_INT);
Log.d(TAG, "release: " + Build.VERSION.RELEASE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
Log.d(TAG, "using getFragmentManager");
fm = getFragmentManager();
} else {
Log.d(TAG, "using getChildFragmentManager");
fm = getChildFragmentManager();
}
return (MapFragment) fm.findFragmentById(R.id.map);
}
Ответ 2
Google теперь сделал более удобный способ получить карту, используя следующий метод
myMapFragment.getMapAsync(new OnMapReadyCallback) {
@Override
public void onMapReady(GoogleMap googleMap) {
myMap = googleMap;
}
});
Ответ 3
Похоже, это может быть проблемой с targetSdkVersion 21:
https://code.google.com/p/android-developer-preview/issues/detail?id=1947
Однако переход на getChildFragmentManager() работал у меня:
findFragmentById для SupportMapFragment возвращает null в Android Studio
Ответ 4
Вы пробовали isGooglePlayServicesAvailable, чтобы проверить, почему его возвращающий null? null имеет много причин для getmap, попробуйте использовать это, чтобы проверить, почему его значение null