Похоже на баг андроида. Простой обходной путь, который сработал для меня, состоял в том, чтобы установить
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