2010-03-23 4 views
41

In un'operazione a esecuzione prolungata, visualizzo una finestra di dialogo popup (creata da ProgressDialog per impedire che altre operazioni si ripetano).Impedisci a ProgressDialog di essere eliminato quando faccio clic sul pulsante di ricerca (Android)

L'ho reso non annullabile con setCancelable(false), quindi non riesco a chiuderlo utilizzando il pulsante Indietro, ma sorprendentemente, il pulsante Cerca hardware chiude la finestra di dialogo!

Più precisamente, viene visualizzata l'applicazione di ricerca globale, e quando torno al mio app, la finestra di dialogo è stato respinto.

Qualche idea su come evitare che la finestra di dialogo venga chiusa?

+0

Che cosa succede se si esclude la funzione del pulsante di ricerca? @Override public boolean onSearchRequested() {return true; } –

+0

Sorprendentemente, questo non funziona (almeno testandolo su 2.3). Non funziona se restituisci false. – cottonBallPaws

risposta

45

questo funziona (si noti l'ho messo nella finestra di costruttore):

.setOnKeyListener(new DialogInterface.OnKeyListener() { 

    @Override 
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_SEARCH && event.getRepeatCount() == 0) { 
      return true; // Pretend we processed it 
     } 
     return false; // Any other keys are still processed as normal 
    } 
}) 

Forse è anche possibile afferrare le pressioni di tasti positivi e negativi, e solo gestiscili, restituisce true per qualsiasi altra chiave. Sarebbe curioso se riesci a capirlo ...

PS: Ho letto da qualche parte che ci sono più "buchi" nella finestra di dialogo, cioè puoi sbarazzartene senza premere alcun pulsante su di esso. Questo era apparentemente uno. Qualcuno sa di altri?

+0

ricevo errori di compilazione quando si esegue questo, tuttavia la rimozione di '@ Override' e cambiando la dichiarazione di OnKey a' OnKey public boolean (DialogInterface arg0, int arg1, arg2 KeyEvent) 'ha lavorato per me - Grazie! –

+0

@MohamedHafez forse cambia il tuo compilatore/IDE per verificare contro Java 1.6 invece di 1.5? – parkerfath

+0

@QQQuestions qualche idea sul perché getRepeatCount() == 0 deve essere lì? – parkerfath

1

È necessario creare le finestre di dialogo tramite l'evento onCreateDialog dell'attività, poiché questo è il punto in cui sono gestite dall'attività e verranno ripristinate al riavvio dell'attività.

Chiamata per la creazione di finestre di dialogo gestite (salvate e ripristinate) per l'attività. Se si utilizza showDialog(int), l'attività eseguirà la chiamata a questo metodo per la prima volta e continuerà a collegarsi successivamente. Qualsiasi finestra di dialogo creata con questo metodo verrà automaticamente salvata e ripristinata per te, incluso se viene mostrata. Se desideri che l'attività gestisca le finestre di dialogo per il salvataggio e il ripristino, devi eseguire l'override di questo metodo e gestire qualsiasi ID passato a showDialog (int). Se desideri un'opportunità per preparare la finestra di dialogo prima che venga visualizzata, sostituisci onPrepareDialog(int, Dialog).

Esempio utilizzo:

public class MyClass extends Activity { 
// ........ // 
static final int DATE_DIALOG_ID = 1; 
@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 

    case DATE_DIALOG_ID: 
    return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, 
    mDay); 
    } 
    return null; 
} 

    public void launchSetDate() { 
    showDialog(DATE_DIALOG_ID); 
} 
} 
+0

L'ho provato e la finestra di dialogo è stata ancora chiusa quando si preme il pulsante di ricerca. – yuku

+0

E quando sei tornato all'applicazione? – Pentium10

+0

la finestra di avanzamento non è più lì :( – yuku

35
setCanceledOnTouchOutside(false); 
3

mProgressDialog.setCancelable(false); ha funzionato per me.