公司自主研發的終端產品形態是帶有物理按鍵的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。