當焦點在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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章