Format credit card in edit text in android

后端 未结 29 2056
耶瑟儿~
耶瑟儿~ 2020-11-30 19:18

How to make EditText accept input in format:

4digit 4digit 4digit 4digit 

I tried Custom format edit text input android to acc

29条回答
  •  囚心锁ツ
    2020-11-30 19:57

    I think that my solution can work well whatever middle text operation or copy-paste operation.

    Please see code as below,

      class BankNumberTextWatcher implements TextWatcher {
          private int previousCodeLen = 0;
    
          @Override
          public void beforeTextChanged(CharSequence s, int start, int count, int after) {
          }
    
          @Override
          public void onTextChanged(CharSequence s, int start, int before, int count) {
          }
    
          @Override
          public void afterTextChanged(Editable s) {
              if (s.length() > 0) {
                  String numbersOnly = s.toString().replaceAll("[^0-9]", "");
                  // current code pattern miss-match, then handle cursor position and format the code
                  handleEditInput(numbersOnly);
              } else {
                  previousCodeLen = 0;
              }
          }
    
          /**
           * Handle EditText input process for credit card including insert, delete during middle position,
           * end position or copy-paste controller
           *
           * @param numbersOnly the pure number without non-digital characters
           */
          private void handleEditInput(final String numbersOnly) {
              String code = formatNumbersAsCode(numbersOnly);
              int cursorStart = etBankCardNumber.getSelectionStart();
              etBankCardNumber.removeTextChangedListener(this);
              etBankCardNumber.setText(code);
              int codeLen = code.length();
              if (cursorStart != codeLen) {
                 // middle-string operation
                 if (cursorStart > 0 && cursorStart % 5 == 0) {
                    if (codeLen > previousCodeLen) {
                        // insert, move cursor to next
                        cursorStart++;
                    } else if (codeLen < previousCodeLen) {
                        // delete, move cursor to previous
                        cursorStart--;
                    }
                 }
                 etBankCardNumber.setSelection(cursorStart);
              } else {
                 // end-string operation
                 etBankCardNumber.setSelection(codeLen);
              }
              etBankCardNumber.addTextChangedListener(this);
              previousCodeLen = codeLen;
          }
    
          /**
           * formats credit code like 1234 1234 5123 1234
           *
           * @param s
           * @return
           */
           public String formatNumbersAsCode(CharSequence s) {
              if (TextUtils.isEmpty(s)) {
                return "";
              }
              int len = s.length();
              StringBuilder tmp = new StringBuilder();
              for (int i = 0; i < len; ++i) {
                  tmp.append(s.charAt(i));
                  if ((i + 1) % 4 == 0 && (i + 1) != len) {
                      tmp.append(" ");
                  }
              }
              return tmp.toString();
            }
      }
    

    Makes inputType to number for EditText to avoid other characters in the layout file.

    Hope that be helpful for you.

提交回复
热议问题