2015-11-23 1 views
4

J'ai développé une application avec une carte Google et un tiroir de navigation. Lorsque je démarre l'application, la carte est affichée et l'utilisateur peut ouvrir le tiroir de navigation. Lorsque l'utilisateur clique sur le premier élément dans le tiroir de navigation, la carte devrait apparaître, au cas où il passerait à un autre fragment avant. Cependant, quand je l'appelle le fragment de carte, mon application se bloque avec le code d'erreur suivant: java.lang.IllegalStateException: Can't change container ID of fragment SupportMapFragment{36a7826b #0 id=0x7f0e007a}: was 2131624058 now 2131624057Impossible de modifier l'ID conteneur du fragment SupportMapFragment

Ce que je fais dans le tiroir de navigation onItemClick pour montrer la carte est:

getSupportFragmentManager().beginTransaction() 
    .add(R.id.fragment_container, supportMapFragment) 
    .addToBackStack(null) 
    .commit(); 

Il fonctionne très bien pour autres fragments mais pas pour le fragment de la carte. Le fragment de carte est codée en dur xml pour le montrer dès le début et instancié dans les méthodes onCreate comme suit: supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

Tous mes autres fragments sont instanciés en appelant new MyFragment(); et ils mesure Fragment. Tous les conseils et astuces sur comment réparer le crash et montrer la carte sont très appréciés.

Répondre

8

Au lieu d'ajouter et de supprimer une carte, il est préférable de la masquer et de l'afficher.

Avant tout, c'est à cause de problèmes de performance et d'interface utilisateur: lorsque vous ajoutez une carte à l'activité - il faudra un certain temps pour réellement afficher la carte à l'écran.

Vous pouvez par ce achive

SupportMapFragment supportMapFragment; // field 

supportMapFragment = (SupportMapFragment)getSupportFragmentManager() 
    .findFragmentById(R.id.map); 

// To show map fragment instead of your content fragment 
getSupportFragmentManager().beginTransaction() 
    .show(supportMapFragment) 
    .remove(yourContentFragment) 
    .commit(); 

// And to hide it 
getSupportFragmentManager().beginTransaction() 
    .hide(supportMapFragment) 
    .add(yourContentFragment) 
    .commit(); 

Si vous êtes vraiment besoin d'ajouter et de supprimer la carte, vous devez le faire par programme, au lieu de déclarer MapFragment en XML statique.

+0

Génial! Cela a résolu le problème tout de suite. Je montre simplement le fragment de paramètres, puis cache le fragment de la carte. Si je veux montrer la carte, je montre simplement le fragment de carte et cache le fragment de paramètres. Cela fonctionne très bien. Merci beaucoup! – jfmg