一、簡介
作用:獲取編輯框的最大長度,當輸入後文本長度等於最大長度則關閉軟鍵盤。
使用場景:手機號,固定位數的密碼,驗證碼
二、代碼部分
工具類 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);
}
}
}