【问题标题】:DONE key on android keyboard安卓键盘上的 DONE 键
【发布时间】:2015-07-19 08:56:46
【问题描述】:

我在使用 done/enter/next 键时遇到问题。我正在制作 android 软键盘,每当我尝试搜索我无法做到的东西时,因为当我按下 DONE 键时,光标只会移动到下一行。这是我的代码:

XML

<Key android:keyLabel="DONE" android:keyWidth="11.11%" android:codes="-1"/>

JAVA

@Override
public void onKey(int primaryCode, int[] keyCodes) {
    InputConnection ic = getCurrentInputConnection();
    switch(primaryCode){
        case -1:
            ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
            break;
        default:
            char code = (char)primaryCode;
            if(Character.isLetter(code) && caps){
                code = Character.toUpperCase(code);
            }
            ic.commitText(String.valueOf(code), 1);
    }
}

示例:如果我在 Google 上搜索某些内容并输入我想要的内容,然后单击 DONE 键,我希望它开始搜索。你能帮我解决这个问题吗?提前致谢。

【问题讨论】:

    标签: android android-softkeyboard enter ime


    【解决方案1】:

    代替

    ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
    

    试试

    ic.performEditorAction(EditorInfo.IME_ACTION_GO);
    

    执行的动作应该是EditorInfo上定义的动作,它通过方法onStartInputView传递给你

    要在动作之间切换,请使用:

    (sEditorInfo.imeOptions & (EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION))
    

    希望这会有所帮助。

    代码:

    case -1:
    
        switch (sEditorInfo.imeOptions & (EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) {
            case EditorInfo.IME_ACTION_GO:
                ic.performEditorAction(EditorInfo.IME_ACTION_GO);
                break;
            case EditorInfo.IME_ACTION_NEXT:
                ic.performEditorAction(EditorInfo.IME_ACTION_NEXT);
                break;
            case EditorInfo.IME_ACTION_SEARCH:
                ic.performEditorAction(EditorInfo.IME_ACTION_SEARCH);
                break;
            case EditorInfo.IME_ACTION_SEND:
                ic.performEditorAction(EditorInfo.IME_ACTION_SEND);
                break;
            default:
                ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
                break;
        }
    
        break;
    

    【讨论】:

    • 您好,感谢您的快速回答。我是 Android 新手,所以我不知道应该把这行代码放在哪里: (sEditorInfo.imeOptions & (EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) 我有 onCreateInputView,你说这行代码应该在onStartInputView。你能解释一下我应该把什么放在哪里吗?
    • 您必须重写 onStartInputView 以获取 EditorInfo public void onStartInputView(EditorInfo info, boolean restarting) { 然后,在 case -1: ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)); break; 上,您应该切换 (sEditorInfo.imeOptions &amp; (EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) 的值而不是发送 akey 事件,并且对于每种情况,您执行相应的 EditorAction (IME_ACTION_GO、IME_ACTION_NEXT、IME_ACTION_SEARCH、...)
    • 好的,我明白了,但是你能给我看一下代码吗,然后我就可以看到发生了什么。我不知道如何处理 (sEditorInfo.imeOptions &amp; (EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) 。这是我的代码:case -1: 1ic.performEditorAction(EditorInfo.IME_ACTION_GO); break;
    • switch (sEditorInfo.imeOptions &amp; (EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) {}是什么情况
    • 请再看一下这个例子。你拥有一切。
    【解决方案2】:
    @Override
    public void onStartInputView(EditorInfo info, boolean restarting) {
        InputConnection ic = getCurrentInputConnection();
        switch (info.imeOptions & (EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) {
            case EditorInfo.IME_ACTION_GO:
                ic.performEditorAction(EditorInfo.IME_ACTION_GO);
                break;
            case EditorInfo.IME_ACTION_NEXT:
                ic.performEditorAction(EditorInfo.IME_ACTION_NEXT);
                break;
            case EditorInfo.IME_ACTION_SEARCH:
                ic.performEditorAction(EditorInfo.IME_ACTION_SEARCH);
                break;
            case EditorInfo.IME_ACTION_SEND:
                ic.performEditorAction(EditorInfo.IME_ACTION_SEND);
                break;
            default:
                ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
                break;
        }
    }
    @Override
    public void onKey(int primaryCode, int[] keyCodes) {
        InputConnection ic = getCurrentInputConnection();
        playClick(primaryCode);
        switch(primaryCode){
            case Keyboard.KEYCODE_DELETE :
                ic.deleteSurroundingText(1, 0);
                break;
            case Keyboard.KEYCODE_SHIFT:
                caps = !caps;
                keyboard.setShifted(caps);
                kv.invalidateAllKeys();
                break;
            case Keyboard.KEYCODE_DONE: // how this case needs to be handled ??
                //ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
    
                break;
            default:
                char code = (char)primaryCode;
                if(Character.isLetter(code) && caps){
                    code = Character.toUpperCase(code);
                }
                ic.commitText(String.valueOf(code),1);
        }
    }
    

    【讨论】:

    • 请提供解释;不要只是粘贴代码
    猜你喜欢
    • 2015-07-27
    • 2016-07-24
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多