2009-05-07 6 views
5

Aujourd'hui, j'ai fait face à un problème très étrange. Dans mon jeu, je crée AlertDialog pour montrer à l'utilisateur les défis de niveau suivant quand on est réussi. Donc, le code correspondant est comme ça. Lorsque le jeu est réussi, showDialog (R.id.display_success) est appelé et le code suivant est exécuté. Donc, je m'attends à exécuter ce code à chaque appel. Toutefois; le jeu s'exécute une seule fois et affiche le même AlertDialog dans toutes les autres exécutions. Je veux dire, comme l'instance n'est pas créée après que le premier est créé et la première instance est utilisée tout le temps. J'espère pouvoir décrire mon problème.Android: ne peut pas changer le texte apparaît dans AlertDialog

case R.id.display_success:   
     updateGameSettings(); 
     message = formatLevel() 
     + formatMission(); 
     return new AlertDialog.Builder(this) 
     .setIcon(R.drawable.smiley_happy) 
     .setTitle(R.string.dialog_success) 
     .setMessage(message) 
     .setPositiveButton(R.string.alert_dialog_newgame, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog,  int whichButton) { 
         startANewGame(); 
       } 
     }) 
     .setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        finish(); 
       } 
     }) 
     .create(); 

Répondre

3

La méthode onPrepareDialog est appelée lorsque la boîte de dialogue est affichée. Il est donc préférable de modifier le texte ou d'autres fonctionnalités en remplaçant cette méthode.

+1

Je pense que vous avez tort. Par conception, chaque boîte de dialogue est créée une seule fois. Si vous voulez changer le contenu de votre boîte de dialogue, utilisez onPrepareDialog, qui est appelé chaque fois que votre boîte de dialogue est sur le point d'apparaître. Le code fourni peut fonctionner, mais ce n'est pas la meilleure façon de le faire. –

+0

Je mets le 'removeDialog' dans une instruction try catch. Le code fonctionne, mais je doute beaucoup que ce soit la bonne façon de le faire –

+0

@Tim, oui je me trompe. J'ai appris cela beaucoup plus tard que onPrepareDialog est appelé à chaque fois que le dialogue est créé. –

4

Je pense avoir un correctif pour le comportement incohérent de onPrepareDialog. Lors de la création initiale de la boîte de dialogue (quand il s'agit toujours d'un AlertDialog.Builder), vous devez définir le message à un état initial (not null) ou onPrepareDialog ne remplacera pas le message avec la valeur prévue. Donc, lorsque vous créez la boîte de dialogue, faites quelque chose comme ceci pour toujours avoir une valeur non nulle dans le message. J'ai lutté avec cela pendant des jours et trouvé cette solution par accident:

AlertDialog.Builder resultAlert = new AlertDialog.Builder(context); 

if (message == null) { 
    resultAlert.setMessage(""); 
} else { 
    resultAlert.setMessage(message); 
} 
+0

Génial, ça marche! Bien que pour une raison quelconque, cela ne fonctionne pas pour le titre du dialogue ... – matt

Questions connexes