Edición en vivo de la entrada de los usuarios

¿Es posible insertar caracteres automáticamente en EditText medida que el usuario EditText datos ?

Es decir, si el usuario está ingresando un número largo como 123456789012 , ¿es posible que aparezca este número mientras lo está escribiendo en el cuadro de texto de edición, pero con un guión cada 4º personaje?

Así que al escribir el número de arriba, verá que se ingresa en el cuadro EditText , pero se verá así: 1234-5678-9012.

Actualmente tengo una aplicación donde puedes ingresar un número largo y luego presionar un botón e inserta los guiones por ti, pero tengo curiosidad de saber si se puede hacer mientras escribes.

Muchas gracias por cualquier ayuda.

Al etiquetar a Android, creo que estás discutiendo sobre android editText, es para que puedas hacerlo escuchando el TextChangedListener,

EDITADO: por retroceso

 editText.addTextChangedListener(new TextWatcher() { int len=0; @Override public void afterTextChanged(Editable s) { String str = editText.getText().toString(); if(str.length()==4&& len  

para resolver este problema, escribo una clase “AutoAddTextWatcher”:

1. Insertar texto automáticamente en EditText.
2. inserta texto en EditText en las posiciones que estás configurando.
3. elimine el texto en EditText en las posiciones que tiene configuradas, cuando la longitud del texto es mayor que 1.

enter image description here

fragmento de código :

 mEditText_birthday.addTextChangedListener(new AutoAddTextWatcher(mEditText_birthday, "/", new TextWatcher() {}, 4, 6)); 

Clase AutoAddTextWatcher

 import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; /** * Created by henry.chuang on 2016/5/12. */ public class AutoAddTextWatcher implements TextWatcher { private CharSequence mBeforeTextChanged; private TextWatcher mTextWatcher; private int[] mArray_pos; private EditText mEditText; private String mAppentText; public AutoAddTextWatcher(EditText editText, String appendText, int... position){ this.mEditText = editText; this.mAppentText = appendText; this.mArray_pos = position.clone(); } public AutoAddTextWatcher(EditText editText, String appendText, TextWatcher textWatcher, int... position){ this(editText, appendText, position); this.mTextWatcher = textWatcher; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { mBeforeTextChanged = s.toString(); if(mTextWatcher != null) mTextWatcher.beforeTextChanged(s, start, count, after); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { for (int i = 0; i < mArray_pos.length; i++) { if(((mBeforeTextChanged.length() - mAppentText.length() * i) == (mArray_pos[i] - 1) && (s.length() - mAppentText.length() * i) == mArray_pos[i])){ mEditText.append(mAppentText); break; } if(((mBeforeTextChanged.length() - mAppentText.length() * i) == mArray_pos[i] && (s.length() - mAppentText.length() * i) == (mArray_pos[i] + 1))){ int idx_start = mArray_pos[i] + mAppentText.length() * i; int idx_end = Math.min(idx_start + mAppentText.length(), s.length()); String sub = mEditText.getText().toString().substring(idx_start, idx_end); if(!sub.equals(mAppentText)){ mEditText.getText().insert(s.length() - 1, mAppentText); } break; } if(mAppentText.length() > 1 && (mBeforeTextChanged.length() - mAppentText.length() * i) == (mArray_pos[i] + mAppentText.length()) && (s.length() - mAppentText.length() * i) == (mArray_pos[i] + mAppentText.length() - 1)){ int idx_start = mArray_pos[i] + mAppentText.length() * i; int idx_end = Math.min(idx_start + mAppentText.length(), s.length()); mEditText.getText().delete(idx_start, idx_end); break; } } if(mTextWatcher != null) mTextWatcher.onTextChanged(s, start, before, count); } @Override public void afterTextChanged(Editable s) { if(mTextWatcher != null) mTextWatcher.afterTextChanged(s); } } 

completa fuente de demostración:
https://github.com/henrychuangtw/AutoInsertEditText

 @Override public void afterTextChanged(Editable s) { if(s.length() == 3 && len < s.length()){ s.append(" - "); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { len = s.length(); } 

Esto también lo hará, solo este código insertará " - " después del tercer carácter.

Esto es lo que usé

 private boolean mInEdit; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (!mInEdit) { mInEdit = true; String delimiter = " - "; //Remove chars from your delimiter first String digits = s.toString().replaceAll("[- ]", "") .replaceAll("\\d{4}", "$0" + delimiter); //Handle deletion int dLength = delimiter.length(); if (before > count && digits.endsWith(delimiter.charAt(dLength - 1)) { digits = digits.substring(0, digits.length() - dLength); } mCardNumber.setText(digits); mCardNumber.setSelection(mCardNumber.length()); mInEdit = false; } } 

Aquí reemplaza delimitador con lo que desea separar dígitos.

Para aquellos que todavía enfrentan problemas con el retroceso y múltiples guiones,

 new TextWatcher() { boolean hyphenExists; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (s.length() >= 6 && s.charAt(5) == '-') { hyphenExists = true; } else { hyphenExists = false; } Log.d("TAG", "beforeTextChanged " + s.toString()); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { Log.d("TAG", "onTextChanged " + s.toString()); } @Override public void afterTextChanged(Editable s) { if (s.length() == 5) { if (!hyphenExists) s.append('-'); } Log.d("TAG", "afterTextChanged " + s.toString()); } }