Custom format edit text input android to accept credit card number

后端 未结 8 888
终归单人心
终归单人心 2020-11-29 01:46

how to make edit text accept input in format

4digitnumber-4dignumber-4dignumber-4dignumber   

The code

text.addTextChangedL         


        
8条回答
  •  误落风尘
    2020-11-29 02:45

    This is working:

    public class EditTextSample extends Activity {
        // This regexp has to be improved, it does not detect case where you have
        // more than 4 digits in a middle group like: 1234-12345-123
        static final Pattern CODE_PATTERN = Pattern.compile("([0-9]{0,4})|([0-9]{4}-)+|([0-9]{4}-[0-9]{0,4})+");
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.edit_text_sample);
    
            final EditText editText = (EditText) findViewById(R.id.input);
            editText.addTextChangedListener(new TextWatcher() {
    
                @Override
                public void afterTextChanged(Editable s) {
                    Log.w("", "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.w("", "numbersOnly" + numbersOnly);
                        Log.w("", "code" + code);
    
                        editText.removeTextChangedListener(this);
                        editText.setText(code);
                        // You could also remember the previous position of the cursor
                        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]", ""); // Should of course be more robust
                }
    
                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;
                }
            });
        }
    }
    

提交回复
热议问题