【发布时间】:2010-05-26 16:02:52
【问题描述】:
在 Android 中,如何从InstrumentationTestCase 发送长按?例如,我想做一个sendKeys(KEYCODE_DPAD_CENTER),但要长按。
【问题讨论】:
标签: android unit-testing keyevent
在 Android 中,如何从InstrumentationTestCase 发送长按?例如,我想做一个sendKeys(KEYCODE_DPAD_CENTER),但要长按。
【问题讨论】:
标签: android unit-testing keyevent
不知道这是否是唯一/正确的方法,但我设法做到了:
public void longClickDpadCenter() throws Exception {
getInstrumentation().sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER));
Thread.sleep(ViewConfiguration.get(mContext).getLongPressTimeout());
getInstrumentation().sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));
}
【讨论】:
你可以试试下面的辅助方法:
private void longPress(int key) {
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis();
KeyEvent event1 = new KeyEvent(downTime, eventTime, KeyEvent.ACTION_DOWN, key, 0);
KeyEvent event2 = new KeyEvent(downTime, eventTime, KeyEvent.ACTION_DOWN, key, 1);
getInstrumentation().sendKeySync(event1);
getInstrumentation().sendKeySync(event2);
}
及用法示例:
longPress(KeyEvent.KEYCODE_ENTER);
【讨论】:
android source code 中的第 179 行:
class InputKeyEvent implements InputCmd {
@Override
public void run(int inputSource, int displayId) {
String arg = nextArgRequired();
final boolean longpress = "--longpress".equals(arg);
if (longpress) {
arg = nextArgRequired();
}
do {
final int keycode = KeyEvent.keyCodeFromString(arg);
sendKeyEvent(inputSource, keycode, longpress, displayId);
} while ((arg = nextArg()) != null);
}
private void sendKeyEvent(int inputSource, int keyCode, boolean longpress, int displayId) {
final long now = SystemClock.uptimeMillis();
int repeatCount = 0;
KeyEvent event = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, repeatCount,
0 /*metaState*/, KeyCharacterMap.VIRTUAL_KEYBOARD, 0 /*scancode*/, 0 /*flags*/,
inputSource);
event.setDisplayId(displayId);
injectKeyEvent(event);
if (longpress) {
repeatCount++;
injectKeyEvent(KeyEvent.changeTimeRepeat(event, now, repeatCount,
KeyEvent.FLAG_LONG_PRESS));
}
injectKeyEvent(KeyEvent.changeAction(event, KeyEvent.ACTION_UP));
}
}
【讨论】: