0

J'ai un FragmentActivity dans lequel je suis en train de charger la carte google. Et il implémente OnMapReadyCallBack et quand j'essaie de gonfler la carte, j'obtiens l'objet mapFragment mais l'application se bloque après l'appel de getMapAsync. Ci-dessous mon code:onMapReady ne pas être appelé: Google Map in FrgmentActivité: Android Studio

public class MapActivity extends FragmentActivity implements OnMapReadyCallback { 

    private GoogleMap googleMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_map); 

    initializeMap(); 
    } 

    private void initializeMap() { 
     if (googleMap == null) { 
      SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
      if(mapFragment!=null){ 
       mapFragment.getMapAsync(MapActivity.this); 
      } 

      // check if map is created successfully or not 
      if (null== googleMap) { 
       Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
     googleMap = map; 
     googleMap.setMyLocationEnabled(true); 
    } 
} 

J'ai essayé de degug et j'ai remarqué que je reçois l'objet mapFragment mais il n'a jamais atteint la méthode onMapReady qui fait mon objet googleMap nulle et les application se bloque lorsque toute méthode se rapportant à googleMap (par exemple setOnCameraChangeListener) est appelé. J'ai traversé le documentation page mais cela ne semble pas fonctionner dans mon projet.

Y a-t-il quelque chose que je pourrais manquer dans mon projet? Comment devrais-je surmonter cette erreur et arrêter l'application de planter.

TIA

EDIT 1:

Voici mon fragment de carte dans le fichier xml

<fragment 
    android:id="@+id/map" 
    class="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MapsActivity" 
    android:name="com.google.android.gms.maps.SupportMapFragment"/> 
+0

Pourriez-vous montrer votre carte R.layout.activity_map? – AlexTa

+0

Vérifiez ma modification dans la question. –

Répondre

2

L'indice est getMapAsync(asynchronous).

onMapReady n'est pas appelée immédiatement, ce qui signifie que googleMap ne sera pas défini avant l'appel de la méthode. Edit: Assurez-vous que vous ne faites pas de méthodes appelez googleMap avant de définir la valeur de la carte, c'est-à-dire ajoutez une vérification si elle est null avant d'exécuter une méthode dessus. Ajoutez également l'annotation @Nullable à private GoogleMap googleMap; pour faciliter le développement car le studio Android vous avertira s'il vous manque un contrôle nul.

+0

Alors, comment dois-je réorganiser mon code pour le faire fonctionner. Comme je suis déjà initier l'objet googleMap dans onMapReady. –

+0

Assurez-vous que rien n'utilise 'googleMap' avant qu'il ne soit défini, rappelez-vous que rien ne garantit que' googleMap' ne sera pas nul. – Ryan

+0

Merci ryan. La vérification de null sur googleMap m'a aidé à rectifier l'erreur. S'il vous plaît vérifier ma réponse pour la façon dont j'ai supprimé l'erreur. –

0

mapFragment.getMapAsync(MapActivity.this); signifie que la carte sera chargée asynchrone, et si le chargement terminé un rappel à onMapReady() volonté être fait.

Le code suivant ne fonctionnera probablement pas car la carte n'a pas encore fini de se charger. Vous devez configurer la carte à l'intérieur de la méthode onMapReady() et non à l'intérieur de initializeMap().

if (null == googleMap) { // googleMap will still be null here 
    Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT).show(); 
} 
+0

Alors, comment dois-je réorganiser mon code pour le faire fonctionner. Comme je suis déjà initier l'objet googleMap dans onMapReady pas avant cela. –

0

Bien. J'ai la solution. J'ai déplacé la méthode relative à googleMap, c'est-à-dire setOnCameraChangeListener, à onMapReady qui était précédemment appelée dans onCreate. L'objet googleMap dans onCreate était null, ce qui faisait planter l'application.

+0

Un tel hack laid! – AlexTa

+0

True. J'ai lutté sur cela pendant deux jours et ce hack simple l'a résolu –