Formato personalizado editar entrada de texto android para aceptar número de tarjeta de crédito

Cómo hacer que el texto de edición acepte la entrada en formato

4digitnumber-4dignumber-4dignumber-4dignumber 

El código

 text.addTextChangedListener(new TextWatcher() { int len = 0; String string ; @Override public void afterTextChanged(Editable s) { text.setOnKeyListener(new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL) { } else{ string = text.getText().toString(); len = string.length()+1; if(len%5==0){text.append("-");} } return false; } }); } }); 

Funciona bien al agregar, pero eliminar o editar causas problema.

Ahora esto funciona bien para el teclado suave / duro para todas las operaciones de eliminación / edición. Tx 4 ur ayuda ..

 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) { } }); } } 

Esto está funcionando:

 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; } }); } } 

Me parece que las respuestas presentadas aquí no funcionan correctamente con la eliminación, la eliminación de las operaciones de medio, etc Aquí está mi código. No restringe la longitud de la entrada, pero parece estar bien con varias inserciones y eliminaciones:

 import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.View; import android.widget.EditText; public class HyphenDelimitTextWatcher implements TextWatcher { EditText mEditText; boolean mInside = false; boolean mWannaDeleteHyphen = false; boolean mKeyListenerSet = false; final static String MARKER = "|"; // filtered in layout not to be in the string @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if(!mKeyListenerSet) { mEditText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { try { mWannaDeleteHyphen = (keyCode == KeyEvent.KEYCODE_DEL && mEditText.getSelectionEnd() - mEditText.getSelectionStart() <= 1 && mEditText.getSelectionStart() > 0 && mEditText.getText().toString().charAt(mEditText.getSelectionEnd() - 1) == '-'); } catch (IndexOutOfBoundsException e) { // never to happen because of checks } return false; } }); mKeyListenerSet = true; } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (mInside) // to avoid recursive calls return; mInside = true; int currentPos = mEditText.getSelectionStart(); String string = mEditText.getText().toString().toUpperCase(); String newString = makePrettyString(string); mEditText.setText(newString); try { mEditText.setSelection(getCursorPos(string, newString, currentPos, mWannaDeleteHyphen)); } catch (IndexOutOfBoundsException e) { mEditText.setSelection(mEditText.length()); // last resort never to happen } mWannaDeleteHyphen = false; mInside = false; } @Override public void afterTextChanged(Editable s) { } private String makePrettyString(String string) { String number = string.replaceAll("-", ""); boolean isEndHyphen = string.endsWith("-") && (number.length()%4 == 0); return number.replaceAll("(.{4}(?!$))", "$1-") + (isEndHyphen ?"-":""); } private int getCursorPos(String oldString, String newString, int oldPos, boolean isDeleteHyphen) { int cursorPos = newString.length(); if(oldPos != oldString.length()) { String stringWithMarker = oldString.substring(0, oldPos) + MARKER + oldString.substring(oldPos); cursorPos = (makePrettyString(stringWithMarker)).indexOf(MARKER); if(isDeleteHyphen) cursorPos -= 1; } return cursorPos; } public HyphenDelimitTextWatcher(EditText editText) { mEditText = editText; } } 

Uso:

  mSomeEditText.addTextChangedListener(new HyphenDelimitTextWatcher(mSomeEditText)); 

Si necesitas este efecto, puedes usar este código en EditText

Introduzca aquí la descripción de la imagen

En mi caso, el código abajo funciona bien.

 editTextCreditCard.addTextChangedListener(new FourDigitCardFormatWatcher()); 

Agregue una clase personalizada para 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)); } } } } 

Espero que esto te ayude.

  • Obtener la información actual de onClickListener de un objeto de Android View
  • "... debe proporcionar un layout_height ..." pero es en mis recursos de estilo?
  • Android redondeado esquina textview con redondeo perfecto en la esquina
  • Android: Ocultar divisores secundarios en ExpandableListView
  • Vista de texto de Autocompletar de Twitter como Android
  • Android: la intención pendiente de AppWidget no se dispara
  • Un diseño relativo simple, alinear con el derecho de los padres no funciona
  • Android - Personalización del widget Spinner Look and Feel
  • La sugerencia EditarTexto no se muestra
  • Spinner hace que la aplicación Android se bloquee
  • ¿No se puede utilizar el hilador androide?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.