问题很简单。我必须模拟dpad事件(UP、DOWN、RIGHT、LEFT、CENTER),以便在由许多按钮和其他元素组成的GUI中导航。有了模拟器D-Pad,我可以不需要一行代码就可以浏览这个GUI。但是我怎么用程序来做呢?
我试了很多次都没有成功:
-
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_LEFT); View.dispatchKeyEvent(event);
什么也没发生(焦点应该向右移动一个元素) -
我也读了很多关于windowManager。
- 并且Instrumentation可以帮助模拟关键事件,但更多的是用于测试,而不是用于应用程序本身。
我认为有一个解决方案,因为反馈可以模拟物理的D-Pad (http://code.google.com/p/eyes-free/source/browse/trunk/ime/latinime/src/com/googlecode/eyesfree/inputmethod/latin/LatinIME.java)
给定
InputConnection ic = getCurrentInputConnection();
您可以通过模拟DPAD down/up事件来移动EditText
中的光标。up事件可能就足够了,但为了安全起见,我正在模拟整个事件。
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT));
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_LEFT));
对
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT));
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_RIGHT));
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP));
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_UP));
到
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN));
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN));
你有两种方法来实现你的目标:
,
Instrumentation inst=new Instrumentation();
inst.sendKeyDownUpSync(int keycode);
前提条件:同上。
第二,例如,我想模拟KeyEvent。KEYCODE_DPAD_UP
getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_UP));
前提条件:必须绑定inputmethod
我找到了一个聪明的解决方案(例如:go down):
bic=new BaseInputConnection(this.getWindow().getDecorView(),false);
KeyEvent event2 = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN,0, KeyEvent.META_SYM_ON, 0, 0, KeyEvent.FLAG_VIRTUAL_HARD_KEY);
bic.sendKeyEvent(event2);
就是这样,一个内部算法在你选择的方向上找到下一个元素
尝试使用KeyEvent。ACTION_UP而不是ACTION_DOWN。为我解决了类似的问题