我需要对一系列EditText进行表单输入验证。我使用OnFocusChangeListeners在用户键入每个用户名后触发验证,但是对于最后一个EditText,它的行为并不理想。
如果在键入最终的EditText时单击“完成”按钮,则InputMethod将断开连接,但从技术上讲,永远不会将注意力集中在EditText上(因此永远不会进行验证)。
最好的解决方案是什么?
我应该监视InputMethod何时与每个EditText解除绑定,而不是监视焦点何时改变吗?如果是这样,怎么办?
我需要对一系列EditText进行表单输入验证。我使用OnFocusChangeListeners在用户键入每个用户名后触发验证,但是对于最后一个EditText,它的行为并不理想。
如果在键入最终的EditText时单击“完成”按钮,则InputMethod将断开连接,但从技术上讲,永远不会将注意力集中在EditText上(因此永远不会进行验证)。
最好的解决方案是什么?
我应该监视InputMethod何时与每个EditText解除绑定,而不是监视焦点何时改变吗?如果是这样,怎么办?
Answers:
你为什么不使用TextWatcher
?
由于您有许多EditText
需要验证的方框,因此我认为以下内容适合您:
android.text.TextWatcher
界面txt1.addTextChangedListener(this);
txt2.addTextChangedListener(this);
txt3.addTextChangedListener(this);
afterTextChanged(Editable s)
按以下方式使用方法@Override
public void afterTextChanged(Editable s) {
// validation code goes here
}
这Editable s
实际上并没有帮助查找要更改哪个EditText框的文本。但是您可以直接检查EditText框的内容,例如
String txt1String = txt1.getText().toString();
// Validate txt1String
用同样的方法。我希望我很清楚,如果我愿意,这会有所帮助!:)
编辑:有关更清洁的方法,请参阅下面的克里斯托弗·佩里(Christopher Perry)的答案。
TextWatcher对于我的口味有点冗长,因此我可以更轻松地吞下一些东西:
public abstract class TextValidator implements TextWatcher {
private final TextView textView;
public TextValidator(TextView textView) {
this.textView = textView;
}
public abstract void validate(TextView textView, String text);
@Override
final public void afterTextChanged(Editable s) {
String text = textView.getText().toString();
validate(textView, text);
}
@Override
final public void beforeTextChanged(CharSequence s, int start, int count, int after) { /* Don't care */ }
@Override
final public void onTextChanged(CharSequence s, int start, int before, int count) { /* Don't care */ }
}
像这样使用它:
editText.addTextChangedListener(new TextValidator(editText) {
@Override public void validate(TextView textView, String text) {
/* Validation code here */
}
});
EditText
IS-ATextView
addTextChangedListener
从视图中解析了Edittext后正在打电话
passwordConfirmTextField
,但是我需要引用另一个passwordTextField
,以便可以进行比较。有什么建议?
为了减少验证逻辑的冗长性,我为Android创建了一个库。它负责使用注释和内置规则进行大部分日常验证。存在诸如约束@TextRule
,@NumberRule
,@Required
,@Regex
,@Email
,@IpAddress
,@Password
,等,
您可以将这些批注添加到UI小部件引用中并执行验证。它还允许您异步执行验证,这对于诸如从远程服务器检查唯一的用户名之类的情况非常理想。
项目主页上有一个有关如何使用注释的示例。您还可以阅读相关的博客文章,其中我编写了有关如何编写自定义规则进行验证的示例代码。
这是一个描述该库用法的简单示例。
@Required(order = 1)
@Email(order = 2)
private EditText emailEditText;
@Password(order = 3)
@TextRule(order = 4, minLength = 6, message = "Enter at least 6 characters.")
private EditText passwordEditText;
@ConfirmPassword(order = 5)
private EditText confirmPasswordEditText;
@Checked(order = 6, message = "You must agree to the terms.")
private CheckBox iAgreeCheckBox;
该库是可扩展的,您可以通过扩展Rule
该类来编写自己的规则。
@Length
注释替换。
这是很好的解决方案,从这里
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("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*");
Matcher matcher = pattern.matcher(checkMe);
boolean valid = matcher.matches();
if(!valid){
Log.d("", "invalid");
return "";
}
}
return null;
}
};
edit.setFilters(new InputFilter[]{filter});
Google最近启动了设计支持库,其中有一个名为TextInputLayout的组件,它支持通过setErrorEnabled(boolean)
和显示错误setError(CharSequence)
。
如何使用它?
步骤1:用TextInputLayout包裹EditText:
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/layoutUserName">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="hint"
android:id="@+id/editText1" />
</android.support.design.widget.TextInputLayout>
步骤2:验证输入
// validating input on a button click
public void btnValidateInputClick(View view) {
final TextInputLayout layoutUserName = (TextInputLayout) findViewById(R.id.layoutUserName);
String strUsername = layoutLastName.getEditText().getText().toString();
if(!TextUtils.isEmpty(strLastName)) {
Snackbar.make(view, strUsername, Snackbar.LENGTH_SHORT).show();
layoutUserName.setErrorEnabled(false);
} else {
layoutUserName.setError("Input required");
layoutUserName.setErrorEnabled(true);
}
}
我已经在我的Github存储库上创建了一个示例,如果您愿意,请签出该示例!
com.google.android.material.textfield.TextInputLayout
(注意材料更改)。从以下答案中得到答案:stackoverflow.com/a/56753953/900394
我写了一个扩展EditText的类,该类本身支持某些验证方法,并且实际上非常灵活。
如我所写,当前 通过xml属性验证方法本地支持:
你可以在这里查看
希望你喜欢它 :)
我发现InputFilter更适合验证android上的文本输入。
这是一个简单的示例: 如何使用InputFilter限制Android中EditText中的字符?
您可以添加Toast以向用户反馈有关您的限制的信息。还要检查android:inputType标签。
我需要执行字段内验证而不是字段间验证,以测试我的值在一种情况下是无符号浮点值,在另一种情况下是有符号浮点值。这似乎对我有用:
<EditText
android:id="@+id/x"
android:background="@android:drawable/editbox_background"
android:gravity="right"
android:inputType="numberSigned|numberDecimal"
/>
注意,“ numberSigned | numberDecimal”内不能有任何空格。例如:“ numberSigned | numberDecimal”将不起作用。我不知道为什么。
public void onClickNext(View v) {
FormEditText[] allFields = { etFirstname, etLastname, etAddress, etZipcode, etCity };
boolean allValid = true;
for (FormEditText field: allFields) {
allValid = field.testValidity() && allValid;
}
if (allValid) {
// YAY
} else {
// EditText are going to appear with an exclamation mark and an explicative message.
}
}
您可以通过在用户按下键盘上的“完成”按钮时进行聆听来获得所需的行为,还可以在我的文章“ Android表单验证-正确的方式”中查看有关使用EditText的其他提示。
样例代码:
mTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
validateAndSubmit();
return true;
}
return false;
}});
用于电子邮件和密码验证,请尝试
if (isValidEmail(et_regemail.getText().toString())&&etpass1.getText().toString().length()>7){
if (validatePassword(etpass1.getText().toString())) {
Toast.makeText(getApplicationContext(),"Go Ahead".....
}
else{
Toast.makeText(getApplicationContext(),"InvalidPassword".....
}
}else{
Toast.makeText(getApplicationContext(),"Invalid Email".....
}
public boolean validatePassword(final String password){
Pattern pattern;
Matcher matcher;
final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[A-Z])(?=.*
[@#$%^&+=!])(?=\\S+$).{4,}$";
pattern = Pattern.compile(PASSWORD_PATTERN);
matcher = pattern.matcher(password);
return matcher.matches();
}
public final static boolean isValidEmail(CharSequence target) {
if (target == null)
return false;
return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
我已经为Android创建了这个库,您可以在其中轻松地验证材质设计EditText和EditTextLayout,如下所示:
compile 'com.github.TeleClinic:SmartEditText:0.1.0'
那么您可以像这样使用它:
<com.teleclinic.kabdo.smartmaterialedittext.CustomViews.SmartEditText
android:id="@+id/passwordSmartEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:setLabel="Password"
app:setMandatoryErrorMsg="Mandatory field"
app:setPasswordField="true"
app:setRegexErrorMsg="Weak password"
app:setRegexType="MEDIUM_PASSWORD_VALIDATION" />
<com.teleclinic.kabdo.smartmaterialedittext.CustomViews.SmartEditText
android:id="@+id/ageSmartEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:setLabel="Age"
app:setMandatoryErrorMsg="Mandatory field"
app:setRegexErrorMsg="Is that really your age :D?"
app:setRegexString=".*\\d.*" />
然后您可以像这样检查它是否有效:
ageSmartEditText.check()
有关更多示例和自定义,请检查存储库 https://github.com/TeleClinic/SmartEditText