Почему не работает симуляция MotionEvent? - PullRequest
6 голосов
/ 09 марта 2011

В одном из представлений в приложении тренировки я пытаюсь выполнить выделение текста программно.

Я могу (программно) войти в «режим выделения текста», который визуально обозначается CursorControllers (ручки AKA) в верхнем левом углу представления.

Если я вручную перетаскиваю правый CursorController, затем нажимаю его снова (в эмуляторе), он работает как положено (отлично), показывая короткое сообщение: «Текст скопирован в буфер обмена».

Но когда я пытаюсь программно перетащить этот правый CursorController, ничего не происходит.

Я пытаюсь это сделать, имитируя MotionEvent. По мнению, я звоню:

  event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0);
  MainActivity.onTouch(this, event);

В MainActivity я, конечно, реализую OnTouchListener:

@Override
public boolean onTouch(View v, MotionEvent event) { // called BEFORE button's onTouchEvent()
    Log.v("MainActivity::onTouch()", describeEvent(v, event));
    switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
        case MotionEvent.ACTION_UP: 
            if (!v.hasFocus()) { 
                v.requestFocus(); 
             } 
             break; 
    } 
    return false; 
}

Если я правильно понимаю, просто возвращая false из onTouch, Android продолжает искать другой объект пользовательского интерфейса для использования объекта MotionEvent, в конечном итоге достигая моего вида .

Почему этого не происходит?

Я, должно быть, упускаю что-то очень фундаментальное ...

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Из-за отсутствия работающего решения я могу только сделать вывод, что то, что я пытался достичь, невозможно на Android по соображениям безопасности.Объяснение можно найти по следующей ссылке: Как отправить синтезированный MotionEvent через систему?

0 голосов
/ 12 марта 2011

OnTouchListener вызывается внутри вида из dispatchTouchEvent, который, в свою очередь, вызывается из ViewGroup или TouchDelegate.Если вы вызываете слушателя с вашей точки зрения, он просто делает то, что у вас есть, а затем возвращается.Он нигде не делегирует событие касания.

Вместо этого вызовите dispatchTouchEvent() в своем представлении, чтобы получить правильный результат.

Для модульного тестирования поведения вашего приложения при выборе текста и т. Д. См. http://developer.android.com/resources/tutorials/testing/activity_test.html

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