Программно вызвать событие движения смахивания в представлении Android - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь программно вызвать пролистывание в представлении. Есть другие вопросы с ответами, но они не работают для меня. Я также видел комментариев , в которых говорилось, что программное перетаскивание было отключено по соображениям безопасности, это правда? Я хотел бы найти окончательный ответ на этот вопрос.

Я попробовал следующий метод, чтобы плакат показал работу через видео, поэтому он должен работать! Что-то мне нужно в моей AndroidManifest? Я также попробовал scrollBy() API, но он не прокручивает мой контент, а вместо этого перемещает контент за экран.

Более того, я зарегистрировал OnTouchListener с моим видом и увидел, что приведенный ниже код копирует тот же формат запуска событий (ACTION_DOWN, ACTION_MOVE, ACTION_UP), что щелчок + перетаскивание и мышь Колесо сделать, хотя щелчок + перетаскивание и колесо мыши работает, в то время как программная прокрутка / пролистывание не работает.

        final Handler handler = new Handler();

        handler.post(new Runnable() {
            @Override
            public void run() {
                final MotionEvent event = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_DOWN, 500, 700, 0);
                dispatchTouchEvent(event);
                event.recycle();
            }
        });

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                final MotionEvent event = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_MOVE, 500, 700 ,0);
                dispatchTouchEvent(event);
                event.recycle();
            }
        }, 50);

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                final MotionEvent event = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_MOVE, 500 ,700 + 400, 0);
                dispatchTouchEvent(event);
                event.recycle();
            }
        }, 100);

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                final MotionEvent event = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_UP, 500, 700 + 400, 0);
                dispatchTouchEvent(event);
                event.recycle();
            }
        }, 1000);

1 Ответ

0 голосов
/ 03 апреля 2019

С androidx.test.uiautomator это вполне возможно - и это реальный сценарий. Я написал этот метод для проверки бесконечной прокрутки RecyclerView ... только потому, что мне лень пролистывать:

protected void fling(UiObject2 view, int speed, int pause) {
    Assert.assertThat(view, not(equalTo(null)));
    try {
        view.fling(Direction.DOWN, speed);
    } catch (StaleObjectException e) {
        Assert.fail();
    }
    sleep(pause);
}

автоматизация событий с adb shell input swipe также возможна ...

в обоих случаях событие не происходит из приложения, которое тестируется.

и в обоих случаях полагается на android.permission.INJECT_EVENTS.

на рутованном устройстве даже не нужно adb - см. ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...