文章要点:如何实现EditText对输入内容的筛选及错误提示功能 。
- 设置Listener方式:
edit_text.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
LogUtil.showLog("Css", s); //这里的s指:在用户输入之前,EditText中“所有的”文本信息
}
@Override public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override public void afterTextChanged(Editable s) {
LogUtil.showLog("Css2", s); //这里的s指,在用户输入之后,EditText中“所有的”文本信息
}
});
注意:上边这种方式无法实现对EditText内容的修改,只能监听提示。
- Fileter方式:
/*
* 禁止输空格+换行键
*/
editText.setFilters(new InputFilter[]{filter});
private InputFilter filter=new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
////这里的source指,在用户输入时,EditText中单次变化的字符
if(source.equals(" ") || source.toString().contentEquals("\n"))return "";
else return null; // 或者写成else return source;效果相同
}
};
/**
* 禁止EditText输入特殊字符
*/
public static void setEditTextInhibitInputSpeChat(EditText editText){
InputFilter filter=new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String speChat="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“'。,、?]";
Pattern pattern = Pattern.compile(speChat);
Matcher matcher = pattern.matcher(source.toString());
if(matcher.find())return "";
else return null;
}
};
editText.setFilters(new InputFilter[]{filter});
}
注意:Filter方式能对输入的内容做限定和修改;
- digits 属性限定输入内容:
方法一:直接在布局中添加属性
android:digits = "abcdef"
方法二:代码设置方式
EditText mEditText = (EditText)findViewById(R.id.MyEditText);
String digits = "abcdef"; //限定只能输入a-f中的字符,可重复
mEditText.setKeyListener(DigitsKeyListener.getInstance(digits));
注意:digits限定了只能输入那些字符
-
使用TextInputLayout:
它能让用户输入后,hint不会消失,会让hint变成一个在EditText上方的浮动标签。同时还包括一个漂亮的material动画,例子如下:-
布局中代码
<android.support.design.widget.TextInputLayout android:id="@+id/usernameWrapper" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textEmailAddress" android:hint="Username"/> </android.support.design.widget.TextInputLayout>
-
在代码中设置
final TextInputLayout usernameWrapper = (TextInputLayout)findViewById(R.id.usernameWrapper); final TextInputLayout passwordWrapper = (TextInputLayout)findViewById(R.id.passwordWrapper); //内容为空时设置hint提示 usernameWrapper.setHint("Username"); passwordWrapper.setHint("Password"); public void onClick(View v) { hideKeyboard(); if (!validateEmail(username)) { //被触发时,在上方显示的输入错误提示 usernameWrapper.setError("Not a valid email address!"); } else if (!validatePassword(password)) { passwordWrapper.setError("Not a valid password!"); } else { usernameWrapper.setErrorEnabled(false); passwordWrapper.setErrorEnabled(false); doLogin(); } }
-
其他:
对输入框限定中,我们常常要使用正则,这里就直接给出了:
纯数字:^\d+$
纯字母:^[a-zA-Z]+$
纯特殊字符:^[@#$%^&]+$ ps:特殊字符看你定义的标准是什么
字母+数字:^(?!\d+$)(?![a-zA-Z]+$)[a-zA-Z\d]+$
字母+特殊字符:^(?![a-zA-Z]+$)(?![@#$%^&]+$)[a-zA-Z@#$%^&]+$
数字+特殊字符:^(?!\d+)(?![@#$%^&]+$)[\d@#$%^&]+$
字母+数字+特殊字符:^(?!\d+$)(?![a-zA-Z]+$)(?![@#$%^&]+$)[\da-zA-Z@#$%^&]+$
强:字母+数字+特殊字符
^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&*]+$)(?![a-zA-z\d]+$)(?![a-zA-z!@#$%^&*]+$)(?![\d!@#$%^&*]+$)[a-zA-Z\d!@#$%^&*]+$
中:字母+数字,字母+特殊字符,数字+特殊字符
^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&*]+$)[a-zA-Z\d!@#$%^&*]+$
弱:纯数字,纯字母,纯特殊字符
^(?:\d+|[a-zA-Z]+|[!@#$%^&*]+)$