Android:隐藏输入法软键盘
1.概述
1) 给LinearLayout 注册click 事件,点击后隐藏输入法软键盘。为什么要叫软键盘,很奇怪呢。通过Activity 的getSystem(Context.INPUT_METHOD_SERVICE) 获取到输入法的对象,接着把它隐藏掉。
2) EditText 输入的字符达到最大值时隐藏输入法软键盘。注册EditText 的TextWatcher 事件,通过判断输入的字符数达到最大长度时隐藏掉输入法软键盘。
2.Activity 后台代码
public class EditHideActivity extends AppCompatActivity implements View.OnClickListener {
private LinearLayout ll_hide;
private EditText et_phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_hide);
ll_hide = (LinearLayout) findViewById(R.id.ll_hide);
et_phone = (EditText) findViewById(R.id.et_phone);
//给LinearLayout 注册click 监听,点击后隐藏输入法
ll_hide.setOnClickListener(this);
//给EditText 注册TextChanged 监听,文本的变化会触发监听事件
et_phone.addTextChangedListener(new HideTextWatcher(et_phone));
}
//实现OnClickListener 的onClick 事件
@Override
public void onClick(View view) {
if (view.getId() == R.id.ll_hide) {
hideOneInputMethod(EditHideActivity.this, et_phone);
}
}
private void hideOneInputMethod(Activity act, View v) {
//实际上不只是et_other的软键盘会关闭,其它编辑框的软键盘也会关闭
//因为方法内部去获取视图的WindowToken,这个Token在每个页面上都是唯一的
InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
private void hideAllInputMethod(Activity act) {
InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive() == true) {
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
//获取EditText 最大长度
private int getMaxLength(EditText et) {
int length = 0;
try {
InputFilter[] inputFilters = et.getFilters();
//遍历所有过滤器
for (InputFilter filter : inputFilters) {
Class<?> c = filter.getClass();
//是否有InputFilter$LengthFilter 过滤器
if (c.getName().equals("android.text.InputFilter$LengthFilter")) {
//Field 的命名空间为: java.lang.reflect.Field
Field[] f = c.getDeclaredFields();
//遍历过滤器的所有字段
for (Field field : f) {
if (field.getName().equals("mMax")) {
field.setAccessible(true);
length = (Integer) field.get(filter);
}
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return length;
}
private class HideTextWatcher implements TextWatcher {
private CharSequence mStr;
private EditText mView;
private int mMaxLength;
//通过构造函数注入要监听的EditText,持有EditText 便于事件里的操作
public HideTextWatcher(EditText v) {
super();
mView = v;
//获取EditText 的最大长度
mMaxLength = getMaxLength(v);
}
//CharSequence charSequence:文本改变之前的内容
//int i:文本开始改变时的起点位置,从0开始计算
//int i1:要被改变的文本字数,即将要被替代的选中文本字数
//int i2:改变后添加的文本字数,即替代选中文本后的文本字数
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
//CharSequence charSequence:文本改变之后的内容
//int i:文本开始改变时的起点位置,从0开始计算
//int i1:要被改变的文本字数,即已经被替代的选中文本字数
//int i2:改变后添加的文本字数,即替代选中文本后的文本字数
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
mStr = charSequence;
}
//Editable editable: 改变后的最终文本
@Override
public void afterTextChanged(Editable editable) {
if (mStr == null || mStr.length() == 0) {
return;
} else if (mStr.length() == mMaxLength) {
//输入的字符达到最大时,隐藏输入法
hideAllInputMethod(EditHideActivity.this);
}
}
}
}
3.layout 布局文件代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.middledemo.EditHideActivity">
<LinearLayout
android:id="@+id/ll_hide"
android:layout_width="368dp"
android:layout_height="495dp"
android:orientation="vertical"
tools:layout_editor_absoluteY="8dp"
tools:layout_editor_absoluteX="8dp">
<View
android:layout_width="match_parent"
android:layout_height="20dp" />
<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:maxLength="11"
android:inputType="number"
style="@style/text_normal"/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
浙公网安备 33010602011771号