Подтвердить что ты не робот

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. Самое странное для меня - это то, что карта загружается без проблем на самом приложении, но в коде, который я не могу достичь, чтобы работать с ним.

4b9b3361

Ответ 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;
         }
    });

Ответ 4

Вы пробовали isGooglePlayServicesAvailable, чтобы проверить, почему его возвращающий null? null имеет много причин для getmap, попробуйте использовать это, чтобы проверить, почему его значение null