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. Той също така хвърля нула. Най-странното нещо за мен е, че картата се зарежда без проблем в самото приложение, но в кода не мога да го достигна, за да работя с него.


comment
Бих проверил дали това е проблем с времето (Фрагментът все още не е създаден). Опитайте се да вземете фрагмента след известно забавяне за експеримент.   -  person Yaroslav Mytkalyk    schedule 27.10.2014
comment
Отговор на този въпрос е в тази връзка stackoverflow.com/a/22624155/706833 Надявам се, че помага;)   -  person iGoDa    schedule 27.10.2014
comment
@DoctororDrive - Опитах 3s цикъл без успех.   -  person mroczis    schedule 27.10.2014


Отговори (4)


Имах абсолютно същия проблем, но това е, което работи за мен:

Замени това...

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);
}
person Rhisiart    schedule 28.12.2014
comment
Благодаря много. Най-накрая това ми свърши работа. - person Kartik Sharma; 25.01.2015
comment
Това известен проблем на Lollipop ли е? - person Jay Sidri; 10.02.2015
comment
Перфектен отговор. Благодаря! - person edgarmiro; 13.02.2015
comment
@Rhisiart благодаря за отговора. Искам да знам още нещо. След като използвам този код..как ще се справим с backstack с този фрагмент в навигационното чекмедже...bcz след използване на този код onbackstack не работи с този фрагмент. - person Deep Singh; 18.07.2015
comment
@DeepSingh без повече подробности, всичко, което мога да ви кажа е, че моят фрагмент разширява com.google.android.gms.maps.MapFragment и се хоства в android.support.v13.app.FragmentTabHost заедно с 2 други android.widget.TabHost $TabSpec в android.app.Activity, насочен към android:targetSdkVersion=22. Можете да го видите в действие в рамките на това приложение (изберете „Намиране на събития в природата“ или „Намиране на събития“ от чекмеджето за навигация) - play.google.com/store/apps/ - person Rhisiart; 18.07.2015
comment
Иска ми се да мога да +1 няколко пъти за този отговор - person Shubham Chaudhary; 21.07.2015
comment
Опитвам се да внедря това решение, но то казва, че getChildFragmentManager е недефиниран. Аз съм вътре в дейност. Някой да ми помогне, моля? - person Frildoren; 25.11.2015
comment
Пич, ти ми спести времето. Благодаря много - person Ramachandra Reddy Avula; 22.06.2016

Google вече създаде по-удобен начин за получаване на картата чрез следния метод

    myMapFragment.getMapAsync(new OnMapReadyCallback) {
         @Override
         public void onMapReady(GoogleMap googleMap) {
             myMap = googleMap;
         }
    });
person Exception    schedule 27.04.2015
comment
Това беше правилният отговор в моя случай. Приетият отговор изглежда предполага, че MapFragment е null, което не е така според въпроса (във въпроса MapFragment не е null, но върнатата стойност на getMap() е null). - person BoD; 04.05.2015

Изглежда, че това може да е проблем с targetSdkVersion от 21: https://code.google.com/p/android-developer-preview/issues/detail?id=1947

Превключването към getChildFragmentManager() обаче работи за мен:

findFragmentById за SupportMapFragment връща null в Android Studio

person bubastis    schedule 24.11.2014

Опитвали ли сте isGooglePlayServicesAvailable, за да проверите защо връща нула? null има много причини за getmap, опитайте да използвате това, за да проверите защо дава null

person iGoDa    schedule 27.10.2014
comment
Да направих го. Най-накрая реших проблема си чрез повторно прилагане на MapView. Изглежда MapFragment изобщо не работи. - person mroczis; 27.10.2014
comment
@mroczis Можете ли просто да ми опишете как го поправихте? - person itsmewajid; 28.10.2014
comment
Все пак използвах MapView, настроих жизнения му цикъл (извикване на mMapView.onCreate() на onCreate() метод на дейност, mMapView.onPause() на onPause() на дейността и т.н.) и свърши работа. MapFragment изглежда не се прикачва към FragmentManager на Lollipop. - person mroczis; 28.10.2014