安卓:我如何可以验证输入的EditText?安卓:我如何可以验证输入的EditText?(Andro

2019-05-10 10:16发布

我需要做一系列EditTexts的形式输入验证。 我使用OnFocusChangeListeners触发用户类型分为每一个后确认,但可根据需要为最后的EditText这并不表现。

如果我在“完成”按钮点击,同时输入到最终的EditText那么INPUTMETHOD断开,但在技术上重点是从来没有失去对的EditText(等验证永远不会发生)。

什么是最好的解决方案?

我应该监视时INPUTMETHOD从每个EditText上解除绑定,而非重点的变化是什么时候? 如果是这样,怎么样?

Answer 1:

你为什么不使用TextWatcher

既然你有一些EditText进行验证框,我觉得有以下应适合你:

  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并不能真正帮助找到的EditText框的文本被改变了。 但是,你可以直接检查的EditText上,而像内容

String txt1String = txt1.getText().toString();
// Validate txt1String

中相同的方法。 我希望我清楚,如果我是,它帮助! :)

编辑:对于一个更简洁的方法是指克里斯托弗·佩里的回答如下。



Answer 2:

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


Answer 3:

如果你想很好的验证弹出窗口和图像时出现错误,你可以使用setError的方法EditText类作为我描述这里



Answer 4:

为了减少验证逻辑的详细程度我已经撰写了针对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类。



Answer 5:

这是很好的解决方案,从这里

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


Answer 6:

更新的方法 - TextInputLayout:

谷歌最近推出的设计支持库,有一个叫做一个组件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上库 ,结帐的例子,如果你想!



Answer 7:

我发现输入过滤更适合在Android上验证文本输入。

这里有一个简单的例子: 我如何使用输入过滤器来限制在Android的一个EditText字符?

你可以添加一个举杯反馈用户对你的限制。 同时检查安卓的inputType标记出来。



Answer 8:

我写了一个扩展的EditText一类本身支持一些验证方法,实际上是非常灵活的。

目前,我写的, 原生支持通过XML属性的验证方法是:

  1. α
  2. 字母数字
  3. 数字
  4. 通用正则表达式
  5. 串emptyness

你可以检查出来这里

希望你喜欢它 :)



Answer 9:

我需要做的场内验证,而不是场间的验证测试,我的值是无符号的浮点值在一种情况下,在另一个签订浮点值。 这里是什么似乎为我工作:

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

请注意,你不能有任何的内部空间“numberSigned | numberDecimal”。 例如:“numberSigned | numberDecimal”将无法正常工作。 我不知道为什么。



Answer 10:

这看起来非常有前途的,只是什么下令我的文档:

验证的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.
    }
}

自定义验证加上这些建于:

  • 正则表达式 :自定义正则表达式
  • 数字 :一个只有数字领域
  • 阿尔法 :用于阿尔法仅字段
  • 字母数字 :你猜怎么着?
  • PERSONNAME:如果检查输入的文本是一个人的姓氏或名字。
  • personFullName:检查输入的值是一个完整的全名。
  • 电子邮件 :检查该字段是一个有效的电子邮件
  • CREDITCARD:检查该字段包含使用有效的信用卡卢恩算法
  • 电话 :检查该字段包含一个有效的电话号码
  • 则domainName:检查该字段包含一个有效的域名(总是通过在API级别测试<8)
  • ip地址 :检查该字段包含一个有效的IP地址
  • WEBURL:检查该字段包含一个有效的URL(总是通过在API级别测试<8)
  • 日期 :检查该字段是一个有效的日期/日期时间格式(如果customFormat被设置,与customFormat检查)
  • NOCHECK:它不检查任何东西,除了现场的emptyness。


Answer 11:

在main.xml中的文件

你可以把下面的attrubute验证只alphabatics字符可以接受的EditText。

做这个 :

  android:entries="abcdefghijklmnopqrstuvwxyz"


Answer 12:

您可以通过在用户点击“完成”按钮键盘上听得到期望的行为,还检出其他秘诀,在我的岗位与工作的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;
    }});  


Answer 13:

电子邮件和密码验证尝试

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


Answer 14:

我创建了这个库为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



文章来源: Android: How can I validate EditText input?