首页 > 解决方案 > 当用户将光标移动到句子的开头时,Android自定义键盘中的自动大写

问题描述

我是 Android 编程的新手,正在学习从HackersKeyboardSoftKeyboard示例中制作自己的 Android 自定义键盘。我面临自动大写问题,不知道如何解决这个问题:当用户点击输入屏幕中的某处以将光标移动到句子的开头时,键盘应该自动移动。

示例:首先,这是一个句子。其次,这也是一句话。第三,这也是一个句子。当用户点击“第二”的开头(在第一句的句号和空格之后),键盘应该自动移动。

对于正常打字,当用户到达句子的结尾(用句号或问号等句子分隔符标记)时,我在 onKey 方法中使用以下代码(在扩展 InputMethodService 的主类中):

@Override
public void onKey(int primaryCode, int[] keyCodes) {
    InputConnection ic = getCurrentInputConnection();
    switch(primaryCode){
        case Keyboard.KEYCODE_DELETE :
            CharSequence selectedText = ic.getSelectedText(0);
            if (TextUtils.isEmpty(selectedText)) {
                ic.deleteSurroundingText(1, 0);
            } else {
                ic.commitText("", 1);
            }
            break;
        case Keyboard.KEYCODE_SHIFT:
            bCaps = !bCaps;
            myKeyboard.setShifted(bCaps);
            myKeyboardView.invalidateAllKeys();
            break;
        case Keyboard.KEYCODE_DONE:
            ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
            break;
        default:
            char code = (char)primaryCode;
            if(Character.isLetter(code) && bCaps){
                code = Character.toUpperCase(code);
            }
            ic.commitText(String.valueOf(code),1);

            //--------------------------------------------
            //Detect end of a sentence then shift keyboard.
            //This is not done yet. It should turned back to lower after typing first letter of sentence.
            //--------------------------------------------
            CharSequence lastTwo = ic.getTextBeforeCursor(2, 0);
            if (lastTwo == null || lastTwo.length()<=0 ||
               (lastTwo.charAt(1) == ASCII_SPACE && isSentenceSeparator(lastTwo.charAt(0)))) {
                bCaps = true;
                myKeyboard.setShifted(bCaps);
                myKeyboardView.invalidateAllKeys();
            }
    }
}

我找不到与此自动大写问题相关的示例HackersKeyboardSoftKeyboard的任何部分。非常感谢任何帮助。非常感谢。

编辑:这与EditText 的首字母大写不同。Android 自定义键盘在服务级别上工作,主要目标是在全球范围内与各种 EditText 一起工作。

标签: androidandroid-softkeyboardandroid-custom-keyboard

解决方案


这不是你这样做的方式(我不确定 onKey 是什么,它不是 InputMethodService 的一部分)。您需要做的是检测光标更改,然后评估光标的上下文。通过 onUpdateCursor 执行此操作,获取光标的位置,然后通过 InputConnection 请求围绕它的上下文。之后,解析上下文并确定是否需要大写。

请注意,仅寻找句子结尾是不够的。一个 。也可以是数字、缩写等的一部分。正确使用它实际上需要一些工作。


推荐阅读