【问题标题】:Check upper case,lower case, length and symbols on text change edittext检查文本更改编辑文本上的大写、小写、长度和符号
【发布时间】:2018-11-27 09:12:33
【问题描述】:

我有四个checkboxes,如果edit text 的文本更改中的条件满足,将对其进行检查。一个大写复选框,一个长度复选框,一个小写复选框,一个符号复选框。 一旦用户开始输入其中一项或全部或所有可能的一项,就需要检查。

我试过了:

 mBinding.cetPassword.getEditText().addTextChangedListener(new 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 (validateUpperCase(mBinding.cetPassword.getEditText().getText().toString().trim())) {
                        mBinding.chkUpperCase.setChecked(true);
                    }else {
                        mBinding.chkUpperCase.setChecked(false);
                    }

                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });

  public boolean validateUpperCase(String name) {
        Pattern ps = Pattern.compile("([A-Z]*)");
        Matcher ms = ps.matcher(name);
        return ms.matches();
    }

它不能完美地工作。在添加第二个大写复选框时未选中。

请推荐!谢谢!

【问题讨论】:

    标签: android regex android-layout android-edittext


    【解决方案1】:

    不要像下面那样使用 if-else,

     if (validateUpperCase(mBinding.cetPassword.getEditText().getText().toString().trim())) 
          {    
              mBinding.chkUpperCase.setChecked(true);
          }
    if (condition)   {
          mBinding.chkUpperCase.setChecked(false);
             }
    

    【讨论】:

    • 没有条件怎么可能?
    • 这意味着只需将条件放入 if 语句中。删除其他。
    【解决方案2】:

    您可以使用以下方法检查密码:

    private static boolean hasLength(CharSequence data) {
    return String.valueOf(data).length() >= 8;
    }
    
    private static boolean hasSymbol(CharSequence data) {
    String password = String.valueOf(data);
    return !password.matches("[A-Za-z0-9 ]*");
    }
    
    private static boolean hasUpperCase(CharSequence data) {
    String password = String.valueOf(data);
    return !password.equals(password.toLowerCase());
    }
    
    private static boolean hasLowerCase(CharSequence data) {
    String password = String.valueOf(data);
    return !password.equals(password.toUpperCase());
    }
    

    那么 addTextChangedListener 会是这样的:

    pass_word.addTextChangedListener(new 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(pass_word.getText().toString().length() > 0){
    
                    if(hasLength(pass_word.getText().toString())){
                        check_length.setChecked(true);
                    }else{
                        check_length.setChecked(false);
                    }
    
                    if(hasSymbol(pass_word.getText().toString())){
                        check_symbol.setChecked(true);
                    }else{
                        check_symbol.setChecked(false);
                    }
    
                    if(hasUpperCase(pass_word.getText().toString())){
                        check_upper.setChecked(true);
                    }else{
                        check_upper.setChecked(false);
                    }
    
                    if(hasLowerCase(pass_word.getText().toString())){
                        check_lower.setChecked(true);
                    }else{
                        check_lower.setChecked(false);
                    }
                }else{
                    check_lower.setChecked(false);
                    check_upper.setChecked(false);
                    check_length.setChecked(false);
                    check_symbol.setChecked(false);
                }
            }
            @Override
            public void afterTextChanged(Editable s) {
    
            }
        });
    

    【讨论】:

    • 嘿,谢谢!你的代码非常适合我。我有一个关于 hasSymbol 方法的查询,我只想检查其中的一些特殊字符。一些特定的字符。你能建议吗?
    • 如果只想检查hasSymbol中的一些特殊字符,可以尝试使用:private static boolean hasLength(CharSequence data) { boolean check_some = data.contains("&") || data.contains("*"); //添加你想要的。返回检查_一些; }
    • 是的,它成功了!谢谢你。还有一个问题我想问这个话题。我想要带有自定义可绘制和字体颜色的复选框。我已经实现了自定义可绘制,但是当它未选中时,颜色应该不同,而选择的颜色应该不同。有任何教程或链接吗?
    • 如果你使用 Pattern 类,它需要我使用两个反斜杠“\\”才能接受连字符。不过现在是 2021 年,所以这可能已经改变了。在线 Java 正则表达式测试人员也只使用一个反斜杠。
    【解决方案3】:

    您需要使用正则表达式。 代码在这里:

    editText.addTextChangedListener(new 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) {
        String lowerCase = "(.*[a-z].*)";
        String upperCase = "(.*[A-Z].*)";
        String digit = "(.*\\d.*)";
        String symbol = "(.*[:?!@#$%^&*()].*)";
    
        if(Pattern.matches(lowerCase,s.toString())){
          chkLowercase.setChecked(true);
        }else{
          chkLowercase.setChecked(false);
        }
        if(Pattern.matches(upperCase,s.toString())){
          chkUppercase.setChecked(true);
        }else{
          chkUppercase.setChecked(false);
        }
        if(Pattern.matches(digit,s.toString())){
          chkDigit.setChecked(true);
        }else{
          chkDigit.setChecked(false);
        }
        if(Pattern.matches(symbol,s.toString())){
          chkSymbol.setChecked(true);
        }else{
          chkSymbol.setChecked(false);
        }
      }
    
      @Override public void afterTextChanged(Editable s) {
    
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多