Преобразовать значение Юникода в константу KeyEvent в OnKeyboardActionListener.onKey - PullRequest
2 голосов
/ 12 августа 2011

Я новичок в разработке для Android и в настоящее время программирую редактор методов ввода (IME) для операционной системы Google Android (уровень API 11 == версия 3.0).

(следующий код упрощен для указанияпроблема.)

Я могу отправлять символы в базовое приложение с помощью:

@Override
public final void onKey(final int primaryCode, final int[] keyCodes) {    
    this.getCurrentInputConnection().commitText(String.valueOf((char) primaryCode), 1);
}

Теперь я хочу отправить специальные комбинации клавиш (например, SHIFT + A).Java-код для достижения этой цели следующий (для особого случая SHIFT + A):

@Override
public final void onKey(final int primaryCode, final int[] keyCodes) {
        long eventTime = SystemClock.uptimeMillis();    
        this.sendDownKeyEvent(KeyEvent.KEYCODE_SHIFT_LEFT);

        KeyEvent keyEvent = new KeyEvent(
            eventTime,
            eventTime,
            KeyEvent.ACTION_DOWN,
            KeyEvent.KEYCODE_A, // ToDo: How to convert primaryCode to the corresponding KeyEvent constant?
            KeyEvent.META_SHIFT_ON
        );
        this.getCurrentInputConnection().sendKeyEvent(keyEvent);
}

public final void sendDownKeyEvent(final int keyEventCode) {
    InputConnection ic = this.getCurrentInputConnection();
    if (ic != null) {
        long eventTime = SystemClock.uptimeMillis();
        ic.sendKeyEvent(
            new KeyEvent(
                eventTime, eventTime,
                KeyEvent.ACTION_DOWN, keyEventCode, 0, 0, 0, 0,
                KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE
            )
        );
    }
}

Комментарий в предыдущем примере кода показывает мою проблему.Чтобы отправить комбинации клавиш через объект KeyEvent , мне необходимо преобразовать переменную primaryCode (которая содержит код Unicode нажатой клавиши) в константу класса KeyEvent .

Удобный метод для этого случая уже существует или я должен написать его сам?В целом: является ли приведенное выше решение для отправки комбинаций клавиш элегантным или существуют лучшие подходы?(Нелегко найти примеры для Android IME в Интернете ...)

Заранее спасибо!

1 Ответ

1 голос
/ 01 ноября 2011

Кажется, немного поздно.Я нашел следующее решение той же проблемы, переведя primaryCode в последовательность KeyEvents.

. Решение включает загрузку KeyCharacterMap и использование его метода KeyCharacterMap.getEvents() для получения списка KeyEvent,может воспроизвести символ.

//This snippet tries to translate the glyph 'primaryCode' into key events

//retrieve the keycharacter map from a keyEvent (build yourself a default event if needed)
KeyCharacterMap myMap=KeyCharacterMap.load(event.getDeviceId()); 

//event list to reproduce glyph
KeyEvent evs[]=null;

//put the primariCode into an array
char chars[]=new char[1];
chars[0]=primaryCode;

// retrieve the key events that could have produced this glyph
evs=myMap.getEvents(chars);

if (evs != null){
    // we can reproduce this glyph with this key event array
    for (int i=0; i< evs.length;i++) MySendKeyEventHelperMethod(evs[i]);
}
else { /* could not find a way to reproduce this glyph */ }
...