Android SoftKeyboard onKeyDown/Up 未检测到“替代”键

El *_*ino 5 android android-softkeyboard

我有一个为我处理输入的视图,我弹出一个键盘并将视图设置为可聚焦。现在我可以得到某些按键...

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DEL) {
    } else if (keyCode == KeyEvent.KEYCODE_BACK) {
    } else if (keyCode == KeyEvent.KEYCODE_ENTER) {
    } else {
    }
}
Run Code Online (Sandbox Code Playgroud)

等等......我通过使用得到的角色

event.getDisplayLabel()
Run Code Online (Sandbox Code Playgroud)

只要我只想要普通的字母 AZ,就可以工作。在其他语言中,通过长按软键盘上的普通字母可以访问更多字母……但是,onKeyDown/Up 无法检测到这些替代字母。我只能检测正常的字母,软键盘的标签。现在我的应用程序必须处理外国输入和字母,我已将键盘更改为土耳其语,我可以在键盘上找到 í ì ú ù 之类的字母,但是如果我按下它们,则没有任何反应。不是 event.getDisplayLabel 也不是 event.getUnicodeChar(); 我如何检测这些字母?

jac*_*ted 2

编辑:

我不确定是什么导致 onKeyDown 根本不被调用。或许是你的观点有问题?因此,可能有比我的解决方案更好的答案。不管怎样,这可能会起作用:

不要使用视图中的 onKeyDown,而是在活动级别重写dispatchKeyEvent。这将在您的按键事件到达窗口管理器之前对其进行处理,因此请确保对您未显式处理的任何按键事件调用 super 。

使用 ACTION_DOWN 的示例(因为每个事件都有 ACTION_UP 和 ACTION_DOWN),因为您的示例使用了 onKeyDown:

@Override
public boolean dispatchKeyEvent(KeyEvent event){
    if(event.getAction() == KeyEvent.ACTION_UP) {
        return super.dispatchKeyEvent(event);
    }

    if (keyCode == KeyEvent.KEYCODE_DEL) {
    } else if (keyCode == KeyEvent.KEYCODE_BACK) {
    } else if (keyCode == KeyEvent.KEYCODE_ENTER) {
    } else {
        return super.dispatchKeyEvent(event);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在(对此感到抱歉)

你可以试试:

char key = (char)event.getUnicodeChar();
Run Code Online (Sandbox Code Playgroud)

代替

char key = event.getDisplayLabel();
Run Code Online (Sandbox Code Playgroud)

getDisplayLabel() 只会为您提供键盘上显示的键,正如您所指出的,该键不一定是用户选择的字符。