Android 在用户输入时验证输入
Android validate input while user inputs
我有一个 EditText
用户必须输入一个 phone 数字。 phone 号码的模式是:^5[4][0-9]{10}$
第一个号码是 5
,第二个号码是 4
,后跟 10 个数字。
我试过使用以下 InputFilter
InputFilter filter= new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
String checkMe = String.valueOf(source.charAt(i));
Pattern pattern = Pattern.compile("^5[4][0-9]{10}$");
Matcher matcher = pattern.matcher(checkMe);
boolean valid = matcher.matches();
if(!valid){
return "";
}
}
return null;
}
};
但这只匹配完整数字,我想在用户输入数字时进行验证。
想象一下这种情况:
User enters 6 -> Does not match the initial digit of the pattern so EditText stays empty
User enters 5 -> Matches the first digit of the pattern so EditText text = 5
User enters 3 -> Does not match the second digit of the pattern so EditText text = 5
User enters 4 -> Matches the second digit of the pattern so EditText text = 54
From now, if the user adds a digit, EditText will append that until the length of 10
知道如何实现吗?
使用TextWatcher界面
XML 限制输入类型(数量)和最大字符数(12)
<EditText
....
android:inputType="number"
android:maxLength="12" >
Java
editText.addTextChangedListener(new PhoneNumberTextWatcher());
TextWatcher 界面
class PhoneNumberTextWatcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (s != null && s.length() > 0) {
String number = s.toString();
if (number.startsWith("5")) {
if (number.length() > 1)
if (!number.startsWith("54")) {
editText.setText("5");//if second number is not 4
editText.setSelection(editText.length()); // move the cursor to 1 position
}
} else
editText.setText("");
}
}
@Override
public void afterTextChanged(Editable s) {
}
}
我有一个 EditText
用户必须输入一个 phone 数字。 phone 号码的模式是:^5[4][0-9]{10}$
第一个号码是 5
,第二个号码是 4
,后跟 10 个数字。
我试过使用以下 InputFilter
InputFilter filter= new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
String checkMe = String.valueOf(source.charAt(i));
Pattern pattern = Pattern.compile("^5[4][0-9]{10}$");
Matcher matcher = pattern.matcher(checkMe);
boolean valid = matcher.matches();
if(!valid){
return "";
}
}
return null;
}
};
但这只匹配完整数字,我想在用户输入数字时进行验证。
想象一下这种情况:
User enters 6 -> Does not match the initial digit of the pattern so EditText stays empty
User enters 5 -> Matches the first digit of the pattern so EditText text = 5
User enters 3 -> Does not match the second digit of the pattern so EditText text = 5
User enters 4 -> Matches the second digit of the pattern so EditText text = 54
From now, if the user adds a digit, EditText will append that until the length of 10
知道如何实现吗?
使用TextWatcher界面
XML 限制输入类型(数量)和最大字符数(12)
<EditText
....
android:inputType="number"
android:maxLength="12" >
Java
editText.addTextChangedListener(new PhoneNumberTextWatcher());
TextWatcher 界面
class PhoneNumberTextWatcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (s != null && s.length() > 0) {
String number = s.toString();
if (number.startsWith("5")) {
if (number.length() > 1)
if (!number.startsWith("54")) {
editText.setText("5");//if second number is not 4
editText.setSelection(editText.length()); // move the cursor to 1 position
}
} else
editText.setText("");
}
}
@Override
public void afterTextChanged(Editable s) {
}
}