Custom format edit text input android to accept credit card number

后端 未结 8 710
终归单人心
终归单人心 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:28

    Now this works fine for soft/hard keyboard for all delete/edit ops. tx 4 ur help..

    package com.and;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.inputmethodservice.KeyboardView;
    import android.os.Bundle;
    import android.telephony.PhoneNumberFormattingTextWatcher;
    import android.text.Editable;
    import android.text.Selection;
    import android.text.Spannable;
    import android.text.TextWatcher;
    import android.text.format.Formatter;
    import android.text.method.NumberKeyListener;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.View.OnKeyListener;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class ccformat extends Activity {
    
        String a;
        int keyDel;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            final EditText text = (EditText) findViewById(com.and.R.id.editText1);
    
            text.addTextChangedListener(new TextWatcher() {
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
    
                    boolean flag = true;
                    String eachBlock[] = text.getText().toString().split("-");
                    for (int i = 0; i < eachBlock.length; i++) {
                        if (eachBlock[i].length() > 4) {
                            flag = false;
                        }
                    }
                    if (flag) {
    
                        text.setOnKeyListener(new OnKeyListener() {
    
                            @Override
                            public boolean onKey(View v, int keyCode, KeyEvent event) {
    
                                if (keyCode == KeyEvent.KEYCODE_DEL)
                                    keyDel = 1;
                                return false;
                            }
                        });
    
                        if (keyDel == 0) {
    
                            if (((text.getText().length() + 1) % 5) == 0) {
    
                                if (text.getText().toString().split("-").length <= 3) {
                                    text.setText(text.getText() + "-");
                                    text.setSelection(text.getText().length());
                                }
                            }
                            a = text.getText().toString();
                        } else {
                            a = text.getText().toString();
                            keyDel = 0;
                        }
    
                    } else {
                        text.setText(a);
                    }
    
                }
    
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                }
            });
        }
    }
    
    0 讨论(0)
  • 2020-11-29 02:28

    if you neeed this efect,ou can use this code in EditText

    0 讨论(0)
  • 2020-11-29 02:32

    In my case below code is working fine.

    editTextCreditCard.addTextChangedListener(new FourDigitCardFormatWatcher());
    

    Add custom class for TextWatcher.

    public class FourDigitCardFormatWatcher implements TextWatcher {
    
            private static final char space = ' ';
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                if (s.length() > 0 && (s.length() % 5) == 0) {
                    final char c = s.charAt(s.length() - 1);
                    if (space == c) {
                        s.delete(s.length() - 1, s.length());
                    }
                }
                if (s.length() > 0 && (s.length() % 5) == 0) {
                    char c = s.charAt(s.length() - 1);
                    if (Character.isDigit(c) && TextUtils.split(s.toString(), String.valueOf(space)).length <= 3) {
                        s.insert(s.length() - 1, String.valueOf(space));
                    }
                }
            }
        }
    

    Hope this would help you.

    0 讨论(0)
  • 2020-11-29 02:35

    It works in all cases, when you insert or remove a character, the format will always be right. Make sure you set

    android:inputType="number"
    

    /

    myEditText.addTextChangedListener(new TextWatcher() {
            private final String space = "-"; // you can change this to whatever you want
            private final Pattern pattern = Pattern.compile("^(\\d{4}"+space+"{1}){0,3}\\d{1,4}$"); // check whether we need to modify or not
            @Override
            public void onTextChanged(CharSequence s, int st, int be, int count) {
                String currentText = myEditText.getText().toString();
                if (currentText.isEmpty() || pattern.matcher(currentText).matches())
                    return; // no need to modify
                String numbersOnly = currentText.trim().replaceAll("[^\\d.]", "");; // remove everything but numbers
                String formatted = "";
                for(int i = 0; i < numbersOnly.length(); i += 4)
                    if (i + 4 < numbersOnly.length())
                        formatted += numbersOnly.substring(i,i+4)+space;
                    else
                        formatted += numbersOnly.substring(i);
                myEditText.setText(formatted);
                myEditText.setSelection(myEditText.getText().toString().length());
            }
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    
            @Override
            public void afterTextChanged(Editable e) {}
    });
    
    0 讨论(0)
  • 2020-11-29 02:37

    Here is a formatting regex used to show card details in format XXXX XXXX XXXX XXXX

    etCreditCardNumber.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) {
                    etCreditCardNumber.setFloatingLabel(MaterialEditText.FLOATING_LABEL_HIGHLIGHT);
    
                    String initial = s.toString();
                    // remove all non-digits characters
                    String processed = initial.replaceAll("\\D", "");
    
                    // insert a space after all groups of 4 digits that are followed by another digit
                    processed = processed.replaceAll("(\\d{4})(?=\\d)(?=\\d)(?=\\d)", "$1 ");
    
                    //Remove the listener
                    etCreditCardNumber.removeTextChangedListener(this);
    
                    int index = etCreditCardNumber.getSelectionEnd();
    
                    if (index == 5 || index == 10 || index == 15)
                        if (count > before)
                            index++;
                        else
                            index--;
    
                    //Assign processed text
                    etCreditCardNumber.setText(processed);
    
                    try {
                        etCreditCardNumber.setSelection(index);
                    } catch (Exception e) {
                        e.printStackTrace();
                        etCreditCardNumber.setSelection(s.length() - 1);
                    }
                    //Give back the listener
                    etCreditCardNumber.addTextChangedListener(this);
                }
    
                @Override
                public void afterTextChanged(Editable s) {
    
                }
            });
    
    0 讨论(0)
  • 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;
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题