Android:我如何validationEditTextinput?

我需要对一系列EditText进行表单inputvalidation。 我使用OnFocusChangeListeners来触发validation后,用户键入到每一个,但这不符合最后一个EditText所需的行为。

如果在input最终EditText的同时单击“完成”button,则InputMethod将断开连接,但从技术angular度而言,EditText始终不会丢失焦点(因此从不会出现validation)。

什么是最好的解决scheme?

我应该监视什么时候InputMethod从每个EditText取消绑定,而不是焦点更改? 如果是这样,怎么样?

为什么不使用TextWatcher

由于您有多个EditText框需要validation,我认为以下内容适合您:

  1. 你的活动实现了android.text.TextWatcher接口
  2. 您将TextChanged监听器添加到EditText框
 txt1.addTextChangedListener(this); txt2.addTextChangedListener(this); txt3.addTextChangedListener(this); 
  1. 在重写的方法中,可以使用afterTextChanged(Editable s)方法如下
 @Override public void afterTextChanged(Editable s) { // validation code goes here } 

Editable s并没有真正帮助您find哪个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 */ } }); 

如果你想在错误发生的时候使用漂亮的validationpopup窗口和图片,你可以使用EditText类的setError方法,正如我在这里所描述的

使用从链接的帖子的作者Donn Felker处获取的setError的屏幕截图

为了减lessvalidation逻辑的冗长,我为Android创作了一个库 。 它使用注释和内置规则来处理大部分的日常validation。 有诸如@TextRule@NumberRule@Required@Regex @NumberRule@Required @Regex@Email @IpAddress@Password@Password

您可以将这些注释添加到您的UI小部件引用并执行validation。 它还允许您asynchronous执行validation,非常适合于从远程服务器检查唯一用户名等情况。

在项目主页上有一个关于如何使用注释的例子。 您还可以阅读关于如何编写用于validation的自定义规则的关联博客文章 。

这是一个简单的例子,描述了库的使用。

 @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类来编写自己的规则。

这是从这里很好的解决scheme

 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}); 

我发现InputFilter更适合在android上validation文本input。

下面是一个简单的例子: 如何使用InputFilter来限制Android中的EditText中的字符?

你可以添加一个Toast来反馈用户的限制。 另外检查android:inputType标签。

我写了一个扩展EditText的类,它支持本地一些validation方法,实际上非常灵活。

目前,正如我写的, 本地支持通过xml属性validation方法是:

  1. α
  2. 字母数字
  3. 数字
  4. 通用的正则expression式
  5. string空白

你可以在这里查看

希望你喜欢它 :)

我需要做场内validation,而不是场间validation,以testing我的值在一种情况下是无符号浮点值,在另一种情况下是对浮点值进行签名。 这是什么似乎为我工作:

  <EditText android:id="@+id/x" android:background="@android:drawable/editbox_background" android:gravity="right" android:inputType="numberSigned|numberDecimal" /> 

请注意,在“numberSigned | numberDecimal”内不能有任何空格。 例如:“numberSigned | numberDecimal”将不起作用。 我不知道为什么。

这看起来非常有前途,正是文档为我订购的内容:

EditTextvalidation器

  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. } } 

自定义validation器加上这些内置:

  • 正则expression式 :用于自定义正则expression式
  • 数字 :仅用于数字字段
  • alpha :仅用于alpha字段
  • alphaNumeric :猜猜看是什么?
  • personName :检查input的文本是否是人名或姓氏。
  • personFullName :检查input的值是否是完整的全名。
  • 电子邮件 :检查该字段是否是有效的电子邮件
  • creditcard :使用Luhnalgorithm检查该字段是否包含有效的信用卡
  • 电话 :检查该字段是否包含有效的电话号码
  • domainName :检查该字段是否包含有效的域名(始终通过API Level <8的testing)
  • ipAddress :检查该字段是否包含有效的IP地址
  • webUrl :检查该字段是否包含有效的URL(始终通过API Level <8的testing)
  • date :检查该字段是有效的date/date时间格式(如果设置了customFormat,则使用customFormat进行检查)
  • nocheck :除了场地的空虚之外,它不检查任何东西。

更新的方法 – TextInputLayout:

Google最近推出了devise支持库,并且有一个名为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步:validationinput

 // 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仓库上创build了一个例子,如果你愿意的话,可以查看例子!

在main.xml文件中

你可以把下面的属性仅用于validation字符可以在edittext中接受的字母。

做这个 :

  android:entries="abcdefghijklmnopqrstuvwxyz" 

当用户点击键盘上的“完成”button时,您可以通过侦听获得所需的行为,同时在我的文章“Android表单validation – 正确的方式”中查看有关使用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; }});