Lorsque j'utilise la version 6.5.87 des services Google Play, j'obtiens une exception de pointeur null lorsque j'appelle getMapAsync()
. J'utilise une SupportMapFragment
dans la présentation XML de ma Fragment
.
Mon code:
SupportMapFragment mapFragment = (SupportMapFragment) getActivity()
.getSupportFragmentManager().findFragmentById(R.id.mapFragment);
mapFragment.getMapAsync(this);
Remarque: Il n'y a aucun problème lorsque vous appelez getMap()
sur des versions antérieures des services Google Play, mais getMap()
est désormais obsolète ( docs ).
Voici la trace de la pile pour le NPE:
Java.lang.NullPointerException
at com.decos.fixi.fragments.FragmentLocationMap.initializeMap(FragmentLocationMap.Java:132)
at com.decos.fixi.fragments.FragmentLocationMap.onCreateView(FragmentLocationMap.Java:95)
at Android.support.v4.app.Fragment.performCreateView(Fragment.Java:1786)
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:947)
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1126)
at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:739)
at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1489)
at Android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.Java:454)
at Android.os.Handler.handleCallback(Handler.Java:615)
at Android.os.Handler.dispatchMessage(Handler.Java:92)
at Android.os.Looper.loop(Looper.Java:137)
at Android.app.ActivityThread.main(ActivityThread.Java:4921)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:511)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1027)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:794)
at dalvik.system.NativeStart.main(Native Method)
Enfin j'ai eu la réponse!
SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager()
.findFragmentById(R.id.mapFragment);
au lieu de
SupportMapFragment mapFragment = (SupportMapFragment) this.getSupportFragmentManager()
.findFragmentById(R.id.mapFragment);
getChildFragmentManager () a fait l'affaire.
En outre, si vous utilisez SupportMapFragment mapFragment = (SupportMapFragment).....
Assurez-vous ensuite que vous avez défini cet attribut class
dans XML
class="com.google.Android.gms.maps.SupportMapFragment"
Ne pas
class ="com.google.Android.gms.maps.MapFragment"
Dans AppCompatActivity, étendre
FragmentManager mFragmentManager = getSupportFragmentManager();
SupportMapFragment mVTMapFragment =(SupportMapFragment)mFragmentManager.findFragmentById(R.id.mapRideview);
mVTMapFragment.getMapAsync(this);
et implémenter la méthode de rappel onMapReady
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
setUpMap();
}
Avez-vous implémenté la fonction de rappel pour votre getMapAsync()
?
Sinon, vous devez implémenter la méthode onMapReady () dans votre code, puis vous pouvez ajouter des marqueurs ou déplacer des éléments de caméra dans votre méthode onMapReady()
.
Vous pouvez voir cet exemple à propos de onMapReady()
.
lancez votre programme en ajoutant ceci
SupportMapFragment supportMapFragment
AJOUTEZ CE dans SUR CREATE METHOD ()
supportMapFragment = SupportMapFragment.newInstance();
FragmentManager fm = getFragmentManager();
fm.beginTransaction().replace(R.id.maplayout, new MapFragmentClass()).commit();
supportMapFragment.getMapAsync(this);
Android.support.v4.app.FragmentManager sfm = getSupportFragmentManager();
sfm.beginTransaction().add(R.id.map,supportMapFragment).commit();
cela fonctionnera le vérifier