2011-11-16 12 views
5

Estoy tratando de ver el evento de botón de retroceso para Android. Sé que ya hay mucho sobre esto en los formularios, sin embargo, mi código no funciona como los ejemplos dados. Aquí está mi fragmento de código para capturar el evento:No se puede detectar el evento de botón de retroceso de Android

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event){ 
    if(keyCode == KeyEvent.KEYCODE_BACK){ 
     Log.d(TAG, "back key captured"); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

También probé esto:

@Override 
public void onBackPressed(){ 
    Log.d(TAG, "in onBackPressed"); 
    finish(); 
} 

La salida de LogCat que cualquiera de los casos fue despedido no aparece. Alguien sabe una posible razón para esto?

Gracias.

+1

Comience agregando un registro antes de su prueba para asegurarse de ingresar al método. Si no, asegúrese de que su Vista es la que está enfocada actualmente. Si no, no obtendrá los eventos onKey. –

+0

En el primer ejemplo, al presionar el botón Atrás, ¿se produce el comportamiento predeterminado? –

Respuesta

15

Otro método para es anular el método public void onBackPressed(). Es más sencillo y más fácil de hacer.

+0

hmmm Acabo de intentarlo y no funcionó. Ver mi edición – coder

+3

¿De verdad? Eso es bastante extraño, ¿estás haciendo esto de una actividad ordinaria y nada se muestra en absoluto? Tal vez intente mostrar un brindis cuando presione el botón Atrás solo para verificar que su depurador no esté teniendo problemas. – Brian

-1

Así es cómo implementé el manejo del evento presionado tecla de retroceso.

/** 
    * onKeyDown method 
    * 
    * Executes code depending on what keyCode is pressed. 
    * 
    * @param int keyCode 
    * @param KeyEvent 
    *   event KeyEvent object 
    * 
    * @return true if the code completes execution, false otherwise 
    * 
    */ 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) {   
    switch (keyCode) { 
    case KeyEvent.KEYCODE_BACK: 
     Log.d(TAG, "back key captured"); 

     this.onBackPressed(); 

     //You could also use this.moveTaskToBack(true) to return to the Home screen 

     return true; 

    default: 
     return super.onKeyDown(keyCode, event); 
    } 
    }// end onKeyDown 
2

¿Se muestra el teclado suave? Esa vista capturará la tecla Atrás primero para descartarla antes de que su propio código pueda manejarla.

+0

En realidad estoy tratando de usar la tecla de retroceso para descartar el propio teclado personalizado – coder

+1

hasta tarde, pero para cualquier otra persona que tropieza con esta pregunta, http://stackoverflow.com/questions/3940127/intercept-back-button-from- soft-keyboard puede ser muy útil en caso de que el enfoque estándar Activity # onBackPressed() no funcione. – qix

8

Para recibir un evento de teclado, una Vista debe tener foco. Para obligar a este uso:

view.setFocusableInTouchMode(True); 
view.requestFocus(); 
1

Esto funciona para mí

private long lastBackPressTime = 0; 
    @Override 
public void onBackPressed() { 
    if (this.lastBackPressTime < System.currentTimeMillis() - 4000) { 
     Toast.makeText(this, R.string.backButtonWarning, 4000).show(); 
     this.lastBackPressTime = System.currentTimeMillis(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Últimamente e Iv estado experimentando una cantidad enorme de problemas debido a la ADT plugin, que doest generar Te archivo de recursos apropiate (R) . Así que compruebe que ha limpiado su proyecto

1

Mi situación puede ser inusual, pero tenía exactamente el mismo comportamiento, así que pensé en compartirla con la clase. La razón terminó siendo que dentro de mi evento onResume() para la Actividad, estaba comenzando otra actividad. Esa actividad se terminaba antes de que mostrara alguna UI, pero significaba que continuamente se llamaba "onResume" para mi actividad principal cada vez que terminaba la subactividad, y todos los eventos de botón de retroceso parecían desaparecer en la subactividad.

Cuestiones relacionadas