如何在键盘 xml 中映射重音字符

Zol*_*abo 3 android android-softkeyboard android-xml

我必须在我的应用程序中实现一个简单的自定义软键盘,并且我也想在键盘上显示重音字符。

\n\n

它们是:\n\xc3\xad、\xc3\xa9、\xc3\xa1、\xc5\xb1、\xc3\xba、\xc5\x91、\xc3\xb3、\xc3\xbc、\xc3\xb6

\n\n

我的问题是如何在键盘 xml 中映射这些?这些的关键代码是什么?我在官方KeyEvent文档中找不到它们。

\n\n

我当前的键盘定义 xml 如下所示:

\n\n\n\n
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"\n    android:keyWidth="10%p"\n    android:horizontalGap="0px"\n    android:verticalGap="0px"\n    >\n\n<Row android:keyHeight="16%">\n    <Key android:codes="45" android:keyLabel="q" android:keyEdgeFlags="left"/>\n    <Key android:codes="51" android:keyLabel="w"/>\n    <Key android:codes="33" android:keyLabel="e"/>\n    <Key android:codes="46" android:keyLabel="r"/>\n    <Key android:codes="48" android:keyLabel="t"/>\n    <Key android:codes="54" android:keyLabel="z"/>\n    <Key android:codes="49" android:keyLabel="u"/>\n    <Key android:codes="37" android:keyLabel="i"/>\n    <Key android:codes="43" android:keyLabel="o"/>\n    <Key android:codes="44" android:keyLabel="p" android:keyEdgeFlags="right"/>\n</Row>\n\n<Row android:keyHeight="16%">\n    <Key android:codes="?" android:keyLabel="\xc3\xb6" android:keyEdgeFlags="left"/>\n    <Key android:codes="?" android:keyLabel="\xc5\x91"/>\n    <Key android:codes="?" android:keyLabel="\xc3\xbc"/>\n    <Key android:codes="?" android:keyLabel="\xc5\xb1"/>\n    <Key android:codes="?" android:keyLabel="\xc3\xb3"/>\n    <Key android:codes="?" android:keyLabel="\xc3\xa9"/>\n    <Key android:codes="?" android:keyLabel="\xc3\xa1"/>\n    <Key android:codes="?" android:keyLabel="\xc3\xad" android:keyEdgeFlags="right"/>\n</Row>\n</Keyboard>\n
Run Code Online (Sandbox Code Playgroud)\n

Zol*_*abo 5

最后我用一个技巧解决了。

\n\n

将 900 到 908 的自定义键码插入到包含我的重音字符的行中。

\n\n
<Row android:keyHeight="16%">\n    <Key android:codes="900" android:keyLabel="\xc3\xb6" android:keyEdgeFlags="left"/>\n    <Key android:codes="901" android:keyLabel="\xc5\x91"/>\n    <Key android:codes="902" android:keyLabel="\xc3\xbc"/>\n    <Key android:codes="903" android:keyLabel="\xc5\xb1"/>\n    <Key android:codes="904" android:keyLabel="\xc3\xb3"/>\n    <Key android:codes="905" android:keyLabel="\xc3\xba"/>\n    <Key android:codes="906" android:keyLabel="\xc3\xa1"/>\n    <Key android:codes="907" android:keyLabel="\xc3\xa9"/>\n    <Key android:codes="908" android:keyLabel="\xc3\xad" android:keyEdgeFlags="right"/>\n</Row>\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我设置 KeyboardView 的动作侦听器的地方,我将目标 EditText 作为对象传递给我的 OnKeyboardActionListener。

\n\n

这样,在 OnKeyboardActionListener 的 onKey 方法中,我可以检查 PrimaryCode 是否大于 900 或等于它,然后我只需设置 EditText 的文本并将重音字符插入到光标位置:

\n\n
@Override\npublic void onKey(int primaryCode, int[] keyCodes) {        \n    if(primaryCode >= 900) {\n    String character = null;\n\n    switch(keyCode) {\n        case 900:\n            character = "\xc3\xb6";\n            break;\n        case 901:\n            character = "\xc5\x91";\n            break;\n        case 902:\n            character = "\xc3\xbc";\n            break;\n        case 903:\n            character = "\xc5\xb1";\n            break;\n        case 904:\n            character = "\xc3\xb3";\n            break;\n        case 905:\n            character = "\xc3\xba";\n            break;\n        case 906:\n            character = "\xc3\xa1";\n            break;\n        case 907:\n            character = "\xc3\xa9";\n            break;\n        case 908:\n            character = "\xc3\xad";\n            break;\n        default:\n            return;\n    }\n\n    int start = mTargetView.getSelectionStart();\n    int end = mTargetView.getSelectionEnd();\n    mTargetView.getText().replace(Math.min(start, end), Math.max(start, end), character, 0, character.length());\n    } else {\n        long eventTime = System.currentTimeMillis();\n        KeyEvent event = new KeyEvent(eventTime, eventTime,\n                KeyEvent.ACTION_DOWN, primaryCode, 0, 0, 0, 0,\n                KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE);\n\n        mTargetActivity.dispatchKeyEvent(event);\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中 mTargetView 是我的 EditText。通过这个技巧,我可以使用标准键盘 xml 映射将重音 unicode 字符和基本上所有内容插入到 EditText 中。

\n