Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 编辑只允许给定位数的文本,并将它们分成四对_Android_Android Edittext - Fatal编程技术网

Android 编辑只允许给定位数的文本,并将它们分成四对

Android 编辑只允许给定位数的文本,并将它们分成四对,android,android-edittext,Android,Android Edittext,我想要一个编辑文本,只允许用户输入给定数量的文本,对于我的情况,我想要16位数字,然后将它们分组成4对。我已经设置了文本限制。目前我的代码是这样的 <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:counterEnabled="true" app:counter

我想要一个编辑文本,只允许用户输入给定数量的文本,对于我的情况,我想要16位数字,然后将它们分组成4对。我已经设置了文本限制。目前我的代码是这样的

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    app:counterMaxLength="16">

    <EditText
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter Code"
        android:inputType="number" />
</android.support.design.widget.TextInputLayout>

但现在我的问题是如何将它们分组。我希望我的最终输出像这样XXXX-XXXX-XXXX-XXXX-。产品密钥的外观类型。

您有两种选择:

  • TextWatcher
    添加到
    EditText
    中。然后在每个字符添加后,评估内容并根据需要添加破折号这是更快的解决方案。

  • 查看一下
    EditText
    (根据API级别的不同,它也可能位于
    EditText
    Textview
    的超类中)。研究它的
    onDraw()
    metchod,然后实现自己的类扩展
    EditText
    ,它将根据需要绘制文本这将花费更多时间,但是
    getText()
    方法将返回原始输入,不带破折号。

  • 您有两个选择:

  • TextWatcher
    添加到
    EditText
    中。然后在每个字符添加后,评估内容并根据需要添加破折号这是更快的解决方案。

  • 查看一下
    EditText
    (根据API级别的不同,它也可能位于
    EditText
    Textview
    的超类中)。研究它的
    onDraw()
    metchod,然后实现自己的类扩展
    EditText
    ,它将根据需要绘制文本这将花费更多时间,但是
    getText()
    方法将返回原始输入,不带破折号。


  • 您可以使用下面的代码进行尝试,效果很好:

    public class MainActivity extends AppCompatActivity {
    
        private static final String TAG = "my_log";
        static final Pattern CODE_PATTERN = Pattern.compile("([0-9]{0,4})|([0-9]{4}-)+|([0-9]{4}-[0-9]{0,4})+");
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            final EditText editText = (EditText) findViewById(R.id.editText);
            editText.addTextChangedListener(new TextWatcher() {
    
                @Override
                public void afterTextChanged(Editable s) {
                    Log.d(TAG, "input" + s.toString());
    
                    if (s.length() > 0 && !CODE_PATTERN.matcher(s).matches()) {
                        String input = s.toString();
                        String numbersOnly = keepNumbersOnly(input);
                        String code = formatNumbersAsCode(numbersOnly);
    
                        Log.d(TAG, "numbersOnly" + numbersOnly);
                        Log.d(TAG, "code" + code);
    
                        editText.removeTextChangedListener(this);
                        editText.setText(code);
                        editText.setSelection(code.length());
                        editText.addTextChangedListener(this);
                    }
                }
    
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
    
                private String keepNumbersOnly(CharSequence s) {
                    return s.toString().replaceAll("[^0-9]", "");
                }
    
                private String formatNumbersAsCode(CharSequence s) {
                    int groupDigits = 0;
                    String tmp = "";
                    for (int i = 0; i < s.length(); ++i) {
                        tmp += s.charAt(i);
                        ++groupDigits;
                        if (groupDigits == 4) {
                            tmp += "-";
                            groupDigits = 0;
                        }
                    }
                    return tmp;
                }
            });
        }
    
    }
    
    public类MainActivity扩展了AppCompatActivity{
    私有静态最终字符串标记=“我的日志”;
    静态最终模式代码_Pattern=Pattern.compile(([0-9]{0,4})|([0-9]{4}-+)+|([0-9]{4}-[0-9]{0,4}+);
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final EditText EditText=(EditText)findViewById(R.id.EditText);
    editText.addTextChangedListener(新的TextWatcher(){
    @凌驾
    公共无效后文本已更改(可编辑){
    Log.d(标记“input”+s.toString());
    if(s.length()>0&!CODE_PATTERN.matcher.matches()){
    字符串输入=s.toString();
    字符串numbersOnly=仅保留数字(输入);
    字符串代码=FormatNumberScode(仅限数字);
    Log.d(标签“numbersOnly”+numbersOnly);
    日志d(标签,“代码”+代码);
    removeTextChangedListener(此);
    editText.setText(代码);
    editText.setSelection(code.length());
    editText.addTextChangedListener(此);
    }
    }
    @凌驾
    更改前文本之前的公共void(字符序列s、int start、int count、int after){
    }
    @凌驾
    public void onTextChanged(字符序列、int start、int before、int count){
    }
    私有字符串keepnsonly(字符序列){
    返回s.toString().replaceAll([^0-9],”);
    }
    专用字符串格式NumberScode(字符序列){
    int-groupDigits=0;
    字符串tmp=“”;
    对于(int i=0;i
    您可以尝试使用下面的代码,它运行良好:

    public class MainActivity extends AppCompatActivity {
    
        private static final String TAG = "my_log";
        static final Pattern CODE_PATTERN = Pattern.compile("([0-9]{0,4})|([0-9]{4}-)+|([0-9]{4}-[0-9]{0,4})+");
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            final EditText editText = (EditText) findViewById(R.id.editText);
            editText.addTextChangedListener(new TextWatcher() {
    
                @Override
                public void afterTextChanged(Editable s) {
                    Log.d(TAG, "input" + s.toString());
    
                    if (s.length() > 0 && !CODE_PATTERN.matcher(s).matches()) {
                        String input = s.toString();
                        String numbersOnly = keepNumbersOnly(input);
                        String code = formatNumbersAsCode(numbersOnly);
    
                        Log.d(TAG, "numbersOnly" + numbersOnly);
                        Log.d(TAG, "code" + code);
    
                        editText.removeTextChangedListener(this);
                        editText.setText(code);
                        editText.setSelection(code.length());
                        editText.addTextChangedListener(this);
                    }
                }
    
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
    
                private String keepNumbersOnly(CharSequence s) {
                    return s.toString().replaceAll("[^0-9]", "");
                }
    
                private String formatNumbersAsCode(CharSequence s) {
                    int groupDigits = 0;
                    String tmp = "";
                    for (int i = 0; i < s.length(); ++i) {
                        tmp += s.charAt(i);
                        ++groupDigits;
                        if (groupDigits == 4) {
                            tmp += "-";
                            groupDigits = 0;
                        }
                    }
                    return tmp;
                }
            });
        }
    
    }
    
    public类MainActivity扩展了AppCompatActivity{
    私有静态最终字符串标记=“我的日志”;
    静态最终模式代码_Pattern=Pattern.compile(([0-9]{0,4})|([0-9]{4}-+)+|([0-9]{4}-[0-9]{0,4}+);
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final EditText EditText=(EditText)findViewById(R.id.EditText);
    editText.addTextChangedListener(新的TextWatcher(){
    @凌驾
    公共无效后文本已更改(可编辑){
    Log.d(标记“input”+s.toString());
    if(s.length()>0&!CODE_PATTERN.matcher.matches()){
    字符串输入=s.toString();
    字符串numbersOnly=仅保留数字(输入);
    字符串代码=FormatNumberScode(仅限数字);
    Log.d(标签“numbersOnly”+numbersOnly);
    日志d(标签,“代码”+代码);
    removeTextChangedListener(此);
    editText.setText(代码);
    editText.setSelection(code.length());
    editText.addTextChangedListener(此);
    }
    }
    @凌驾
    更改前文本之前的公共void(字符序列s、int start、int count、int after){
    }
    @凌驾
    public void onTextChanged(字符序列、int start、int before、int count){
    }
    私有字符串keepnsonly(字符序列){
    返回s.toString().replaceAll([^0-9],”);
    }
    专用字符串格式NumberScode(字符序列){
    int-groupDigits=0;
    字符串tmp=“”;
    对于(int i=0;i