2010-02-22 15 views
7

Sto creando un dialogo come segue:Identificare quale AlertDialog innescato onClick (finestra DialogInterface, int quale)

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case DIALOG_1: 
    return new AlertDialog.Builder(this) 
    .setTitle(R.string.s_dlg1) 
    .setPositiveButton(android.R.string.ok, this) 
    .create(); 

    case DIALOG_2: 
    ... 
    ... 
    } 

    return null; 
} 

@Override 
public void onClick(DialogInterface dialog, int whichButton) { 
    if (dialog == ???) { 
    ... 
    } 
    else if (dialog == ???){ 
    ... 
    } 
} 

Come posso identificare quali dialogo innescato il metodo onClick? Non posso dichiarare i metodi dell'interfaccia come in-line quando creo la finestra di dialogo perché voglio accedere alle variabili nella mia classe. Ogni altra interfaccia passa una sorta di id ai suoi metodi per identificare quale oggetto ha chiamato il metodo, ma non riesco a fare nulla con la finestra di dialogo DialogInterface.

+1

Non posso credere che non esiste una soluzione migliore per questo. Torno qui, se mi piace qualcosa ... – AudioDroid

risposta

1

Forse è possibile estrarre il listener onclick come una classe separata e quindi passare l'id della finestra di dialogo? L'interfaccia è android.content.DialogInterface.OnClickListener

+0

Questo equivarrebbe a memorizzarlo in una variabile privata nella classe corrente, dal momento che solo una finestra di dialogo può essere mostrata in una sola volta, e onClick si attiva prima che l'utente possa fare qualsiasi cosa per avviare un'altra finestra di dialogo e modificare il valore. Questo è quello che sto facendo ora, ma non è pulito. Sto riscontrando lo stesso problema con più DatePickerDialog sulla stessa attività. Non sembra essere un modo semplice per identificare quale ha attivato l'evento onDateSet. – Monstieur

+0

non so di un modo migliore, se vuoi identificare la finestra di dialogo devi memorizzare l'id da qualche parte, ora le finestre di dialogo non contengono un "tag" o un id, quindi devi - implementare l'onclick in una classe che riceve una variabile che identifica la finestra di dialogo, estendere la classe di dialogo stessa e aggiungere un ID o salvare in una variabile nel frammento o nell'attività chiamante e ottenerli utilizzando getContext. un altro modo (non è sicuro se funziona) è quello di utilizzare dialogFragment e aggiungere un tag in modo da poter ottenere il tag e identificare la finestra di dialogo utilizzata. –

0

questo sta lavorando per me

case Dialog_import_database: 
      return new AlertDialog.Builder(Main.this) 
      .setTitle(R.string.ImportDatabaseDialogTitle) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        // TODO Auto-generated method stub 
        Log.i("Main","positive Button In dialog Box"); 

causa che cosa mai vuoi a causa quando il pulsante di positivo si fa clic qui

   } 
      }) 
      .setNegativeButton("Cancel", null) 
      .setMessage(R.string.ImportDatabaseMessage) 
      .create(); 
     } 
+0

Non è possibile accedere alle variabili di classe se lo si dichiara in questo modo. – Monstieur

+0

questo codice viene inserito nel metode di ondialogcreate con un'istruzione switch quindi si chiama showdialog (Dialog_import_database); –

+0

@Kurian Sei sicuro? Hai provato? :) –

0

è difficile identificare i due direttamente quale finestra di dialogo è stata mostrata invece con il pulsante , quindi se si popolano le finestre di dialogo con pulsanti diversi è possibile eseguire il trucco. Qualcosa di simile a questo:

new AlertDialog.Builder(this) 
.setTitle(R.string.s_dlg1) 
.setPositiveButton(android.R.string.ok, this) 
.create(); 

new AlertDialog.Builder(this) 
.setTitle(R.string.s_dlg2) 
.setNegativeButton(android.R.string.ok, this) 
.create(); 

@Override 
public void onClick(DialogInterface dialog, int whichButton) { 
if (whichbutton == DialogInterface.BUTTON_POSITIVE) { 
... 
} 
else if (whichButton == DialogInterface.BUTTON_NEGATIVE){ 
... 
} 
Problemi correlati