Android:有没有办法模拟D-Pad事件(API 10)?

时间:2011-12-19 22:20:12

标签: android simulation keyevent d-pad

问题很简单。我必须模拟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.injectKeyEvent的内容,但发现没有任何效果。

  • 而且Instrumentation可以帮助模拟关键事件,但更多用于测试,而不是用于应用程序本身。

我认为有一个解决方案,因为对讲可以模拟物理D-Pad(http://code.google.com/p/eyes-free/source/browse/trunk/ime/latinime/src/com/googlecode/eyesfree/inputmethod/latin/LatinIME.java

4 个答案:

答案 0 :(得分:2)

我找到了智能解决方案(例如下载):

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

这就是一个内部算法,用于查找所选方向的下一个元素

答案 1 :(得分:1)

尝试使用KeyEvent.ACTION_UP而不是ACTION_DOWN。为我解决了类似的问题。

答案 2 :(得分:1)

您有两种方法可以实现目标:

首先,

Instrumentation inst=new Instrumentation();
inst.sendKeyDownUpSync(int  keycode);

先决条件:在同一过程中。

其次,对于考试,我想模拟KeyEvent.KEYCODE_DPAD_UP

getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_UP));

先决条件:必须绑定inputmethd

答案 3 :(得分:0)

鉴于

InputConnection ic = getCurrentInputConnection();

您可以通过模拟DPAD向下/向上事件将光标移动到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));