我想通过创建复杂的javascript来处理键盘事件来使WebView
可编辑。除 4.1 外,所有Android版本都能正常运行。
在 4.1 中,我可以处理除KeyEvent.KEYCODE_DEL
之外的所有关键事件。我们似乎无法在Android 4.1中处理KEYCODE_DEL
的{{1}}事件?如果有人能在这个问题上帮助我,我将非常感激
由于
答案 0 :(得分:4)
看起来像是一个Android错误。一个对我有用的简单解决方法是设置
android:targetSdkVersion="15"
在你的AndroidManifest.xml
中经过一些更多的研究,我现在认为这不是一个错误,而是一个刻意的改变。 KeyEvent
文档说:
由于软输入法可以使用多种创造性的输入方式 文字,无法保证软键盘上的任何按键都会 生成一个关键事件:这由IME自行决定,并在 不鼓励发送此类事件的事实。你永远不应该依赖 接收软输入法上任何键的KeyEvents。特别是, 默认软件键盘永远不会向任何键事件发送任何键事件 应用程序目标是Jelly Bean或更高版本,并且只会发送事件 对于一些按下删除键和返回键到应用程序 目标冰淇淋三明治或更早。
实际上,除了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()
方法以获取有关外语字母键等的事件。
答案 1 :(得分:0)
我认为您可以扩展webview并覆盖public boolean onKeyPreIme(int keyCode, KeyEvent event)
答案 2 :(得分:0)
尝试捕获'输入' 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 not firing the keyup event in android mobile 或JQuery: detect change in input field