2010-03-23 13 views
41

En una operación de larga ejecución, mostraré un cuadro de diálogo emergente (creado a partir del ProgressDialog para evitar que ocurran otras operaciones).Impedir que se desestime ProgressDialog al hacer clic en el botón de búsqueda (Android)

Lo he hecho no cancelable con setCancelable(false), por lo que no puedo cerrarlo con el botón Atrás, pero sorprendentemente, el botón Buscar hardware cierra el cuadro de diálogo.

Más exactamente, se muestra la aplicación de búsqueda global, y cuando regreso a mi aplicación, el diálogo ha sido descartado.

¿Alguna idea sobre cómo evitar que se desestime el diálogo?

+0

¿Qué hay sobre anular la función del botón de búsqueda? @Override public boolean onSearchRequested() {return true; } –

+0

Sorprendentemente, esto no funciona (al menos probarlo en 2.3). No funciona si devuelve falso tampoco. – cottonBallPaws

Respuesta

45

esto funciona (nótese que lo puso en el constructor de diálogo):

.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 
    } 
}) 

Quizás es incluso posible agarrar las pulsaciones de botones positivos y negativos, y sólo maneja esto, devuelve verdadero para cualquier otra tecla. Sería curioso si se da cuenta de eso ...

PD: He leído que hay más "agujeros" en el diálogo, es decir, que puede deshacerse de él sin presionar ningún botón. Este fue aparentemente uno. ¿Alguien sabe de otros?

+0

Obtengo errores de compilación cuando ejecuto esto, sin embargo, eliminé '@ Override' y cambié la declaración de onKey a' boolean onKey (DialogInterface arg0, int arg1, KeyEvent arg2) 'trabajados para mí - Gracias! –

+0

@MohamedHafez tal vez cambie su compilador/IDE para comprobar contra Java 1.6 en lugar de 1.5? – parkerfath

+0

@QQQuestions ¿Alguna idea de por qué el getRepeatCount() == 0 tiene que estar allí? – parkerfath

1

Tienes que crear tus diálogos a través del evento Actividad onCreateDialog, ya que ese es el punto en el que la Actividad los administra y se restaurarán cuando la actividad se reanude.

Devolución de llamada para crear cuadros de diálogo gestionados (guardados y restaurados) por la actividad. Si usa showDialog(int), la actividad llamará a este método la primera vez y lo seguirá a partir de ese momento. Cualquier diálogo creado por este método se guardará y restaurará automáticamente, incluso si se muestra. Si desea que la actividad administre los diálogos de guardado y restauración para usted, debe anular este método y manejar los identificadores que se pasan a showDialog (int). Si desea una oportunidad para preparar su cuadro de diálogo antes de que se muestre, anule onPrepareDialog(int, Dialog).

uso

Ejemplo:

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

Lo he intentado, y el cuadro de diálogo todavía se descarta cuando presiono el botón de búsqueda. – yuku

+0

¿Y cuando volvió a la aplicación? – Pentium10

+0

el diálogo de progreso ya no existe :( – yuku

35
setCanceledOnTouchOutside(false); 
3

mProgressDialog.setCancelable(false); funcionó para mí.

Cuestiones relacionadas