Domanda

Voglio mostrare una finestra di dialogo Alert con un'opzione che potrebbe cambiare ad ogni richiesta.Quindi, ad esempio, una volta voglio mostrare l'opzione "aggiungi ai contatti" mentre un'altra volta dovrebbe essere "rimuovi dai contatti".

Il mio codice funziona la prima volta, tuttavia Android sembra memorizzare nella cache AlertDialog in modo che onCreateDialog non venga eseguito la prossima volta.Pertanto l'opzione non cambia più.Posso impedire questa memorizzazione nella cache o esiste solo un altro modo per modificare l'opzione?

Sto lavorando con SDK 1.5 ma utilizzo 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();
}
È stato utile?

Soluzione

È inoltre possibile utilizzare la removeDialog (int) funzione dell'attività. Quando una finestra di dialogo è respinto, l'attività fondamentalmente memorizza lo stato della finestra di dialogo (per motivi di prestazioni mi immagino). Chiamata removeDialog (int) nella finestra di dialogo costringe l'attività per scaricare tutti i riferimenti per il dialogo e lo liquida dallo schermo se è viene mostrato.

Creazione di finestre di dialogo
Attività # removeDialog (int)

Altri suggerimenti

Dare un'occhiata a onPrepareDialog metodo che verrà chiamato prima che venga visualizzata la finestra di dialogo.Lì puoi modificare i valori richiesti in base al tipo di richiesta.

Esempio con selezione data

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

Questo è un duplicato di questa domanda: Android: Non è possibile modificare il testo appare in AlertDialog

Si può anche fare in questo modo: http://andmobidev.blogspot.com/2010/ 03 / modifica-alert-finestre-list-items.html

sembra rallentare la visualizzazione del menu longpress però ...

Credo di avere una correzione per il comportamento incoerente di cui sopra. Quando si crea inizialmente la finestra di dialogo (quando è ancora un AlertDialog.Builder), è necessario impostare il messaggio ad uno stato iniziale (non nullo) o onPrepareDialog non sovrascriverà con il valore previsto. Così, quando si sta creando la finestra di dialogo, fare qualcosa di simile per avere sempre un valore non nullo nel messaggio. Ho lottato con questo per giorni e ho trovato questa soluzione per caso:

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

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

Capisco le ragioni di prestazioni per l'utilizzo di attività gestite le finestre di dialogo, ma consiglierei che essi non sono utilizzati tranne che per i casi semplici. Le ragioni di questo sono:

  1. L'argomento Fascio fu aggiunto soltanto nel API livello 8, quindi non può essere adottata per la compatibilità all'indietro. Questo significa che 'onPrepareDialog' ha bisogno di contare su variabili non locali per le differenze di stato;

  2. Practice indica il comportamento poveri e incoerente a seguito di eventuali modifiche apportate dialogo nel corpo del 'onPrepareDialog'.

Nessuno di questi problemi sorgono se finestre di dialogo sono sottoclassi e creati in base alle esigenze. 'SetOwnerActivity' può essere chiamato, se necessario.

Quando si ha una finestra di dialogo personalizzata è possibile modificare gli elementi personalizzati utilizzando dialog.getWindow (). FindViewById (...)

In questo esempio salvare l'ultimo testo mostrato e mostra di nuovo la prossima volta che si visualizza la finestra di dialogo.

// 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 di dialogo personalizzato:

<?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" />

E ho avuto un idea, ma non così buono * Questo viene utilizzato quando gli utenti non utilizzare la finestra di una certa frequenza * La soluzione:.! Prima, si dovrebbe dichiarare una variabile (tipo int ) e rendere il valore di default come 0.such come private int i=0; e prima di utilizzare i metodi showDialog di attività, aumentare la variabile i int e inserisci il valore dei come il parametro come metodo ShowDialog. il codice può, come questo

private int i=0;

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

esattamente. per AlertDialog, che è stato creato w / Builder.create(), onPrepareDialog() è inutile. Builder è a senso unico che, una volta creato il dialogo, non è possibile aggiornare. Voglio dire, non posso liberamente, sono sicuro che si potrebbe ottenere un handle per la vista e fare tutto manualmente, ma che sconfigge il punto di utilizzare il costruttore, in primo luogo.

l'unica soluzione che ho trovato è stato quello di creare manualmente / mostra / chiudere la finestra invece di usare onCreateDialog(), showDialog(), ecc Ho provato a chiamare removeDialog(), ma questo non sembra funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top