9
votes

dans Google Maps v2 ... fragment.getmap () retourne null

Je ne peux pas obtenir la carte! Tout ce que je peux obtenir est null.

Voici le code. p> xxx pré>

le manifeste: p> xxx pré>

voici le XML: p> xxx pré>

J'ai essayé de résoudre ce problème comme cette solution Google Maps Android Android API V2 lance GooglePlayServicesNOTAVAILAVAILIBLEEXCEPEXCEPEXCEPEXCEPException, obsolète, supportMapfragment.getMap () renvoie null .. mais n'a toujours pas travaillé p>

Mise à jour: P>

J'ai eu ma carte fonctionner maintenant .. Voici la version de travail modifiée P>

   public class MainActivity extends FragmentActivity {
 private GoogleMap myMap;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

          android.support.v4.app.FragmentManager myFragmentManager = getSupportFragmentManager();
          SupportMapFragment mySupportMapFragment 
           = (SupportMapFragment)myFragmentManager.findFragmentById(R.id.map);


             myMap = mySupportMapFragment.getMap();
             if(myMap!=null)
            myMap.setMyLocationEnabled(true);


        }


1 commentaires

Votre solution la mise à jour a eu lieu pour moi. +1


5 Réponses :


17
votes

Vous créez un fragment dynamique via un fragmenttransaction . Lorsque vous appelez commit () , le fragment a pas ajouté à l'écran, car le fragmenttransaction n'a été prévu que pour se produire - Il n'a pas encore eu lieu. Par conséquent, le supportfragment n'a pas été appelé avec OncreAreview () Pourtant, il n'y a donc pas de googlemap . .

Soit interrupteur sur des fragments statiques ( étiquette dans une mise en page) ou retardez votre utilisation du GoogleMap jusqu'à une fois la transaction traitée.


4 commentaires

Désolé: $ mais comment puis-je retarder l'utilisation de la carte Google que j'ai essayé de l'appeler à Onresume () et n'a pas fonctionné. Pas sûr que ce que tu veux dire


@Prog: Après avoir appelé commit () sur la transaction, appelez post () sur certains Voir (ou un gestionnaire > Si vous en avez un). Au moment où le calendrier Runnable est appelé, le GoogleMap devrait exister. Ou, encore une fois, passez à des fragments statiques.


J'utilise un fragment statique via la disposition XML, mais certains téléphones ont toujours ce problème. Le GS2 d'un testeur fonctionne pendant que le GS2 d'un autre testeur ne le fait pas. Cela pourrait-il avoir quelque chose à voir avec Google Play Services non disponible sur l'appareil?


@JMRBOOSTES: Non, dans la mesure où vous auriez dû comprendre que c'était le problème avant d'essayer de faire quoi que ce soit avec des cartes v2.



6
votes

ExécuterSetPendingTransactions () dans la classe FragmentManager a été conçue pour fixer ce délai. De DOCUMANTSTIVES: Une fois une fragment detransaction engagée avec FragmentTransaction.Commit (), il est prévu d'être exécuté de manière asynchrone sur le fil principal du processus. Si vous souhaitez exécuter immédiatement une telle opération en attente , vous pouvez appeler cette fonction (uniquement du fil principal) à le faire. Notez que tous les rappels et autres comportements connexes seront effectués à partir de cet appel, alors faites attention à ce que cela s'appelle.


2 commentaires

Après avoir appelé fragman.executePendingTransactions () aussi je ne peux pas obtenir de carte, idem nullpointeException


J'ai essayé exécutant de l'exécution aussi bien et il est toujours null après l'avoir appelé.



1
votes

Une autre façon de le résoudre. Impliez une interface dans la carte de communication pour communiquer à l'activité lorsqu'elle est prête pour la création de Googlemap. XXX

Ensuite, il vous suffit de mettre en œuvre l'auditeur dans l'activtiy: xxx


1 commentaires

Meilleure réponse. La manipulation de la nature asynchrone du processus de création est la bonne façon d'aller imo. Quelque chose d'autre et votre juste devinez que c'est le bon moment est le bon moment pour accéder à l'objet.



3
votes

Déplacez l'extrait de code:

Carte Googlemap; map = fragment.getmap ();

// la carte n'est pas null

si (map! = null) { xxx < p>}

à ONRESUME (), cela résoudra votre problème.


0 commentaires

6
votes

J'ai étendu la classe MapFragment et ajouté un auditeur. Le Doc sur GetMap () Dites:

... null si la vue du fragment n'est pas encore prête. Cela peut arriver si le cycle de vie de fragment ne s'est pas passé sur OnCreateView (Layoutinflater, groupe de visit-View, Bundle) ...

Puis j'appelle l'auditeur après OncreAreview. J'ajoute la classe xxx

}

après dans l'activité d'appel ou le fragment ... xxx < / p>


2 commentaires

très bonne solution, à ce moment-là, il semble être l'optimal


Vous ne pouvez pas simplement utiliser surViewCreated directement à la place?