我需要做一系列EditTexts的形式输入验证。 我使用OnFocusChangeListeners触发用户类型分为每一个后确认,但可根据需要为最后的EditText这并不表现。
如果我在“完成”按钮点击,同时输入到最终的EditText那么INPUTMETHOD断开,但在技术上重点是从来没有失去对的EditText(等验证永远不会发生)。
什么是最好的解决方案?
我应该监视时INPUTMETHOD从每个EditText上解除绑定,而非重点的变化是什么时候? 如果是这样,怎么样?
我需要做一系列EditTexts的形式输入验证。 我使用OnFocusChangeListeners触发用户类型分为每一个后确认,但可根据需要为最后的EditText这并不表现。
如果我在“完成”按钮点击,同时输入到最终的EditText那么INPUTMETHOD断开,但在技术上重点是从来没有失去对的EditText(等验证永远不会发生)。
什么是最好的解决方案?
我应该监视时INPUTMETHOD从每个EditText上解除绑定,而非重点的变化是什么时候? 如果是这样,怎么样?
你为什么不使用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
中相同的方法。 我希望我清楚,如果我是,它帮助! :)
编辑:对于一个更简洁的方法是指克里斯托弗·佩里的回答如下。
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 */
}
});
如果你想很好的验证弹出窗口和图像时出现错误,你可以使用setError
的方法EditText
类作为我描述这里
为了减少验证逻辑的详细程度我已经撰写了针对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
类。
这是很好的解决方案,从这里
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});
谷歌最近推出的设计支持库,有一个叫做一个组件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上库 ,结帐的例子,如果你想!
我发现输入过滤更适合在Android上验证文本输入。
这里有一个简单的例子: 我如何使用输入过滤器来限制在Android的一个EditText字符?
你可以添加一个举杯反馈用户对你的限制。 同时检查安卓的inputType标记出来。
我写了一个扩展的EditText一类本身支持一些验证方法,实际上是非常灵活的。
目前,我写的, 原生支持通过XML属性的验证方法是:
你可以检查出来这里
希望你喜欢它 :)
我需要做的场内验证,而不是场间的验证测试,我的值是无符号的浮点值在一种情况下,在另一个签订浮点值。 这里是什么似乎为我工作:
<EditText
android:id="@+id/x"
android:background="@android:drawable/editbox_background"
android:gravity="right"
android:inputType="numberSigned|numberDecimal"
/>
请注意,你不能有任何的内部空间“numberSigned | numberDecimal”。 例如:“numberSigned | numberDecimal”将无法正常工作。 我不知道为什么。
验证的EditText
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.
}
}
在main.xml中的文件
你可以把下面的attrubute验证只alphabatics字符可以接受的EditText。
做这个 :
android:entries="abcdefghijklmnopqrstuvwxyz"
您可以通过在用户点击“完成”按钮键盘上听得到期望的行为,还检出其他秘诀,在我的岗位与工作的EditText “Android的形式验证-以正确的方式”
示例代码:
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,你可以在里面和EditTextLayout验证材料的设计很容易的EditText这样的:
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