Не удается получить KEYCODE_DEL в WebView в Android 4.1.1

Я хочу сделать WebView редактируемым, создав сложный javascript для обработки события клавиатуры. Все работает нормально на всех версиях Android, кроме 4.1. В 4.1 я могу обрабатывать все ключевые события, кроме KeyEvent.KEYCODE_DEL. Кажется, мы не можем обработать событие KEYCODE_DEL для WebView в Android 4.1? Я очень признателен, если кто-то может помочь мне в этом вопросе

Спасибо


person Email Booster    schedule 04.10.2012    source источник
comment
У меня такая же проблема на 4.1. У кого-нибудь есть идеи? Похоже это глюк 4.1.   -  person Michael Wojcik    schedule 15.10.2012
comment
Кроме того, я использую GLSurfaceView, поэтому проблема не только в WebView.   -  person Michael Wojcik    schedule 15.10.2012


Ответы (3)


Похоже на баг андроида. Простой обходной путь, который сработал для меня, состоял в том, чтобы установить

android:targetSdkVersion="15"

в вашем AndroidManifest.xml

ИЗМЕНИТЬ:

После некоторых дополнительных исследований я теперь думаю, что это не ошибка, а преднамеренное изменение. В документации KeyEvent говорится:

Поскольку программные методы ввода могут использовать несколько изобретательных способов ввода текста, нет гарантии, что любое нажатие клавиши на программной клавиатуре вызовет событие клавиши: это остается на усмотрение IME, и на самом деле отправка таких событий не рекомендуется. Вы никогда не должны полагаться на получение KeyEvents для любой клавиши в методе мягкого ввода. В частности, программная клавиатура по умолчанию никогда не будет отправлять какие-либо события клавиш любому приложению, предназначенному для Jelly Bean или более поздней версии, и будет отправлять события только для некоторых нажатий клавиш удаления и возврата приложениям, предназначенным для Ice Cream Sandwich или более ранней версии.

Однако на самом деле он по-прежнему отправляет события для большинства нажатий клавиш, кроме клавиши Delete. Поскольку мне действительно нужны были все ключевые события, я придумал это решение:

Сначала создайте свой собственный View (в моем случае он был получен из TextView) следующим образом:

public class MyTextView extends TextView {

  ...

    @Override
    public InputConnection onCreateInputConnection(EditorInfo editorInfo) {
        editorInfo.actionLabel = null;
        editorInfo.inputType   = InputType.TYPE_NULL;
        editorInfo.imeOptions  = EditorInfo.IME_ACTION_NONE;

        return new MyInputConnection(this, false);
    }

    @Override
    public boolean onCheckIsTextEditor() {
        return true;
    }
}

Во-вторых, создайте MyInputConnection, создав подкласс BaseInputConnection следующим образом:

public class MyInputConnection extends BaseInputConnection { 

    ...


    // From Android 4.1 this is called when the DEL key is pressed on the soft keyboard (and
    // sendKeyEvent() is not called). We convert this to a "normal" key event.
    @Override
    public boolean deleteSurroundingText(int beforeLength, int afterLength) {
        long eventTime = SystemClock.uptimeMillis();
        sendKeyEvent(new KeyEvent(eventTime, eventTime,
                KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
                KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE | KeyEvent.FLAG_EDITOR_ACTION));
        sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime,
                KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
                KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE | KeyEvent.FLAG_EDITOR_ACTION));
        return true;
    }

В вашем InputConnection классе вы хорошо контролируете происходящее. Например, вы можете переопределить метод commitText(), чтобы получать события о ключах букв иностранного языка и т. д.

person Lior Hass    schedule 28.02.2013
comment
Ты классный, это решение мне очень помогло - person Nifhel; 29.03.2013
comment
Не работает для уровня API 19, встроенного целевого уровня 19. Метод deleteSurroundingText() просто не вызывается вообще (Nexus 7 2012 под управлением Android 4.3, программная клавиатура по умолчанию). - person Carl; 09.12.2013

Я думаю, вы можете расширить веб-просмотр и переопределить public boolean onKeyPreIme(int keyCode, KeyEvent event)

person cheng yang    schedule 07.12.2012
comment
встроенная цель 19, похоже, тоже не вызывает этого (nexus 7 2012 android 4.4) - person yarbelk; 20.02.2014
comment
Не полное решение. Кажется, что выделение всего текста в javascript позволяет мне начать удаление при втором нажатии клавиши возврата. - person yarbelk; 21.02.2014

Попробуйте зафиксировать событие ввода на KEYCODE_DEL.

$('#textBox').on('input', function(event) {
    console.log(event, event.keyCode, event.which);
    // it will capture the event, but you will not get the event.keyCode 
    // and event.which.
});

Для получения дополнительной информации - backSpace не запускает событие keyup в мобильном устройстве Android или JQuery: обнаружить изменение в поле ввода

person viks    schedule 28.05.2015