Android AlertDialog con texto dinámicamente cambiante en cada solicitud
Quiero mostrar un AlertDialog con una opción que podría cambiar en cada solicitud. Así que por ejemplo, al mismo tiempo quiero mostrar la opción "añadir a los contactos", mientras que otra vez debe ser "eliminar de los contactos".
Mi código funciona en la primera vez, sin embargo Android parece que la caché de AlertDialog para que onCreateDialog no se ejecuta la próxima vez. Por lo tanto, la opción no cambia más. ¿Puedo evitar este almacenamiento en caché, o sólo hay otra manera de cambiar la opción?
- FileChannel devuelve el tamaño incorrecto del archivo de la carpeta de activos
- ¿Cómo habilitar la inspección después de haber sido inhabilitado en Android Studio?
- Cómo configurar un spinner onClickListener () en Android
- Package org.apache.http.client no existe
- ¿Cómo puedo importar una biblioteca de Android y usarla tanto en el código de producción como en las pruebas?
Estoy trabajando con SDK 1.5 pero usando 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(); }
- No se puede enviar el mensaje desde Android Wear al dispositivo host
- Disposición de la pantalla de preferencias de Android
- ¿Por qué es posible escribir una matriz booleana en un paquete pero no en un booleano?
- Java: La excepción en sí es nula
- ¿Cuál es el uso de BaseColumns en Android
- Android: descarga de la imagen desde la Web, guardando en la memoria interna en una ubicación privada a la aplicación, mostrando para el elemento de lista
- Descodificación de paquetes Airplay en Java o C / C ++ en Android
- ¿Cómo obtener el nivel de Compensación de exposición de la cámara del teléfono Android, a través de Java, cuando se toma la foto?
También puede utilizar la función removeDialog (int) de la actividad. Cuando se descarta un diálogo, la actividad básicamente almacena el estado del diálogo (por razones de rendimiento que me imagino). Llamar a removeDialog (int) en el diálogo obliga a la actividad a descargar todas las referencias para el diálogo y lo rechaza de la pantalla si se está mostrando.
Creación de cuadros de diálogo
Actividad # removeDialog (int)
Eche un vistazo al método onPrepareDialog que se llamará antes de mostrar el cuadro de diálogo. Allí Usted 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; } }
Esto 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/modifying-alert-dialogs-list-items.html
Parece que ralentizar la pantalla del menú longpress aunque …
Creo que tengo una solución para el comportamiento inconsistente mencionado anteriormente. Al crear inicialmente el diálogo (cuando todavía es un AlertDialog.Builder), usted tiene que fijar el mensaje a un estado inicial (no nulo) o onPrepareDialog no lo sobrepondrá con el valor deseado. Por lo tanto, 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); }
Entiendo las razones de rendimiento para usar cuadros de diálogo gestionados por actividades, pero recomendaría que no se utilicen excepto para casos simples. Las razones para esto son:
-
El argumento Bundle sólo se agregó en API Level 8, por lo que no se puede adoptar para compatibilidad con versiones anteriores. Esto significa efectivamente que 'onPrepareDialog' necesita confiar en variables no locales para las diferencias de estado;
-
La práctica indica un comportamiento pobre e incoherente en respuesta a cualquier cambio de diálogo realizado en el cuerpo de 'onPrepareDialog'.
Ninguna de estas dificultades surgen si los cuadros de diálogo son subclaseados y creados según sea necesario. 'SetOwnerActivity' se puede llamar si es necesario.
Cuando usted tiene un diálogo personalizado puede cambiar los elementos personalizados mediante el uso de dialog.getWindow (). FindViewById (…)
En este ejemplo, guarde el último texto mostrado y vuelva a mostrarlo la próxima vez que muestre el 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" />
Y tengo una idea, pero no tan buena. * Esto se utiliza cuando los usuarios no utilizan el diálogo con bastante frecuencia! * La solución: en primer lugar, debe declarar una variable (tipo int) y hacer que el valor predeterminado sea 0.such como private int i=0;
Y antes de usar los métodos showDialog de Activity, 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()
es inútil. Builder es unidireccional en que una vez que se crea el diálogo, no se puede actualizar. Quiero decir no puede libremente, estoy seguro de que podría obtener una manija a la vista y hacerlo todo manualmente, pero que derrota el punto de utilizar el constructor en el primer lugar.
La única solución que encontré fue crear / mostrar / descartar manualmente el diálogo en lugar de usar onCreateDialog()
, showDialog()
, etc. Traté de llamar a removeDialog()
, pero eso no funcionó.
- Cómo animar ImageView de centro de cultivo para llenar la pantalla y viceversa (estilo de facebook)?
- Construir varias versiones (prueba / prod) de APKs de Android en Eclipse