Не може да получи 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. Едно просто заобиколно решение, което работи за мен, беше да задам

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, Built Target ниво 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
build target 19 изглежда също не извиква това (nexus 7 2012 android 4.4) - person yarbelk; 20.02.2014
comment
Не е пълно решение. Избирането на целия текст в javascript изглежда ми позволява да започна да изтривам при второто натискане на клавиша Backspace. - person yarbelk; 21.02.2014

Опитайте се да заснемете събитието "input" на 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 mobile или JQuery: откриване на промяна в полето за въвеждане

person viks    schedule 28.05.2015