0

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

Blah1
Blah2
Blah3
Blah4

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

Blq
Blah2
Blah3
Blah4

代替

Blah1
Blah2
Blah3
Blq

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

我试图拦截事件以手动执行操作,但是在替换文本时,javascript 和onKeyListenerjavascriptonKeyDown都没有onKeyPress注册事件。JavascriptonInput注册,但仅在发生替换之后。

任何想法如何规避这个?


更多信息:

As it turns out, when text is selected and a key is pressed on the soft keyboard, that keypress does not pass through the activity's dispatchKeyEvent method. 我假设这种差异是故障发生的基础。任何人都知道为什么以及如何发生这种情况,以及为什么会导致故障?我去看看能不能追踪到代码执行的路径。

4

1 回答 1

0

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

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

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

于 2013-11-09T07:39:47.587 回答