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>\nRun Code Online (Sandbox Code Playgroud)\n
最后我用一个技巧解决了。
\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>\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n其中 mTargetView 是我的 EditText。通过这个技巧,我可以使用标准键盘 xml 映射将重音 unicode 字符和基本上所有内容插入到 EditText 中。
\n| 归档时间: |
|
| 查看次数: |
1841 次 |
| 最近记录: |