Android当焦点在SearchView中时,输入法不能处理KEYCODE_BACK按键的原因

公司自主研发的终端产品形态是带有物理按键的T9数字键盘的,终端需要可以通过键盘来输入字符(中文、英文、数字等),当然同时也是可以删除的。
软件中的某个模块,使用了SearchView这个控件,当输入字符之后,用户可以通过back按键删除字符,但是在实现的过程中发现输入法不能获取KEYCODE_BACK按键。
翻了下SearchView的源码,发现SearchView$SearchAutoComplete重写了onKeyPreIme并处理了KEYCODE_BACK按键,导致输入法不能正常获取。

代码如下:

public static class SearchAutoComplete extends AutoCompleteTextView {
    ...
    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            // special case for the back key, we do not even try to send it
            // to the drop down list but instead, consume it immediately
            if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
                KeyEvent.DispatcherState state = getKeyDispatcherState();
                if (state != null) {
                    state.startTracking(event, this);
                }
                return true;
            } else if (event.getAction() == KeyEvent.ACTION_UP) {
                KeyEvent.DispatcherState state = getKeyDispatcherState();
                if (state != null) {
                    state.handleUpEvent(event);
                }
                if (event.isTracking() && !event.isCanceled()) {
                    mSearchView.clearFocus();
                    mSearchView.setImeVisibility(false);
                    return true;
                }
            }
        }
        return super.onKeyPreIme(keyCode, event);
    }
}

onKeyPreIme表示,在keyevent流入输入法之前,view进行一次拦截,当down和up都return true时,表示此keyevent将不被流向输入法。

当然也可以重写View#dispatchKeyEventPreIme。

特别注意,有些应用(如WhatsApp)中可能使用的是framework/v7包下的SearchView,记得也要把这里改了

猜你喜欢

转载自blog.csdn.net/zhangqi6627/article/details/107709133
今日推荐