輸入法鍵盤是Android開發中必不可免的一部分,通常狀況下對於用戶體驗要求比較高的產品或者項目,都會有這樣一個要求,當咱們使用完EditText控件後,咱們再點擊其餘頁面時,須要咱們自動隱藏掉輸入法鍵盤,咱們一般狀況下的作法就是,先去判斷輸入法鍵盤是否已經顯示了,若是顯示則關閉它,若是沒有顯示,則不用管。而網上關於判斷輸入法是否顯示的代碼,則基本都是差很少的,然而並無什麼卵用。git
如今咱們介紹一個小技巧就能夠實現上面的功能,通過測試使用,暫時還沒發現問題。github
咱們在開發一個項目時通常狀況下咱們都得封裝一個基類-BaseActivity,如今咱們的這個方案就是在基類中覆寫就好了。bash
@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上面,若是不是的話,咱們須要強制關閉輸入法,無論是否已經顯示和關閉,這相對於之前咱們直接判斷輸入法是否已經顯示的方案簡單很多!ide
咱們只要在基類中覆寫上面的代碼便可實現輸入法關閉的效果~測試
關於做者:ui
1. 簡書 http://www.jianshu.com/users/18281bdb07ce/latest_articlesspa
2. 博客 http://crazyandcoder.github.io/code
3. github https://github.com/crazyandcoder開發
4. 掘金 https://juejin.im/user/56b96af96240b8005865df59/shareget