You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义键盘onReleaseKey中访问输入文本并实现元音替换

基于simple-keyboard实现连续小写元音替换为大写的方案

要实现「连续输入相同小写元音时自动替换为单个大写元音」的功能,你可以借助InputConnection来访问和修改输入文本,结合onReleaseKey方法完成逻辑判断,具体步骤如下:

1. 关联输入法服务以获取InputConnection

KeyboardState本身没有直接持有InputConnection,但它所属的输入法服务(比如项目中的LatinIME)可以通过getCurrentInputConnection()获取当前的输入连接。你需要在KeyboardState中持有输入法服务的引用:

// 在KeyboardState.java中添加成员变量
private final LatinIME mInputMethodService;

// 修改KeyboardState的构造方法,传入输入法服务实例
public KeyboardState(LatinIME inputMethodService) {
    mInputMethodService = inputMethodService;
    // 保留原有初始化逻辑
}

然后在LatinIME初始化KeyboardState时传入自身实例:

// 在LatinIME的初始化代码中
mKeyboardState = new KeyboardState(this);

2. 在onReleaseKey中实现替换逻辑

在onReleaseKey方法中,按以下逻辑处理:

  • 判断当前释放的按键是否为小写元音(a/e/i/o/u)
  • 获取光标前的两个字符,检查是否为连续的相同小写元音
  • 若是,则删除这两个字符并插入对应的大写元音

具体代码实现:

@Override
public void onReleaseKey(final int code, final boolean withSliding, final int autoCapsFlags, final int recapitalizeMode) {
    // 先执行原有逻辑,不要覆盖
    super.onReleaseKey(code, withSliding, autoCapsFlags, recapitalizeMode);

    // 1. 将按键code转换为对应字符,过滤非小写元音的按键
    char[] chars = Character.toChars(code);
    if (chars.length != 1) return;
    char keyChar = chars[0];
    if (!"aeiou".contains(String.valueOf(keyChar))) return;

    // 2. 获取当前输入连接,为空则终止逻辑
    InputConnection inputConnection = mInputMethodService.getCurrentInputConnection();
    if (inputConnection == null) return;

    // 3. 获取光标前的2个字符,判断是否为连续的相同小写元音
    CharSequence textBeforeCursor = inputConnection.getTextBeforeCursor(2, 0);
    if (textBeforeCursor == null || textBeforeCursor.length() < 2) return;
    String lastTwoChars = textBeforeCursor.toString();
    if (lastTwoChars.charAt(0) == keyChar && lastTwoChars.charAt(1) == keyChar) {
        // 4. 删除连续的两个小写元音
        inputConnection.deleteSurroundingText(2, 0);
        // 5. 插入对应的大写元音
        inputConnection.commitText(String.valueOf(Character.toUpperCase(keyChar)), 1);
    }
}

3. 注意事项

  • 调用InputConnection方法前必须做非空判断,避免空指针异常
  • 不要删除原有onReleaseKey的逻辑,仅在其后追加自定义处理
  • 测试时覆盖边缘场景:比如单个元音输入、非连续元音输入、退格后再输入元音等,确保逻辑不会误触发

内容的提问来源于stack exchange,提问作者Echchama Nayak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:25:21