我是Android编程的新手,并且从示例HackersKeyboard和SoftKeyboard学习制作我自己的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();
}
}
}
我找不到与此自动上限问题相关的样本HackersKeyboard和SoftKeyboard的任何部分。任何帮助都非常感谢。非常感谢。
编辑:这与First letter capitalization for EditText不相似。 Android自定义键盘在服务级别工作,主要用于全局使用所有类型的EditText。
答案 0 :(得分:0)
这不是你怎么做的(我不确定onKey是什么,它不是InputMethodService的一部分)。您需要做的是检测光标更改,然后评估光标的上下文。通过onUpdateCursor执行此操作,获取光标的位置,然后通过InputConnection请求它周围的上下文。之后,解析上下文并确定是否需要大写。
请注意,仅仅寻找句子是不够的。一个 。也可以是数字,缩写等的一部分。正确地实现它需要一些工作。