У меня есть Android WebView
, который я использую для редактирования (делая его contenteditable
). Мне также нужно захватить определенные нажатия клавиш во время набора текста. Я не могу сделать это в Javascript (так как Android WebView не отправляет полезные данные нажатия клавиш), поэтому мне пришлось создать пользовательский InputConnection
.
. Проблема в том, что я могу вставить текст из другого приложения в веб-просмотр. Я могу вставить текст, скопированный из одного и того же веб-просмотра.
Если я заберу свой пользовательский MyInputConnection
, я могу вставить любой из них.
В моем классе веб-просмотра У меня есть это:
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection ic = super.onCreateInputConnection(outAttrs);
if (ic != null) {
//noinspection UnnecessaryLocalVariable
InputConnection mic = new MyInputConnection(ic);
return sic;
}
return ic;
}
А затем, в MyInputConnection
, почти все (за исключением commitText
, где выполняется обработка ключа) просто отправляется на исходный InputConnection
:
MyInputConnection
создается просто:
InputConnection IC;
MyInputConnection(InputConnection inputConnection) {
IC = inputConnection;
}
, и большинство вещей в нем обрабатываются как:
@Override
public CharSequence getTextBeforeCursor(int n, int flags) {
return IC.getTextBeforeCursor(n, flags);
}
(Примечание: я пытался просто расширить BaseInputConnection
и отправляет большинство вызовов на super
, но по любой причине, которая приводит к тому, что подсказки набора текста на программной клавиатуре не отображаются. И внешняя вставка также не работает в этом случае.)
// No soft-keyboard typing suggestions:
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
//noinspection UnnecessaryLocalVariable
InputConnection mic = new MyInputConnection(this);
return mic;
}
...
// MyInputConnection:
MyInputConnection(WebView view) {
super(view, true);
}
@Override
public CharSequence getTextBeforeCursor(int n, int flags) {
return super.getTextBeforeCursor(n, flags);
}