Android點擊其餘任意位置收起軟鍵盤

  在Android應用開發中,常常出現這樣的需求,用戶在輸入文字的過程當中,可能不想繼續輸入了,經過滑動或者點擊其餘位置(除軟鍵盤和EditText之外的任何位置),但願可以自動收回鍵盤,這個功能可能有些rom會本身實現了,可是大部分仍是沒有本身實現這個功能的,那麼若是咱們要本身實現,要如何解決呢?ide

  首先,咱們固然要先攔截其餘任何的用戶觸摸屏幕的事件,經過重寫Activity的boolean dispatchTouchEvent(MotionEvent ev);但是實現攔截用戶的觸摸事件。代碼以下:函數

1     @Override
2     public boolean dispatchTouchEvent(MotionEvent ev) {
3         DisplayUtils.hideInputWhenTouchOtherView(this, ev, getExcludeTouchHideInputViews());
4         return super.dispatchTouchEvent(ev);
5     }

DisplayUtils.hideInputWhenTouchOtherView方法就是咱們本身實現的當必要時候隱藏軟鍵盤的代碼了。關於hideInputWhenTouchOtherView的方法實現以下:佈局

 1    /**
 2      * 當點擊其餘View時隱藏軟鍵盤
 3      * @param activity
 4      * @param ev
 5      * @param excludeViews  點擊這些View不會觸發隱藏軟鍵盤動做
 6      */
 7     public static final void hideInputWhenTouchOtherView(Activity activity, MotionEvent ev, List<View> excludeViews){
 8 
 9 
10         if (ev.getAction() == MotionEvent.ACTION_DOWN){
11             if (excludeViews != null && !excludeViews.isEmpty()){
12                 for (int i = 0; i < excludeViews.size(); i++){
13                     if (isTouchView(excludeViews.get(i), ev)){
14                         return;
15                     }
16                 }
17             }
18             View v = activity.getCurrentFocus();
19             if (DisplayUtils.isShouldHideInput(v, ev)){
20                 InputMethodManager inputMethodManager = (InputMethodManager)
21                         activity.getSystemService(Context.INPUT_METHOD_SERVICE);
22                 if (inputMethodManager != null){
23                     inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
24                 }
25             }
26 
27         }
28     }

方法參數中的excludeViews表示點擊這麼View不會去試圖隱藏軟鍵盤,由於有些View的觸摸事件咱們有時候並不但願去隱藏軟鍵盤,好比EditText的背景佈局,聊天輸入框的發送按鈕等(若是摸一下發送按鈕,鍵盤就收回去了豈不是很蛋疼)this

  能夠看到,整個方法方法的實現過程就是經過判斷觸摸位置是屬於哪一個View,若是是須要排除的View,就直接不處理了.若是判斷出來是點擊了其餘任意非EditText的View,就會隱藏軟鍵盤。其餘兩個判斷函數以下:spa

 1     public static final boolean isTouchView(View view, MotionEvent event){
 2         if (view == null || event == null){
 3             return false;
 4         }
 5         int[] leftTop = {0, 0};
 6         view.getLocationInWindow(leftTop);
 7         int left = leftTop[0];
 8         int top = leftTop[1];
 9         int bottom = top + view.getHeight();
10         int right = left + view.getWidth();
11         if (event.getRawX() > left && event.getRawX() < right
12                 && event.getRawY() > top && event.getRawY() < bottom){
13             return true;
14         }
15         return false;
16     }
17 
18     public static final boolean isShouldHideInput(View v, MotionEvent event){
19         if (v != null && (v instanceof EditText)){
20             return !isTouchView(v, event);
21         }
22         return false;
23     }

  經過複用hideInputWhenTouchOtherView() 方法(甚至你能夠在基類Activity裏實現)就能夠在任何Activity中以最少代碼實現點擊其餘任意位置收起軟鍵盤的功能了。若是代碼有什麼須要指正或者有更好的替代方案的,請你們及時告知哈。code

相關文章
相關標籤/搜索