Fake KeyEvent doesn't work *exactly* like "real" button. Why?
Asked Answered
I

3

6

I am trying to invoke my main activity's onKeyDown() with KEYCODE_BACK, so that it behaves as if I pressed the 'back' button myself. I do that using the following code:

   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);

My activity's onKeyDown() currently only calls:

return super.onKeyDown(keyCode, event);

Yet, unlike the real Back button, when the "fake" code is called, the activity refuses to become invisible.

Why?

Ivette answered 22/4, 2011 at 1:27 Comment(0)
H
12

use

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

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

Henrique answered 22/4, 2011 at 2:3 Comment(2)
@Ivette public final boolean dispatch (KeyEvent.Callback receiver) is deprecated. public final boolean dispatch (KeyEvent.Callback receiver, KeyEvent.DispatcherState state, Object target) should in theory work also, but I have no experience using it.Henrique
@Henrique Could we create KeyEvent object using unicode char value?Insnare
S
3

Aleadam method don't work on my android 4.1.2. So I write workaround:

public void dispachBackKey() {
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));
}
Stalinist answered 15/2, 2013 at 9:43 Comment(0)
M
2

Try using this

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //....
    }
    return true;
}
Mertiemerton answered 22/4, 2011 at 1:37 Comment(1)
Thanks but I am already doing this. When I wrote "my onKeyDown() currently only calls super" I was merely simplifying the description. I actually Log.v() to LogCat in onKeyDown() to verify that my "fake" event is actually being called. It is, but when it reaches the point of having to become invisible, it doesn't.Ivette

© 2022 - 2024 — McMap. All rights reserved.