Android輸入鍵盤隱藏解決方案

ostracod發表於2019-03-04

輸入法鍵盤是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/

3. github https://github.com/crazyandcoder

4. 掘金 https://juejin.im/user/56b96af96240b8005865df59/share

相關文章