7

问题很简单。我必须模拟 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 可以帮助模拟关键事件,但更多的是用于测试,而不是在应用程序本身中使用。

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

4

4 回答 4

2

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

第一的,

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

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

其次,例如,我想模拟 KeyEvent.KEYCODE_DPAD_UP

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

先决条件:必须绑定inputmethd

于 2013-08-07T05:50:53.923 回答
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);

就是这样,一个内部算法可以在您选择的方向上找到下一个元素

于 2011-12-21T17:56:07.373 回答
2

给定

InputConnection ic = getCurrentInputConnection();

EditText您可以通过模拟 DPAD 向下/向上事件来移动光标。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));
于 2018-06-09T07:50:26.913 回答
1

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

于 2013-04-04T17:27:41.360 回答