2010-11-13 14 views
6

Czy możliwe jest automatyczne wstawianie znaków do EditTextjako danych wprowadzanych przez użytkownika?Edycja na żywo wprowadzanych użytkowników

tj. jeśli użytkownik wprowadza długi numer, taki jak 123456789012, czy jest możliwe, aby ten numer pojawiał się podczas wpisywania go w polu tekstowym, ale za pomocą myślnika co czwartego znaku?

Po wpisaniu powyższej cyfry zostanie ona wprowadzona do pola EditText, ale będzie wyglądać następująco: 1234-5678-9012.

Obecnie mam aplikację, w której można wprowadzić długą liczbę, a następnie naciśnij przycisk i wstawia myślniki, ale jestem ciekawy, czy można to zrobić podczas pisania?

Wielkie dzięki za pomoc.

+1

Jaki język? Jaka platforma? Jest to ogólnie możliwe, ale szczegóły zależą od języka i platformy. – Oded

+0

W jakiej technologii? Na przykład. na stronie internetowej, w aplikacji na iPhone itp. –

Odpowiedz

11

Przez tagowanie android, myślę, że dyskutujemy o android EditText, jest więc można to zrobić poprzez słuchanie TextChangedListener,

edycja: dla Backspace

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

Świetnie. Dziękuję bardzo za odpowiedź. – Entropy1024

+1

Zajmuje się także usuwaniem - podany przykład może uniemożliwić powrót do tyłu po wpisaniu 4 znaków (usunięcie elementu spowoduje natychmiastowe dodanie kolejnego). – Nick

+0

@Nick, edytowałem go dla backspace, więc nie jest to niemożliwe –

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

zrobi to jako cóż, tylko ten kod wstawi " - " po 3. znaku.

0

To co kiedyś

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

Tutaj można zastąpić separator co chcesz oddzielić cyfr.

0

Dla tych nadal stoi kłopoty z backspace i wielu myślnikami -

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

aby rozwiązać ten problem, należy napisać klasę "AutoAddTextWatcher":

1. Włóż Auto tekst do EditText.
2. wstaw tekst do EditText na ustawionych pozycjach.
3. usunąć tekst w EditText w pozycjach jesteś setted, gdy długość tekstu większy niż 1.

enter image description here

fragment kodu:

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

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

    } 

} 

pełne źródło demo:
https://github.com/henrychuangtw/AutoInsertEditText

+0

Wow dude! Jesteś geniuszem! Dziękuję bardzo za to ... Próbowałem TAK WIELU rozwiązań, ale nic nie działało dobrze. Musiałem go sformatować tak: 12-345-67. Każde inne rozwiązanie zawsze miało dziwne rzeczy, kiedy je usuwałeś, a następnie próbowałeś ponownie wejść. Twoje rozwiązania działają PERFEKCYJNIE! Należy jednak pamiętać, że aby klasa działała poprawnie, należy ustawić typ danych wejściowych w pliku XML na 'android: inputType =" phone "' Próbowałem początkowo z 'android: inputType =" number "' i nie zrobił tego nie działa. Sprawdziłem twoją stronę github i zobaczyłem, że użyłeś 'phone', i to teraz działa. Dobra robota! –

+0

Oto moja implementacja: 'enterUserID.addTextChangedListener (nowy AutoAddTextWatcher (enterUserID, " - ", 2, 5));' –

+0

@KevinBright Dzięki Twojej zachęcie i sugestii, spróbuję. – HenryChuang

Powiązane problemy