How to Generate Key Presses Programmatically Andro

2019-02-07 16:51发布

In my application when the user presses DPAD_LEFT, i want to generate two DPAD_UP presses. I know it can be done using a method like this:

@Override private boolean onKeyDown(int keyCode, KeyEvent event) {

   if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {

        keyDownUp(KeyEvent.KEYCODE_DPAD_UP);

        keyDownUp(KeyEvent.KEYCODE_DPAD_UP);

        return true;

   }
   return super.onKeyDown(keyCode,event);
}

private void keyDownUp(int a) {

        getCurrentInputConnection().sendKeyEvent(

                new KeyEvent(KeyEvent.ACTION_DOWN, a));

        getCurrentInputConnection().sendKeyEvent(

                new KeyEvent(KeyEvent.ACTION_UP, a));

}

But, to being able to use "getCurrentInputConnection()" method, i need to extend InputMethodService and it is impossible cause my application already extends another class. Is there another way to solve this?

标签: java android key
4条回答
欢心
2楼-- · 2019-02-07 17:11

If you want to generate a key event that gets passed through the event pipeline and is fully handled (characters as well as special keys such as arrows - resulting in change focus) you must tap into the base of things. you can create an implementation of input method service but this is laborious. An easyer way is to get the handler of the current view hierarchy and send a message to it like this:

public final static int DISPATCH_KEY_FROM_IME = 1011;

KeyEvent evt = new KeyEvent(motionEvent.getAction(), keycode);
Message msg = new Message();
msg.what = DISPATCH_KEY_FROM_IME;
msg.obj = evt;

anyViewInTheHierarchy.getHandler().sendMessage(msg);

Simple :)

查看更多
The star\"
3楼-- · 2019-02-07 17:11
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));
查看更多
你好瞎i
4楼-- · 2019-02-07 17:13

I have not tried this (can't right now, sorry), and it does feel a bit like a hack, but couldn't you do something like this:

@Override private boolean onKeyDown(int keyCode, KeyEvent event) {

   if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
        super.onKeyDown(KeyEvent.KEYCODE_DPAD_UP,event);  
        return super.onKeyDown(KeyEvent.KEYCODE_DPAD_UP,event);  
   }
   return super.onKeyDown(keyCode,event);
}

Ofcourse, you could create another class and call that from your application.

查看更多
爷的心禁止访问
5楼-- · 2019-02-07 17:34

Create another class which is extending InputMethodService and call it from your application.

查看更多
登录 后发表回答