Android: есть ли способ имитировать события D-Pad (API 10)? - PullRequest
7 голосов
/ 20 декабря 2011

Проблема очень проста.Мне нужно смоделировать события dpad (ВВЕРХ, ВНИЗ, ВПРАВО, ВЛЕВО, ЦЕНТР) для навигации в моем графическом интерфейсе, который состоит из множества кнопок и других элементов.С помощью симулятора D-Pad я могу без линейного кода перебросить этот GUI.Но как я могу сделать это программно?

Я много пробовал безуспешно:

  • KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_LEFT); View.dispatchKeyEvent(event); Ничего не происходит (фокус должен переместиться на один элемент вправо)

  • Я также много читал о windowManager.injectKeyEvent, но не нашел ничего, что работает.

  • А также инструментарий может помочь имитировать ключевые события, но больше для тестирования,не для использования в самом приложении.

Я думаю, что есть решение, потому что двусторонняя связь может симулировать физический D-Pad (http://code.google.com/p/eyes-free/source/browse/trunk/ime/latinime/src/com/googlecode/eyesfree/inputmethod/latin/LatinIME.java)

Ответы [ 4 ]

2 голосов
/ 07 августа 2013

У вас есть два пути для достижения вашей цели:

Во-первых,

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 голосов
/ 21 декабря 2011

Я нашел умное решение (например, для перехода вниз):

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

Вот и все, внутренний алгоритм для поиска следующего элемента в выбранном вами направлении

1 голос
/ 04 апреля 2013

Попробуйте использовать KeyEvent.ACTION_UP вместо ACTION_DOWN. Решил похожую проблему для меня.

0 голосов
/ 09 июня 2018

С учетом

InputConnection ic = getCurrentInputConnection();

Вы можете перемещать курсор в EditText, имитируя события DPAD вверх / вниз. Вероятно, события up будет достаточно, но я собираюсь смоделировать полное событие, чтобы быть в безопасности.

левый

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