How to Generate Key Presses Programmatically Andro

2019-02-07 16:48发布

问题:

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?

回答1:

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



回答2:

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



回答3:

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


回答4:

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.



标签: java android key