ventana tutorial studio emergente ejemplo java android alertdialog

java - tutorial - show dialog box android studio



Android AlertDialog con texto que cambia dinĂ¡micamente en cada solicitud (8)

Quiero mostrar un AlertDialog con una opción que podría cambiar en cada solicitud. Entonces, por ejemplo, una vez quiero mostrar la opción "agregar a contactos" mientras que otra vez debería ser "eliminar de contactos".

Mi código funciona la primera vez, sin embargo, parece que Android guarda el AlertDialog en caché para que la próxima vez no se ejecute onCreateDialog. Por lo tanto, la opción ya no cambia. ¿Puedo evitar este almacenamiento en caché o hay otra forma 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(); }


Creo que tengo una solución para el comportamiento inconsistente mencionado anteriormente. Al crear inicialmente el cuadro de diálogo (cuando aún es un AlertDialog.Builder), debe configurar el mensaje en un estado inicial (no nulo) o onPrepareDialog NO lo sobrescribirá 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); }


Cuando tiene un cuadro de diálogo personalizado, puede cambiar los elementos personalizados utilizando dialog.getWindow (). FindViewById (...)

En este ejemplo, guarde el último texto mostrado y vuelva a mostrarlo la próxima vez que muestre 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 del 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" />


Eche un vistazo al método onPrepareDialog que se llamará antes de que se muestre el diálogo. Allí puede cambiar los valores requeridos según el tipo de solicitud.

Ejemplo con selector de fecha

@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; } }


Entiendo las razones de rendimiento para usar los diálogos de actividad administrada, pero recomendaría que no se usen, excepto en casos simples. Las razones de esto son:

  1. El argumento del paquete solo se agregó en el nivel 8 de la API, por lo que no se puede adoptar por compatibilidad con versiones anteriores. Esto significa efectivamente que ''onPrepareDialog'' necesita depender de variables no locales para las diferencias de estado;

  2. La práctica indica un comportamiento deficiente e inconsistente en respuesta a cualquier cambio en el diálogo realizado en el cuerpo de ''onPrepareDialog''.

Ninguna de estas dificultades surge si los diálogos se clasifican y se crean según sea necesario. ''setOwnerActivity'' puede ser llamado si es necesario.



También puede usar la función removeDialog (int) de la Actividad. Cuando se descarta un cuadro de diálogo, la Actividad básicamente almacena el estado del cuadro de diálogo (por razones de rendimiento, me imagino). Al llamar a removeDialog (int) en el cuadro de diálogo, se fuerza a la actividad a descargar todas las referencias para el cuadro de diálogo y se elimina de la pantalla si se muestra.

Creando Diálogos
Activity#removeDialog(int)


Y tengo una idea, pero no tan buena. * ¡ Esto se usa cuando los usuarios no usan el diálogo con bastante frecuencia! * La solución: primero, debe declarar una variable (tipo int) y establecer el valor predeterminado como 0. tal como private int i=0; y antes de usar los métodos de actividad showDialog, aumente la variable int i y publique el valor i como parámetro como método showDialog. el código puede gustar esto

private int i=0; //before you show the dialog this.i++; this.showDialog(this.i);


exactamente. para AlertDialog, que se creó con Builder.create() , onPrepareDialog() sirve para nada. El generador es unidireccional, ya que una vez que se crea el diálogo, no se puede actualizar. Quiero decir, no puedo a la ligera, estoy seguro de que podría obtener un identificador de la vista y hacerlo todo de forma manual, pero eso anula el punto de usar el generador en primer lugar.

La única solución que encontré fue crear / mostrar / descartar manualmente el cuadro de diálogo en lugar de usar onCreateDialog() , showDialog() , etc. Intenté llamar removeDialog() , pero no funcionó.