的Android SoftKeyboard的onkeydown /向上不检测“替代”键(Androi

2019-07-17 23:56发布

我有处理输入我的一个观点,我弹出一个键盘和设置视图可获得焦点。 现在,我可以得到一定的按键...

@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 {
    }
}

等等...性格按下我获得通过

event.getDisplayLabel()

只要我只想要正常的字母AZ工作。 在其他语言中,多个字母可以长按软键盘上的字母正常到达......然而,这些替代字母不能用的onkeydown /时测出的。 我只能探测到正常的字母,软键盘的标签。 现在,我的应用程序必须处理国外输入和信件,我已经改变了键盘土耳其,我可以在键盘上找到像I I U U字母,但如果我按他们,我没有得到任何回应。 不与event.getDisplayLabel也不event.getUnicodeChar(); 我如何检测这些信吗?

Answer 1:

当键盘打开时, onKeyDown()onKeyUp()方法不正确,因为Android的认为屏幕上的键盘作为一个独立的活动工作。

达到你想要什么,最简单的方法是重写onKeyPreIme()方法对你的看法。 例如,如果你想从一个EditText捕捉的onkeydown,创造延伸一个新的类EditText ,并覆盖onKeyPreIme()方法:

public class LoseFocusEditText extends EditText {

    private Context mContext;

    protected final String TAG = getClass().getName();

    public LoseFocusEditText(Context context) {
        super(context);
        mContext = context;
    }

    public LoseFocusEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    public LoseFocusEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mContext = context;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {

            //hide keyboard
            InputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
            mgr.hideSoftInputFromWindow(this.getWindowToken(), 0);

            //lose focus
            this.clearFocus();

            return true;
        }
        return false;
    }
}

这是在奇巧/ HTC一个测试。



Answer 2:

编辑:

我不知道是什么原因造成的不的onkeydown在所有被调用。 也许这是你的看法的问题吗? 有可能比我的,因为这种解决方案更好的答案。 无论哪种方式,这可能工作:

相反,从视图中使用的onkeydown的,在活动级别覆盖dispatchKeyEvent。 这将处理您的关键事件它获取到窗口管理器之前,所以一定要请你并没有明确处理任何关键事件超。

使用实施例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);
    }
}

NOW(我们对此深感抱歉)

你可以试试:

char key = (char)event.getUnicodeChar();

代替

char key = event.getDisplayLabel();

getDisplayLabel()只会给你显示的键盘,正如你指出的,不一定是用户选择了字符的关键。



Answer 3:

得到它了 :)

public boolean onKey(View v, int keyCode, KeyEvent event) {
    if(event.getAction()==KeyEvent.ACTION_DOWN) return true;
    if(keyCode==KeyEvent.KEYCODE_ALT_LEFT || keyCode==KeyEvent.KEYCODE_ALT_RIGHT || keyCode==KeyEvent.KEYCODE_SHIFT_LEFT || keyCode==KeyEvent.KEYCODE_SHIFT_RIGHT) return true;

    if (keyCode == KeyEvent.KEYCODE_DEL) {
        doBackspace();
        return true;
    } else if (keyCode == KeyEvent.KEYCODE_BACK) {
        if(this.avl!=null) this.avl.onInputCancelled(this);
        return false;
    } else if (keyCode == KeyEvent.KEYCODE_ENTER) {
        inputstarted=false;
        if(this.avl!=null) this.avl.onInputFinished(this,this.text,celldata);
        return true;
    }   

    String key = "";
    if (event.getAction()==KeyEvent.ACTION_UP) key = String.valueOf((char)event.getUnicodeChar()).toUpperCase();
    else if (event.getAction()==KeyEvent.ACTION_MULTIPLE) key = String.valueOf(event.getCharacters()).toUpperCase();
    return process(key);
}

最重要的部分是阻断ALT_LEFT / SHIFT_LEFT /等键码和ACTION_UP区分/ ACTION_MULTIPLE和要么使用event.getUnicodeChar()或event.getCharacters()。

它的工作原理现在,我可以得到所有的字符,甚至KEYCODE_DEL适用于移动。 但在平板电脑上我仍然得不到回调Delete键。 似乎是一个糟糕的错误,今天早上它工作得很好,甚至在平板电脑。



文章来源: Android SoftKeyboard onKeyDown/Up not detecting 'alternative' keys