2010-11-13 12 views
6

Ist es möglich, Zeichen in eine EditTextautomatisch einzugeben, während der Benutzer Daten eingibt?Live-Bearbeitung der Benutzereingabe

I.e. Wenn der Benutzer eine lange Nummer wie 123456789012 eingibt, ist es möglich, dass diese Nummer angezeigt wird, während er sie in das Eingabefeld eingibt, aber mit einem Strich jedes vierte Zeichen?

So wie Sie die Nummer oben eingeben, würden Sie sehen, dass es in der EditText Box eingegeben wird, aber würde so aussehen: 1234-5678-9012.

Derzeit habe ich eine App, wo Sie eine lange Zahl eingeben können und dann eine Taste drücken und es fügt die Bindestriche für Sie ein, aber ich bin gespannt, ob es während der Eingabe getan werden könnte?

Vielen Dank für jede Hilfe.

+1

Welche Sprache? Welche Plattform? Dies ist im Allgemeinen möglich, aber die Details hängen von der Sprache und Plattform ab. – Oded

+0

In welcher Technologie? Z.B. in einer Webseite, einer iPhone App usw. –

Antwort

11

Durch die Kennzeichnung android, ich glaube, Sie über android editText diskutieren, so können Sie es tun, indem Sie die TextChangedListener hören,

EDITED: für 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

Großartig. Vielen Dank für die Antwort. – Entropy1024

+1

Machen Sie auch Löschvorgänge - das angegebene Beispiel macht es möglicherweise unmöglich, nach der Eingabe von 4 Zeichen zurückzuspringen (beim Löschen des Gedankenstrichs wird sofort ein weiterer eingefügt). – Nick

+0

@Nick, ich habe es für Backspace bearbeitet, also ist es nicht unmöglich –

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

dies tun wird als Nun, nur dieser Code wird nach dem 3. Zeichen " - " einfügen.

0

ist, was ich

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

Sie Trennzeichen ersetzen hier mit dem, was Sie Ziffern trennen wollen.

0

Für diejenigen, die noch mit Blick auf Probleme mit Backspace und mehrere Bindestriche -

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

dieses Problem zu lösen, schreibe ich eine Klasse "AutoAddTextWatcher":

1. Auto Einfügen von Text in EditText.
2. Fügen Sie Text in EditText an Positionen ein, die Sie festlegen.
3. Löschen von Text in EditText an Stellen Sie gefassten sind, wenn Textlänge größer als 1.

enter image description here

Code-Schnipsel:

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

AutoAddTextWatcher Klasse

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

    } 

} 

komplette Demoquelle:
https://github.com/henrychuangtw/AutoInsertEditText

+0

Wow Kumpel! Du bist ein Genie! Vielen Dank dafür ... Ich habe SO VIELE Lösungen versucht, aber nichts hat richtig funktioniert. Ich musste es wie folgt formatieren: 12-345-67. Jede andere Lösung hatte immer seltsame Dinge, wenn Sie löschten und dann versuchten, erneut einzutreten. Ihre Lösungen funktionieren PERFEKT! Eine Sache, die man beachten sollte, ist jedoch, dass die Eingabeart in der XML-Datei auf 'android: inputType =" phone "festgelegt werden muss. Ich habe es anfangs mit' android: inputType = "number" versucht und es hat nicht funktioniert arbeite nicht. Ich habe deine GitHub-Seite überprüft und gesehen, dass du "Telefon" benutzt hast, und das funktioniert jetzt. Gut gemacht! –

+0

Hier ist meine Implementierung: 'enterUserID.addTextChangedListener (neuer AutoAddTextWatcher (enterUserID, " - ", 2, 5));' –

+0

@KevinBright Vielen Dank Ihre Ermutigung und Vorschlag, ich werde es versuchen. – HenryChuang