Pregunta

Quiero mostrar un AlertDialog con una opción que podría cambiar en cada petición. Así, por ejemplo, a la vez que quiero mostrar la opción "añadir a los contactos", mientras que en otra ocasión en que debe "eliminar de contactos".

Mi código funciona en el primer tiempo, sin embargo Android parece almacenar en caché el AlertDialog modo que onCreateDialog no se ejecuta la próxima vez. Por lo tanto, la opción no cambia más. ¿Puedo evitar que este almacenamiento en caché, o hay otra manera de cambiar la opción?

Estoy trabajando con SDK 1.5 pero utilizando 1,1.

@Override
protected Dialog onCreateDialog(final int id) {
    ...
    String add_remove_contact = res.getString(R.string.profile_add_to_contacts);
    if (user.getContacts().contains(profileID)) {
        add_remove_contact = res.getString(R.string.profile_remove_from_contacts);
        // TODO: this string is not changed when contact status changes 
    }
    final CharSequence[] items = {res.getString(R.string.view_profile),
                                  res.getString(R.string.profile_send_message),
                                  add_remove_contact};
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    ...
    return builder.create();
}
¿Fue útil?

Solución

También puede utilizar el removeDialog en función de la actividad (int). Cuando se desestimó un cuadro de diálogo, la actividad básicamente almacena el estado del cuadro de diálogo (por razones de rendimiento me imagino). Llamando a removeDialog (int) en el diálogo de fuerza a la actividad de descargar todas las referencias de la ventana de diálogo y retira desde la pantalla si está siendo mostrado.

crear diálogos
Actividad # removeDialog (int)

Otros consejos

Tome un vistazo a se muestra método onPrepareDialog que será llamada antes de diálogo. Allí se pueden cambiar los valores requeridos en función del tipo petición.

Ejemplo con selector de fechas

@Override
protected Dialog onCreateDialog(final int id) {
  switch (id) {
  case DIALOG_DATE_ID:
    final Calendar c = Calendar.getInstance();
    return new DatePickerDialog(this, this, c.get(Calendar.YEAR),
                                c.get(Calendar.MONTH), 
                                c.get(Calendar.DAY_OF_MONTH));
  default:
    return super.onCreateDialog(id);
  }
}

@Override
protected void onPrepareDialog(final int id, final Dialog dialog) {
  switch (id) {
  case DIALOG_DATE_ID:
    //update to current time
    final Calendar c = Calendar.getInstance();
    ((DatePickerDialog) dialog).updateDate(c.get(Calendar.YEAR), 
                                           c.get(Calendar.MONTH), 
                                           c.get(Calendar.DAY_OF_MONTH));
    break;
  }
}

Este es un DUP de esta pregunta: Android: No se puede cambiar el texto aparece en AlertDialog

También puede hacerlo de esta manera: http://andmobidev.blogspot.com/2010/ 03 / modificando-alerta-diálogos-list-items.html

parece ralentizar la visualización del menú LongPress aunque ...

Creo que tengo una solución para el comportamiento incoherente mencionado anteriormente. Cuando se crea inicialmente el cuadro de diálogo (cuando aún es un AlertDialog.Builder), usted tiene que fijar el mensaje a un estado inicial (no nulo) o onPrepareDialog no sobrescribe con el valor previsto. Así que cuando usted está creando el cuadro de diálogo, hacer 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);
}

Entiendo las razones de rendimiento para el uso de los cuadros de diálogo de actividad administrada, pero recomendaría que no están acostumbrados a excepción de casos sencillos. Las razones para esto son:

  1. El argumento Bundle solamente se añadió en la API de nivel 8, por lo que no puede adoptarse para la compatibilidad hacia atrás. Esto significa efectivamente que 'onPrepareDialog' tiene que depender de las variables no locales de las diferencias estatales;

  2. práctica indica comportamiento pobre e inconsistente en respuesta a cualquier cambio de diálogo hechas en el cuerpo de 'onPrepareDialog'.

Ninguna de estas dificultades surgen si diálogos son subclases y crean según sea necesario. 'SetOwnerActivity' se pueden llamar en caso de necesidad.

Cuando usted tiene un cuadro de diálogo personalizado se puede cambiar mediante el uso de elementos personalizados dialog.getWindow (). FindViewById (...)

Este ejemplo guardar el último texto que se muestra y muestra de nuevo la próxima vez que mostrar el cuadro de diálogo.

// custom dialog
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.customized);

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialogInterface) {
       EditText dialogText = (EditText)dialog.getWindow().findViewById(R.id.customText);
       savedText = dialogText.getText();
    }
});

dialog.show();
EditText dialogText = (EditText)dialog.getWindow().findViewById(R.id.customText);
dialogText.setText(savedText);

xml de diálogo personalizado:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<Button
    android:id="@+id/buttonOK"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="OK"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="16dp" />

<EditText
    android:id="@+id/customText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="19dp"
    android:hint="Message"
    android:ems="10"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

Y tengo una idea, pero no tan bueno * Esto se utiliza cuando los usuarios no utilizar el diálogo con bastante frecuencia * La solución:.! En primer lugar, usted debe declarar una variable (tipo int ) y hacer que el valor por defecto como 0.such como private int i=0; y antes de utilizar los métodos ShowDialog de actividad, aumentar la variable i int y publicar el valor i como el parámetro como método showDialog. el código puede que este

private int i=0;

//before you show the dialog
this.i++;
this.showDialog(this.i);

exactamente. para AlertDialog, que fue creado w / Builder.create(), onPrepareDialog() es inútil. Builder es de un solo sentido en que una vez que se crea el cuadro de diálogo, no se puede actualizar. quiero decir, no puedo sin apretar, estoy seguro de que podría obtener un identificador para la vista y hacerlo todo de forma manual, pero que se pierde el punto de utilizar el constructor en el primer lugar.

La única solución que encontré fue que crear manualmente / mostrar / cerrar el diálogo en lugar de utilizar onCreateDialog(), showDialog(), etc. He intentado llamar removeDialog(), pero eso no parece funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top