【问题标题】:How do you send a long press from an InstrumentationTestCase?如何从 InstrumentationTestCase 发送长按?
【发布时间】:2010-05-26 16:02:52
【问题描述】:

在 Android 中,如何从InstrumentationTestCase 发送长按?例如,我想做一个sendKeys(KEYCODE_DPAD_CENTER),但要长按。

【问题讨论】:

    标签: android unit-testing keyevent


    【解决方案1】:

    不知道这是否是唯一/正确的方法,但我设法做到了:

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

    【讨论】:

    • 也可以通过以下代码实现- KeyEvent event = new KeyEvent(downTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER, 1); getInstrumentation.sendKeySync(event);
    【解决方案2】:

    你可以试试下面的辅助方法:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-04
        • 2013-01-30
        相关资源
        最近更新 更多