Android小技巧 自動關閉輸入法軟鍵盤

一、簡介

作用:獲取編輯框的最大長度,當輸入後文本長度等於最大長度則關閉軟鍵盤。
使用場景:手機號,固定位數的密碼,驗證碼

二、代碼部分

工具類 ViewUtil.java

public class ViewUtil {

    // 獲取編輯框的最大長度,通過反射機制調用隱藏方法
    public static int getMaxLength(EditText et) {
        int length = 0;
        try {
            InputFilter[] inputFilters = et.getFilters();
            for (InputFilter filter : inputFilters) {
                Class<?> c = filter.getClass();
                if (c.getName().equals("android.text.InputFilter$LengthFilter")) {
                    Field[] f = c.getDeclaredFields();
                    for (Field field : f) {
                        if (field.getName().equals("mMax")) {
                            field.setAccessible(true);
                            length = (Integer) field.get(filter);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return length;
    }

    public static void hideAllInputMethod(Activity act) {
        // 從系統服務中獲取輸入法管理器
        InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm.isActive()) { // 軟鍵盤如果已經打開則關閉之
            imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

    public static void hideOneInputMethod(Activity act, View v) {
        // 從系統服務中獲取輸入法管理器
        InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
        // 關閉屏幕上的輸入法軟鍵盤
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }

}

監聽器實例:

    // 文本變化監聽器
    private class HideTextWatcher implements TextWatcher {
        private EditText mView;
        private int mMaxLength;
        private CharSequence mStr;

        HideTextWatcher(EditText v) {
            super();
            mView = v;
            mMaxLength = ViewUtil.getMaxLength(v);
        }

        //輸入文本前觸發
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        // 輸入文本時觸發
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            mStr = s;
        }

        // 文本變化後觸發
        @Override
        public void afterTextChanged(Editable s) {
            if (mStr == null || mStr.length() == 0)
                return;
            // 手機號碼輸入達到11位,或者密碼/驗證碼輸入達到6位,都關閉輸入法軟鍵盤
            if ((mStr.length() == 11 && mMaxLength == 11) || (mStr.length() == 6 && mMaxLength == 6)){
                ViewUtil.hideOneInputMethod(MainActivity.this, mView);
            }
        }
    }

三、運行展示

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章