web-dev-qa-db-fra.com

MapFragment ou MapView getMap () renvoie null sur Lollipop

J'utilise Google Maps API v2 depuis longtemps sur Android 4.x versions sans problème. Maintenant, j'ai installé la dernière version de Lollipop sur mes appareils Nexus (5 et 7) en essayant de se matérialiser) l'application.

Je voudrais souligner que tout va bien sur KitKiat et le problème que je décris n'apparaît que sur Lollipop.

Dans mon code source XML, j'utilise MapFragment (bibliothèque des services Google Play version 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"/>

Dans Java code, je remplace la méthode OnPause () pour atteindre la carte:

GoogleMap map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

Sur cette ligne, il lève NullPointerException. Dans le débogueur, l'application peut trouver des fragments, mais elle ne peut pas renvoyer GoogleMap. J'ai également essayé d'utiliser MapView. Il jette également null. La chose la plus étrange pour moi est que la carte se charge sans problème sur l'application elle-même, mais dans le code, je ne peux pas l'atteindre pour travailler avec.

19
mroczis

J'ai eu exactement le même problème mais c'est ce qui a fonctionné pour moi:

Remplacez ceci ...

GoogleMap map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

avec ça...

GoogleMap map = getMapFragment().getMap();

puis glissez ce mauvais garçon et donnez-lui un tourbillon ...

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);
}
60
Rhisiart

Google a maintenant créé un moyen plus pratique pour obtenir la carte en utilisant la méthode suivante

    myMapFragment.getMapAsync(new OnMapReadyCallback) {
         @Override
         public void onMapReady(GoogleMap googleMap) {
             myMap = googleMap;
         }
    });
13
Exception

Il semble que cela puisse être un problème avec une version targetSdk de 21: https://code.google.com/p/Android-developer-preview/issues/detail?id=1947

Cependant, le passage à getChildFragmentManager () a fonctionné pour moi:

findFragmentById pour SupportMapFragment renvoie null dans Android Studio

3
bubastis

Avez-vous essayé isGooglePlayServicesAvailable pour vérifier pourquoi son retour est nul? null a de nombreuses raisons sur getmap, essayez de l'utiliser pour vérifier pourquoi il donne null

1
iGoDa