android - 当用户将光标移动到句子的开头时,Android自定义键盘中的自动大写
问题描述
我是 Android 编程的新手,正在学习从HackersKeyboard和SoftKeyboard示例中制作自己的 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();
}
}
}
我找不到与此自动大写问题相关的示例HackersKeyboard和SoftKeyboard的任何部分。非常感谢任何帮助。非常感谢。
编辑:这与EditText 的首字母大写不同。Android 自定义键盘在服务级别上工作,主要目标是在全球范围内与各种 EditText 一起工作。
解决方案
这不是你这样做的方式(我不确定 onKey 是什么,它不是 InputMethodService 的一部分)。您需要做的是检测光标更改,然后评估光标的上下文。通过 onUpdateCursor 执行此操作,获取光标的位置,然后通过 InputConnection 请求围绕它的上下文。之后,解析上下文并确定是否需要大写。
请注意,仅寻找句子结尾是不够的。一个 。也可以是数字、缩写等的一部分。正确使用它实际上需要一些工作。
推荐阅读
- date - 如何在 Power BI 中正确格式化日期
- c++ - 无法用函数的返回值初始化对象。为什么?
- c# - VS 2019 右键自定义右键动作
- css - 为 wordpress 古腾堡表格自定义表格标题行,只为单个页面
- python - 微软用python翻译?
- java - 休眠不删除孤儿实体
- ios - 在用于播放媒体文件的扬声器中播放的声音,而不是用于通话的扬声器
- sql - 如何获得两个日期的时差,例如 x 天 y 小时 z 秒 t 分钟
- javascript - 是否可以持久化/序列化/反序列化 JS 生成器?(在 node.js 或任何其他引擎中)
- angular - 未捕获的 ReferenceError:未定义全局