2009-05-07 26 views
5

Hoy me enfrenté a un problema muy extraño. En mi juego, creo AlertDialog para mostrar al usuario los desafíos del siguiente nivel cuando uno tiene éxito. Entonces, el código correspondiente es así. cuando el juego es exitoso se llama a showDialog (R.id.display_success) y se ejecuta el siguiente código.Android: No se puede cambiar el texto aparece en AlertDialog

Por lo tanto, estoy esperando ejecutar este código en cada llamada. Sin embargo; el juego se ejecuta solo una vez y muestra el mismo AlertDialog en todas las demás ejecuciones. Quiero decir, como la instancia no se crea después de que se crea la primera y la primera instancia se usa todo el tiempo. Espero haber podido describir mi problema.

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(); 

Respuesta

3

onPrepareEl método del diálogo se invoca cuando se muestra el cuadro de diálogo. Por lo tanto, es mejor cambiar el texto u otras características anulando este método.

+1

Creo que estás equivocado. Por diseño, cada Diálogo solo se crea una vez. Si desea cambiar el contenido de su diálogo, use onPrepareDialog, que recibe una llamada cada vez que su cuadro de diálogo está a punto de aparecer. El código proporcionado podría funcionar, pero no es la forma preferida de hacerlo. –

+0

Puse el 'removeDialog' en una declaración try catch. El código funciona, pero dudo mucho que sea la forma correcta de hacerlo –

+0

@Tim, sí, estoy equivocado. Aprendí mucho más tarde que se llama a OnPrepareDialog cada vez que se crea el diálogo. –

4

Creo que tengo una solución para el comportamiento incoherente de onPrepareDialog. Al crear inicialmente el cuadro de diálogo (cuando todavía es un AlertDialog.Builder), debe establecer el mensaje en un estado inicial (no nulo) o onPrepareDialog NO sobrescribirá el mensaje con el valor deseado. Entonces cuando está creando el diálogo, haga algo como esto para tener siempre un valor no nulo en el mensaje. Luché con esto durante días y encontré esta solución por accidente:

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

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

¡Impresionante, eso funciona! Aunque por alguna razón, no funciona para el título del diálogo ... – matt

Cuestiones relacionadas