android - 在android WebView中输入特殊字符

标签 android input webview special-characters keyevent

我想在 Android webview 中输入特殊字符(例如“ä”、“é”、“£”等)。 这些角色不包含在虚拟 KCM(关键角色映射)中。因此我无法检索与该角色关联的键码并创建 KeyEvent。

我尝试了不同的方法:

String t = "testàaâäù";
char[] charArray = t.toCharArray();
if (charArray.length > 0) {
    KeyCharacterMap keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
    KeyEvent[] events = keyCharacterMap.getEvents(charArray);
}
// events is null, because some characters aren't include in KCM
// it never works in any case

使用仪器方法:

instrumentation.sendStringSync("a");                   // Display 'a'
instrumentation.sendStringSync("àâä");                 // Display nothing
instrumentation.sendCharacterSync(KeyEvent.KEYCODE_H); // Display 'h'
// Instrumentation seems to use KCM for data entry

使用 ACTION_MULTIPLE KeyEvent:

KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), String.valueOf("aàâä"), 0, 0);
focusedView.dispatchKeyEvent(event);
// Doesn't work with WebView, but works with other components such as EditText.
// I get this error: Unimplemented WebView method onKeyMultiple called from: android.webkit.WebView.onKeyMultiple

我可以实现 onKeyMultiple (WebView) 方法来处理数据输入吗?有没有办法在webview中输入特殊字符?我需要一个不需要 root 或创建键盘布局的解决方案(用户无需选择键盘)。

最佳答案

在 WebView 内的输入字段上使用虚拟键盘进行书写时,我遇到了同样的问题。它不会识别像“á”这样的特殊字符。我做了什么:

if (event.getAction() == KeyEvent.ACTION_MULTIPLE) {
    loadUrl("javascript:var prevText = document.activeElement.value;" +
            "var afterText = document.activeElement.value = prevText + \"" + event.getCharacters() + "\";");
    return false;
}

当 JavaScript 的操作为 ACTION_MULTIPLE 时,我会获取输入字段并附加特殊字符。

这是全类同学:

public class CustomWebView extends WebView {

    public CustomWebView (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        ExtenderInputConnection connection = new ExtenderInputConnection(this, false);
        outAttrs.imeOptions = EditorInfo.IME_ACTION_SEARCH;
        return  connection;
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {

        if (event.getAction() == KeyEvent.ACTION_MULTIPLE) {
            loadUrl("javascript:var prevText = document.activeElement.value;" +
                    "var afterText = document.activeElement.value = prevText + \"" + event.getCharacters() + "\";");
            return false;
        }

        return super.dispatchKeyEvent(event);
    }

    public class ExtenderInputConnection extends BaseInputConnection implements InputConnection {

        public ExtenderInputConnection(View targetView, boolean fullEditor) {
            super(targetView, fullEditor);
        }


        @Override
        public boolean deleteSurroundingText(int beforeLength, int afterLength) {

            if (beforeLength == 1 && afterLength == 0) {
                // backspace
                return super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)) && super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
            }
            return super.deleteSurroundingText(beforeLength, afterLength);
        }
    }
}

希望有帮助。

关于android - 在android WebView中输入特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36132949/

相关文章:

java - 布局 xml 中的资源,但编译器错误为 "not found"

android - 从 Google Pay 中排除信用卡

java - 位图没有正确保存只有黑色图像

html - 为什么应用背景颜色时文本输入会更改其边框属性?

c - 'toupper' 和 'tolower' 对 C 中的 char 数组没有影响

java - webview 不加载我的 html

javascript - "Chrome Apps"webview.executeScript 访问guest全局变量

javascript - onBackPressed 事件在 web View 中无法正常工作

android - 图像放入 CollapsingToolbarLayout 时会忽略 scaleType

c++ - 如何使用户输入多行