【问题标题】:Android - Want to restrict some charaters to the edittextAndroid - 想要将某些字符限制为编辑文本
【发布时间】:2011-10-28 08:34:47
【问题描述】:

我被以下场景卡住了。

我有一个编辑文本和一个密码字段。我想限制一些字符,比如(a-z、A-Z、1-0 和一些特殊字符)。我将此edittext的inputType设置为“textPassword”并使用Numberkeylistner来限制字符。它在摩托罗拉 xoom 平板电脑上运行良好。

但我在华硕平板电脑中输入密码时收到建议。问题是当我评论以下一组行时,它工作正常,这意味着它没有向密码字段显示任何建议。

NumberKeyListener PwdkeyListener = new NumberKeyListener() {

    public int getInputType() {
    return InputType.TYPE_MASK_VARIATION;
    }

    @Override
    protected char[] getAcceptedChars() {
    return new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 
                    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
                    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '@', '.', '_', '#', '$', '%', '&', '*', '-', '+', '(', ')', '!', '"', '\'', ':', 
                    ';', '/', '?', ',', '~', '`', '|', '\\', '^', '<', '>', '{', '}', '[', ']', '=', '£', '¥', '€', '.', '¢', '•','©' };
    }
};

edtObj.setKeyListener(PwdkeyListener);

但我只在华硕平板电脑上遇到了这个问题。

谁能告诉我如何在不使用 keylistener 的情况下限制字符。

提前致谢。

【问题讨论】:

    标签: android android-edittext keylistener


    【解决方案1】:

    输入过滤器可用于限制输入到 editText 字段的字符类型。在此代码中,Character.isLetterOrDigit(...) 用于避免字母和数字。使用Character.getType(..),可以找到输入的每个字符的类型。在此处应用您的逻辑以满足您的要求。

    InputFilter filter = new InputFilter() {
    
            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                Spanned dest, int dstart, int dend) {
            for (int i = start; i < end; i++) {
                System.out.println("Type : "+Character.getType(source.charAt(i)));
    
                if (Character.isLetterOrDigit(source.charAt(i))) {
                return "";
                }           
            }
    
            return null;
            }
        };
    
        editText.setFilters(new InputFilter[] { filter });
    

    希望这会有所帮助。

    【讨论】:

    • 其实问题不一样,刚刚发现,现在贴出解决方案。
    【解决方案2】:

    终于找到了问题所在。

    解决方案 1:这将解决华硕的问题,但在 MotoXoom 中显示数字键盘 在 getInputType 而不是返回 InputType.TYPE_MASK_VARIATION 中,我必须返回 InputType.TYPE_CLASS_NUMBER。这样就解决了问题。

    解决方案 2:这将解决这两个问题。 正如 Lukap 所说,我已经修改了 CharSequence 方法,这工作正常,这里是代码。

    InputFilter[] filters = new InputFilter[1];
        filters[0] = new InputFilter(){
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                if (end > start) {
    
                    char[] acceptedChars = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 
                            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
                            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '@', '.', '_', '#', '$', '%', '&', '*', '-', '+', '(', ')', '!', '"', '\'', ':', 
                            ';', '/', '?', ',', '~', '`', '|', '\\', '^', '<', '>', '{', '}', '[', ']', '=', '£', '¥', '€', '.', '¢', '•','©'};
    
                    for (int index = start; index < end; index++) {                                         
                        if (!new String(acceptedChars).contains(String.valueOf(source.charAt(index)))) { 
                            return ""; 
                        }               
                    }
                }
                return null;
            }
    
        };
        edtTextPassword.setFilters(filters);
    

    【讨论】:

      【解决方案3】:

      我想你应该看到这个:http://developer.android.com/reference/android/text/InputFilter.html;和this 解决了类似的问题。

      有时当您遇到此类问题时,请执行以下操作:

      if(motorola){
      //stuff that works for motorola
      }else if(asus){
      //stuff that works for asus
      }
      

      注意:有时没有一种解决方案适用于任何地方。

      【讨论】:

      • 嗨 Lukap,感谢您的回复,是的,我已经看到以下与输入过滤器相关的链接 blog.mobile-j.de/2009/12/i-really-like-androids-edittext.htmlstackoverflow.com/questions/3349121/… 但我不确定如何使用这些示例限制我的 char 数组。
      • 你需要实现 public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 来满足你的目的,玩一下,你就会明白它有效
      • 是的,你是对的,我想避免使用 for 循环来检查 CharSequesnce 方法的内部。
      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多