用户将光标移动到句子开头时Android自定义键盘中的自动大写

时间:2018-05-29 13:15:26

标签: android android-softkeyboard android-custom-keyboard

我是Android编程的新手,并且从示例HackersKeyboardSoftKeyboard学习制作我自己的Android自定义键盘。 我面临着自动上限问题并且不知道如何克服这个问题:当用户点击输入屏幕中某处将光标移动到句子的起始点时,键盘应该自动移位。

实施例: 首先,这是一个句子。其次,这也是一句话。第三,这也是一句话。 当用户点击“Second”开头(句点和第一句话的空格)后,键盘应自动切换。

对于正常打字,当用户到达句子的末尾(用句子分隔符标记句点或问号)时,我在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的任何部分。任何帮助都非常感谢。非常感谢。

编辑:这与First letter capitalization for EditText不相似。 Android自定义键盘在服务级别工作,主要用于全局使用所有类型的EditText。

1 个答案:

答案 0 :(得分:0)

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

请注意,仅仅寻找句子是不够的。一个 。也可以是数字,缩写等的一部分。正确地实现它需要一些工作。