2010-11-13 12 views
6

¿Es posible insertar caracteres automáticamente en un EditTextcuando el usuario ingresa los datos?Edición en vivo de la entrada de los usuarios

I.e. si el usuario está ingresando un número largo como 123456789012, ¿es posible que este número aparezca mientras lo está escribiendo en el cuadro de texto de edición, pero con un guión cada cuarto carácter?

Para que escriba el número anterior, verá que se ingresa en el cuadro EditText pero se verá así: 1234-5678-9012.

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

Muchas gracias por cualquier ayuda.

+1

¿Qué idioma? ¿Qué plataforma? Esto, en general, es posible, pero los detalles dependen del idioma y la plataforma. – Oded

+0

¿En qué tecnología? P.ej. en una página web, una aplicación para iPhone, etc. –

Respuesta

11

Al etiquetar androide, creo que se está discutiendo sobre EDITTEXT androide, está lo que puede hacer que al escuchar la 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 <str.length()){//len check for backspace 
        editText.append("-"); 
       } 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 

      String str = editText.getText().toString(); 
       len = str.length(); 
      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
      } 


     }); 
+0

Genial. Muchas gracias por la respuesta. – Entropy1024

+1

Gestione las eliminaciones también; el ejemplo dado puede hacer que no se pueda retroceder después de escribir 4 caracteres (ya que borrar el guión inmediatamente agregará otra vez). – Nick

+0

@Nick, lo he editado por retroceso, así que no es imposible –

0
@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 va a hacer que bueno, solo este código insertará " - " después del 3er carácter.

0

Esto es lo que solía

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í se reemplaza delimitador con lo que se quiere separar dígitos.

0

Para aquellos que aún enfrenta problemas con la tecla de retroceso y varios 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()); 
     } 
    } 
6

para resolver este problema, escribo una clase "AutoAddTextWatcher":

1. Insertar texto automático en EditarTexto.
2. inserta texto en EditText en las posiciones que hayas configurado.
3. eliminar texto de EditarTexto en las posiciones que llegan a amarrar, cuando la longitud del texto más grande 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); 

    } 

} 

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

+0

Wow amigo! ¡Eres un genio! Muchas gracias por esto ... He intentado MUCHAS soluciones, pero nada funcionó bien. Necesitaba formatearlo así: 12-345-67. Cada otra solución siempre tenía cosas extrañas cuando borraba y luego intentaba volver a ingresar. ¡Tus soluciones funcionan PERFECTAMENTE! Una cosa a tener en cuenta, para que tu clase funcione correctamente, debes establecer el tipo de entrada en el archivo XML a 'android: inputType =" phone "' Intenté inicialmente con 'android: inputType =" number "' y no funcionó no funciona Revisé su página github y vi que usó 'phone', y eso ahora funciona. ¡Gran trabajo! –

+0

Aquí está mi implementación: 'enterUserID.addTextChangedListener (new AutoAddTextWatcher (enterUserID, " - ", 2, 5));' –

+0

@KevinBright Gracias por su aliento y sugerencia, lo intentaré. – HenryChuang

Cuestiones relacionadas