如何将EditText设置为仅输入十六进制数字?

whi*_*GER 15 android android-intent android-layout

我会在此代码中添加一个EditText控件,以便它只接受十六进制数字.我该怎么做呢?

bin = (EditText)findViewById(R.id.editText02);
hex = (EditText)findViewById(R.id.editText3);
dec = (EditText)findViewById(R.id.editText1);
oct = (EditText)findViewById(R.id.editText04);
Run Code Online (Sandbox Code Playgroud)

Muh*_*eeb 39

在Android布局XML文件中,将以下属性添加到EditText:

<EditText
android:digits="0123456789ABCDEF"
android:inputType="textCapCharacters"
/>
Run Code Online (Sandbox Code Playgroud)

第一个属性仅允许输入这些数字.任何其他输入被拒绝且不显示.第二个属性将字符大写.

积分转到此博客文章:http: //mobile.antonio081014.com/2012/04/how-to-let-input-of-edittext-only-be.html


Jor*_*sys 7

有两种选择,其中一种由 Muhammad Annaqeeb 使用以下属性进行描述:

\n\n
<EditText\n        android:id="@+id/myTextView"\n        android:digits="0123456789ABCDEF"\n        android:inputType="textCapCharacters"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

其他选项是使用InputFilter和 REGEX 仅允许十六进制字符:

\n\n
EditText myTextField = (EditText) findViewById(R.id.myTextView);\n\nInputFilter inputFilterText = new InputFilter() {\n\n    @Override\n    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {\n\n        Pattern patern = Pattern.compile("^\\\\p{XDigit}+$");\n\n        StringBuilder sb = new StringBuilder();\n\n        for (int i = start; i < end; i++) {\n\n            if (!Character.isLetterOrDigit(source.charAt(i)) && !Character.isSpaceChar(source.charAt(i))                            ) {\n                //is not(Letter or Digit or space);\n                return "";\n            }\n\n            //Only allow characters "0123456789ABCDEF";\n            Matcher matcher = patern.matcher(String.valueOf(source.charAt(i)));\n            if (!matcher.matches()) {\n                return "";\n            }\n\n            //Add character to Strinbuilder\n            sb.append(source.charAt(i));\n\n            /*counterForSpace++;\n            if(counterForSpace>1){\n                //Restar counter contador\n                counterForSpace = 0;\n                //Add space!\n                sb.append(" ");\n            }*/\n\n        }\n        //Return text in UpperCase.\n        return  sb.toString().toUpperCase();\n    }\n};\n\nmyTextField.setFilters(new InputFilter[] { inputFilterText });\nmyTextField.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);\n
Run Code Online (Sandbox Code Playgroud)\n\n

两个选项的结果是:

\n\n

在此输入图像描述

\n\n

也检查这个相关答案:

\n\n

https://es.stackoverflow.com/a/211240/95

\n\n

介绍 aqu\xc3\xad 图像的描述\xc3\xb3n

\n


gul*_*yuz 3

TextWatcher 也是不错的选择,但我更喜欢使用自定义过滤器。因此,更简单的方法是使用 InputFilter 并动态控制每个字符,请参见下面的示例,希望这会有所帮助

    import android.text.InputFilter;
    import android.text.InputType;

    EditText input_moodMsg; 
    // initialize this edittext etc etc
    //....
    // here comes the filter to control input on that component
    InputFilter inputFilter_moodMsg = new InputFilter() {
                @Override
                public CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) {

                    if (source.length()>44) return "";// max 44chars

// Here you can add more controls, e.g. allow only hex chars etc

                    for (int i = start; i < end; i++) { 
                         if (!Character.isLetterOrDigit(source.charAt(i)) && !Character.isSpaceChar(source.charAt(i))
                                 && source.charAt(i)!='-'
                                 && source.charAt(i)!='.'
                                 && source.charAt(i)!='!'
                                 ) { 
                             return "";     
                         }     
                    }
                    return null;   
                }
            };
            input_moodMsg.setFilters(new InputFilter[] { inputFilter_moodMsg });
            input_moodMsg.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
Run Code Online (Sandbox Code Playgroud)