【问题标题】:How to map accented characters in keyboard xml如何在键盘xml中映射重音字符
【发布时间】:2017-07-08 09:23:07
【问题描述】:

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

这些是: í, é, á, ű, ú, ő, ó, ü, ö

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

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

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="10%p"
    android:horizontalGap="0px"
    android:verticalGap="0px"
    >

<Row android:keyHeight="16%">
    <Key android:codes="45" android:keyLabel="q" android:keyEdgeFlags="left"/>
    <Key android:codes="51" android:keyLabel="w"/>
    <Key android:codes="33" android:keyLabel="e"/>
    <Key android:codes="46" android:keyLabel="r"/>
    <Key android:codes="48" android:keyLabel="t"/>
    <Key android:codes="54" android:keyLabel="z"/>
    <Key android:codes="49" android:keyLabel="u"/>
    <Key android:codes="37" android:keyLabel="i"/>
    <Key android:codes="43" android:keyLabel="o"/>
    <Key android:codes="44" android:keyLabel="p" android:keyEdgeFlags="right"/>
</Row>

<Row android:keyHeight="16%">
    <Key android:codes="?" android:keyLabel="ö" android:keyEdgeFlags="left"/>
    <Key android:codes="?" android:keyLabel="ő"/>
    <Key android:codes="?" android:keyLabel="ü"/>
    <Key android:codes="?" android:keyLabel="ű"/>
    <Key android:codes="?" android:keyLabel="ó"/>
    <Key android:codes="?" android:keyLabel="é"/>
    <Key android:codes="?" android:keyLabel="á"/>
    <Key android:codes="?" android:keyLabel="í" android:keyEdgeFlags="right"/>
</Row>
</Keyboard>

【问题讨论】:

    标签: android android-softkeyboard android-xml


    【解决方案1】:

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

    在包含我的重音字符的行中插入了一个从 900 到 908 的自定义键码。

    <Row android:keyHeight="16%">
        <Key android:codes="900" android:keyLabel="ö" android:keyEdgeFlags="left"/>
        <Key android:codes="901" android:keyLabel="ő"/>
        <Key android:codes="902" android:keyLabel="ü"/>
        <Key android:codes="903" android:keyLabel="ű"/>
        <Key android:codes="904" android:keyLabel="ó"/>
        <Key android:codes="905" android:keyLabel="ú"/>
        <Key android:codes="906" android:keyLabel="á"/>
        <Key android:codes="907" android:keyLabel="é"/>
        <Key android:codes="908" android:keyLabel="í" android:keyEdgeFlags="right"/>
    </Row>
    

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

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

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {        
        if(primaryCode >= 900) {
        String character = null;
    
        switch(keyCode) {
            case 900:
                character = "ö";
                break;
            case 901:
                character = "ő";
                break;
            case 902:
                character = "ü";
                break;
            case 903:
                character = "ű";
                break;
            case 904:
                character = "ó";
                break;
            case 905:
                character = "ú";
                break;
            case 906:
                character = "á";
                break;
            case 907:
                character = "é";
                break;
            case 908:
                character = "í";
                break;
            default:
                return;
        }
    
        int start = mTargetView.getSelectionStart();
        int end = mTargetView.getSelectionEnd();
        mTargetView.getText().replace(Math.min(start, end), Math.max(start, end), character, 0, character.length());
        } else {
            long eventTime = System.currentTimeMillis();
            KeyEvent event = new KeyEvent(eventTime, eventTime,
                    KeyEvent.ACTION_DOWN, primaryCode, 0, 0, 0, 0,
                    KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE);
    
            mTargetActivity.dispatchKeyEvent(event);
        }
    
    }
    

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

    【讨论】:

    • 谢谢我也遇到了同样的问题,并从您的回答中解决。但是我想在 switch 案例中纠正你 - 出现 switch(primaryCode)。而不是 switch(keyCode)
    • 您可以从ascii table 中找到不同键的代码
    • 非常聪明 - 很棒的发现。
    【解决方案2】:

    一个更短的解决方案是删除codes,因为在这种情况下会发送标签文本。

    <Row>
        <Key android:keyLabel="ö" android:keyEdgeFlags="left"/>
        <Key android:keyLabel="ő"/>
        <Key android:keyLabel="ü"/>
        <Key android:keyLabel="ű"/>
        <Key android:keyLabel="ó"/>
        <Key android:keyLabel="ú"/>
        <Key android:keyLabel="á"/>
        <Key android:keyLabel="é"/>
        <Key android:keyLabel="í" android:keyEdgeFlags="right"/>
    </Row>
    

    另见How to make an Android custom keyboard

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2013-06-29
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多