安卓:有没有一种模拟 D-Pad 事件(API 10)的方法?

7
这个问题很简单。我需要模拟dpad事件(UP,DOWN,RIGHT,LEFT,CENTER)来在我的GUI中导航,该GUI由许多按钮和其他元素组成。使用模拟器D-Pad,我可以通过GUI进行导航而无需编写代码。但是如何以编程方式实现这一点呢?
我已经尝试了很多次,但都没有成功:
- KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_LEFT); View.dispatchKeyEvent(event); 没有任何反应(焦点应该向右移动一个元素)。
- 我还阅读了很多关于windowManager.injectKeyEvent的内容,但没有找到有效的方法。
- Instrumentation也可以帮助模拟按键事件,但更多用于测试,而不适用于应用程序本身。
我认为有解决方案,因为Talkback可以模拟物理D-Pad。 (http://code.google.com/p/eyes-free/source/browse/trunk/ime/latinime/src/com/googlecode/eyesfree/inputmethod/latin/LatinIME.java)

我已经找到了Talkback解决方案,它们与InputConnection一起工作。 final InputConnection ic = getCurrentInputConnection(); 但是我必须从一个活动中发送D-Pad按键事件。 - NitroBoarder
4个回答

3

鉴于

InputConnection ic = getCurrentInputConnection();

您可以通过模拟 DPAD 下/上事件来移动 EditText 中的光标。只模拟上事件可能已经足够,但为了安全起见,我正在模拟完整事件。

左侧

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

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


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

那就是,一个内部算法来查找您选择方向上的下一个元素。

那对我不起作用。sendKeyEvent总是返回false,这表示“BaseInputConnection不再有效”。无论它意味着什么。 - vangorra

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接