Android空白をクリックしてキーボードを隠す

3995 ワード

ここでは3つの案を紹介します.いずれもBaseActivityにカプセル化して使用することができ、自分の実際のニーズに合わせて適宜使用することができます.
  • 焦点(ネット上で最も多く紹介されている案)を判断する原理:イベント配布時に現在焦点を取得しているViewがEditTextかどうかを判断し、EditTextがMotionEventがこのView上で発生したかどうかを判断し、キーボードを隠すが、足りないのは別のEditTextをクリックするとキーボードが隠れて表示される.
  •     /**
         *       
         */
        @CallSuper
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            if (ev.getAction() == MotionEvent.MotionEvent ) {
                View view = getCurrentFocus();
                if (isShouldHideKeyBord(view, ev)) {
                    hideSoftInput(view.getWindowToken());
                }
            }
            return super.dispatchTouchEvent(ev);
        }
    
        /**
         *           
         */
        protected boolean isShouldHideKeyBord(View v, MotionEvent ev) {
            if (v != null && (v instanceof EditText)) {
                int[] l = {0, 0};
                v.getLocationInWindow(l);
                int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + v.getWidth();
                return !(ev.getX() > left && ev.getX() < right && ev.getY() > top && ev.getY() < bottom);
            }
            return false;
        }
    
        /**
         *      
         */
        private void hideSoftInput(IBinder token) {
            if (token != null) {
                InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                manager.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }
    
  • 本レイアウト設定クリックイベント原理:ルートレイアウトにクリックイベントを設定し、ルートレイアウトをクリックするとキーボードを隠す.足りないのは、フォーカスを取得できるコントロールにクリックしても無効です.
  •     @CallSuper
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //         
            ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    hideSoftInput(view.getWindowToken());
                }
            });
        }
    
        /**
         *      
         */
        private void hideSoftInput(IBinder token) {
            if (token != null) {
                InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                manager.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
            }
    
  • キーボードを隠す必要のないビューをフィルタリングする原理:イベント配信時にACTIONを判断するDOWNイベントはフィルタが必要なView上にあるか、キーボードを隠すのではなく、ACTIONが発生するたびに不足している.DOWNはfilterViewを1回ループします.
  •     /**
         *       
         */
        @CallSuper
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_DOWN  && filterViews != null) {
                View focusView = getCurrentFocus();
                if (isShouldHideKeyBord(ev)) {
                    hideSoftInput(focusView.getWindowToken());
                }
            }
            return super.dispatchTouchEvent(ev);
        }
    
        /**
         *        View
         */
        protected void setFilterView(View... view) {
            this.filterViews = view;
        }
    
        /**
         *           
         */
        protected boolean isShouldHideKeyBord(MotionEvent ev) {
            boolean hide = true;
            for (View v : filterViews) {
                int[] l = {0, 0};
                v.getLocationInWindow(l);
                int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + v.getWidth();
                if (ev.getX() > left && ev.getX() < right && ev.getY() > top && ev.getY() < bottom) {
                    hide = false;
                    break;
                }
            }
            return hide;
        }
    
        /**
         *      
         */
        private void hideSoftInput(IBinder token) {
            if (token != null) {
                InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                manager.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }