2011-04-22 16 views
5

Estoy tratando de invocar onKeyDown() de mi actividad principal con KEYCODE_BACK, para que se comporte como si hubiera presionado el botón "volver". Lo hago con el siguiente código:Fake KeyEvent no funciona * exactamente * como el botón "real". ¿Por qué?

KeyEvent goBackDown = new KeyEvent(0,0,KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_BACK,0,0); 
    goBackDown.dispatch(activity); 
    SystemClock.sleep(50); // as if human pressed the key 
    KeyEvent goBackUp = new KeyEvent(0,0,KeyEvent.ACTION_UP,KeyEvent.KEYCODE_BACK,0,0); 
    goBackUp.dispatch(activity); 

de mi actividad onKeyDown() actualmente sólo llama:

return super.onKeyDown(keyCode, event); 

Sin embargo, a diferencia del botón verdadera Volver, cuando el código "falso" se llama, la actividad se niega a volverse invisible.

¿Por qué?

Respuesta

11

uso

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_BACK)); 

http://developer.android.com/reference/android/view/View.html#dispatchKeyEvent%28android.view.KeyEvent%29

+0

Funcionó. ¡Gracias! Ahora necesito entender por qué. :-) – srf

+0

@srf 'public boolean dispatch (KeyEvent.Callback receiver)' está en desuso. 'El boolean final público (KeyEvent.Callback receiver, KeyEvent.DispatcherState state, Object target)' debería funcionar también en teoría, pero no tengo experiencia en usarlo. – Aleadam

+0

@Aleadam ¿Podríamos crear un objeto KeyEvent usando un valor de carácter unicode? – smartkid

2

Trate de usar este

public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    { 
     //.... 
    } 
    return true; 
} 
+0

Gracias pero ya lo estoy haciendo. Cuando escribí "my onKeyDown() actualmente solo llama super", simplemente estaba simplificando la descripción. De hecho Log.v() a LogCat en onKeyDown() para verificar que mi evento "falso" realmente se está llamando. Lo es, pero cuando llega al punto de tener que volverse invisible, no lo hace. – srf

3

método Aleadam no funciona en mi androide 4.1.2. Así que escribo una solución:

public void dispachBackKey() { 
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); 
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); 
} 
Cuestiones relacionadas