輸入法鍵盤是Android開發中必不可免的一部分,一般情況下對於使用者體驗要求比較高的產品或者專案,都會有這樣一個要求,當我們使用完EditText控制元件後,我們再點選其他頁面時,需要我們自動隱藏掉輸入法鍵盤,我們通常情況下的做法就是,先去判斷輸入法鍵盤是否已經顯示了,如果顯示則關閉它,如果沒有顯示,則不用管。而網上關於判斷輸入法是否顯示的程式碼,則基本都是差不多的,然而並沒有什麼卵用。
現在我們介紹一個小技巧就可以實現上面的功能,經過測試使用,暫時還沒發現問題。
我們在開發一個專案時一般情況下我們都得封裝一個基類-BaseActivity,現在我們的這個方案就是在基類中覆寫就行了。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP) {
View v = getCurrentFocus();
//如果不是落在EditText區域,則需要關閉輸入法
if (HideKeyboard(v, ev)) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
return super.dispatchTouchEvent(ev);
}
// 根據EditText所在座標和使用者點選的座標相對比,來判斷是否隱藏鍵盤
private boolean HideKeyboard(View view, MotionEvent event) {
if (view != null && (view instanceof EditText)) {
int[] location = { 0, 0 };
view.getLocationInWindow(location);
//獲取現在擁有焦點的控制元件view的位置,即EditText
int left = location[0], top = location[1], bottom = top + view.getHeight(), right = left + view.getWidth();
//判斷我們手指點選的區域是否落在EditText上面,如果不是,則返回true,否則返回false
boolean isInEt = (event.getX() > left && event.getX() < right && event.getY() > top
&& event.getY() < bottom);
return !isInEt;
}
return false;
}複製程式碼
中心思想就是首先判斷我們手指點選的區域座標是否落在EditText上面,如果不是的話,我們需要強制關閉輸入法,不管是否已經顯示和關閉,這相對於以前我們直接判斷輸入法是否已經顯示的方案簡單不少!
我們只要在基類中覆寫上面的程式碼即可實現輸入法關閉的效果~
關於作者:
1. 簡書 http://www.jianshu.com/users/18281bdb07ce/latest_articles
2. 部落格 http://crazyandcoder.github.io/