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

来源:互联网 发布:复旦大数据学院研究生 编辑:程序博客网 时间:2024/05/16 07:19

公司自主研发的终端产品形态是带有物理按键的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。

0 0
原创粉丝点击