Подтвердить что ты не робот

Android - нажмите клавишу клавиатуры

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

Я только что попробовал это:

1) Переопределите метод действия onKeyUp(int keyCode, KeyEvent event). Это не работает с softkeyboard, оно просто ловит несколько hardkeyboard.

2) Создайте мой OnKeyListener и зарегистрируйте его в моем просмотре, который содержит зарегистрированный и рабочий OnTouchListener. Это не работает вообще с softkeyboard.

3) Переопределите метод просмотра onKeyUp(int keyCode, KeyEvent event). Это не работает вообще, если я не установил свой OnKeyListener и не установил его.

4) С помощью объекта InputMethodManager Вызовите метод showSoftInput и передайте его моему представлению. Это не работает ни для поднятия клавиатуры, на самом деле я должен позвонить toggleSoftInput; ни поймать ключевые события.

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

4b9b3361

Ответ 1

Для работы с аппаратными клавишами и клавишей Назад вы можете использовать dispatchKeyEvent(KeyEvent event) в вашем Activity

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    Log.i("key pressed", String.valueOf(event.getKeyCode()));
    return super.dispatchKeyEvent(event);
}

UPD: к сожалению, вы не можете обрабатывать события программной клавиатуры (см. Обработка событий с одной клавишей), если вы не разработали собственную пользовательскую клавиатуру (перейдите по ссылке, чтобы узнать, как создавать ввод метод).

Ответ 2

С подсказкой vasart я могу получить событие KeyPress. Чтобы сделать печатный код для клавиатуры, я использовал функцию getUnicodeChar, передав ей состояние мета-кнопки, тогда просто репликация char решит проблему.

Это рабочий код:

@Override
public boolean dispatchKeyEvent(KeyEvent KEvent) 
{
    int keyaction = KEvent.getAction();

    if(keyaction == KeyEvent.ACTION_DOWN)
    {
        int keycode = KEvent.getKeyCode();
        int keyunicode = KEvent.getUnicodeChar(KEvent.getMetaState() );
        char character = (char) keyunicode;

        System.out.println("DEBUG MESSAGE KEY=" + character + " KEYCODE=" +  keycode);
    }


    return super.dispatchKeyEvent(KEvent);
}

Конечно, эта работа работает только с символом ASCII.

Ответ 3

Нет возможности обрабатывать события нажатия клавиш на программной клавиатуре (экранной клавиатуре) только с аппаратной клавиатуры.

для более подробной информации: Обработка действий клавиатуры

Примечание. При обработке событий клавиатуры с помощью класса KeyEvent и связанных API-интерфейсов следует ожидать, что такие события клавиатуры происходят только с аппаратной клавиатуры. Вы никогда не должны полагаться на получение событий клавиш для любой клавиши на программном методе ввода (экранная клавиатура).

Ответ 4

Когда клавиатура открыта в действии, ваша деятельность фактически становится передним планом... У всех TextArea или TextFields есть свой механизм, чтобы получить нажатие на клавиатуре onScreen... если вы хотите использовать onKeyDown() listner для виртуальной клавиатуры, убедитесь, что вы установили в AndroidManifest File под свою активность android: windowSoftInputMode = "stateAlwaysVisible", тогда onkeyDown() будет работать, это сработало для меня...