WebView bug - 替换 ContentEditable 中的选定文本

WebView bug - replace selected text in ContentEditable

本文关键字:文本 ContentEditable bug 替换 WebView      更新时间:2023-09-26

所以,事情是这样的。 我有一个显示内容可编辑div 的 WebView。 现在,当我选择文本时,一切都很好,通过javascript接口,我可以看到document.getSelection()返回了它应该返回的内容。 但是,当我键入某些内容时,它似乎替换了当前节点中所选文本,而不是替换当前节点中的选定文本。 例如,如果我有

Blah1
Blah2
Blah3
Blah4

选择"ah4"并输入"q",我最终得到

Blq
Blah2
Blah3
Blah4

而不是

Blah1
Blah2
Blah3
Blq

我注意到,如果我使用硬件键盘而不是软键盘在模拟器上运行它,它可以正常工作。

我试图拦截事件以手动执行操作,但是onKeyListener和 javascript 都没有onKeyDown,也没有onKeyPress在替换文本时注册事件。 Javascript onInput寄存器,但仅在替换发生之后。

有什么想法可以避免这种情况吗?


更多信息:

事实证明,当选择文本并按下软键盘上的某个键时,该键不会通过活动的调度 KeyEvent 方法。 我假设这种差异是故障发生的根本。 有人知道为什么以及如何发生这种情况,以及为什么会导致故障吗? 我要去看看我是否可以跟踪代码执行的路径。

哈! 找到了解决方案! 在 android 源代码中进行了太多的混乱之后,我最终尝试了以下内容:子类化 WebView,并覆盖以下方法:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    return new BaseInputConnection(this, false);
}

这就行了! 当然,选择(蓝色条纹)在您键入后在视觉上徘徊,但它至少会替换您期望的文本,并且条纹不会影响任何内容。 另外,无论如何,它以前这样做过。 我希望也有一种相当简单的方法来摆脱它。