一、简介
作用:获取编辑框的最大长度,当输入后文本长度等于最大长度则关闭软键盘。
使用场景:手机号,固定位数的密码,验证码
二、代码部分
工具类 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);
}
}
}