2012-06-21 16 views
79

Ich weiß ein wenig über TextWatcher, aber das feuert auf jedes Zeichen, das Sie eingeben. Ich möchte einen Listener, der immer dann ausgelöst wird, wenn der Benutzer die Bearbeitung beendet hat. Ist es möglich? Auch in TextWatcher bekomme ich eine Instanz von Editable, aber ich brauche eine Instanz von EditText. Wie bekomme ich das?android edittext onchange Listener

BEARBEITEN: die zweite Frage ist wichtiger. Bitte beantworte das.

+1

versuchen, den Fokus Zuhörer hinzuzufügen gegeben auszuführen, wenn der editText den Fokus nehmen Das bedeutet, dass der Benutzer mit der Bearbeitung begonnen hat. Wenn EditText den Fokus verliert, bedeutet dies, dass die Bearbeitung abgeschlossen ist – Houcine

+0

https://github.com/henrychuangtw/AutoInsertEditText – HenryChuang

Antwort

156

zuerst, können Sie sehen, ob der Benutzer fertig ist, um den Text zu bearbeiten, wenn die EditText Fokus verlieren oder wenn der Benutzer die Schaltfläche "Fertig" drückt (das hängt von Ihrer Implementierung und davon ab, was am besten für Sie passt). Zweitens, Sie können eine EditText Instanz innerhalb des Textwatcher nur dann nicht erhalten, wenn Sie das EditText als Instanzobjekt deklariert haben. Auch wenn Sie die EditText nicht innerhalb der textwatcher bearbeiten sollten, weil es nicht sicher ist.

EDIT:

Um die EditText Instanz in Ihre TextWatcher Implementierung bekommen Sie so etwas wie dies versuchen sollte:

public class YourClass extends Activity { 

private EditText yourEditText; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
     yourEditText = (EditText) findViewById(R.id.yourEditTextId); 

     yourEditText.addTextChangedListener(new TextWatcher() { 

      public void afterTextChanged(Editable s) { 

      // you can call or do what you want with your EditText here 
      yourEditText. ... 

      } 

      public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

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

} 

Beachten Sie, dass die obige Probe einige Fehler haben könnten, aber ich wollte nur zeige dir ein Beispiel.

1

Soweit ich darüber nachdenken kann, gibt es nur zwei Möglichkeiten, wie Sie es tun können. Wie können Sie wissen, dass der Benutzer ein Wort geschrieben hat? Entweder ist der Fokus verloren gegangen oder Sie klicken auf einen "OK" -Button. Es gibt keine Möglichkeit in meinem Kopf können Sie wissen, dass der Benutzer das letzte Zeichen gedrückt ...

So rufen Sie onFocusChange(View v, boolean hasFocus) oder fügen Sie eine Schaltfläche und einen Klick-Listener zu.

2

TextWatcher nicht für mich arbeiten, wie es für jeden EditText Brennen gehalten und jede andere Werte durcheinander.

Hier ist meine Lösung:

public class ConsultantTSView extends Activity { 
    ..... 

    //Submit is called when I push submit button. 
    //I wanted to retrieve all EditText(tsHours) values in my HoursList 

    public void submit(View view){ 

     ListView TSDateListView = (ListView) findViewById(R.id.hoursList); 
     String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString(); 
    } 
} 

daher durch die getChildAt(xx) Methode verwenden Sie ein beliebiges Element im ListView abrufen kann und die einzelnen Artikel findViewById mit bekommen. Und es wird dann den neuesten Wert geben.

4

Ich habe es AutotextView mit getan:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview); 
textView.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
     seq = cs; 
    } 

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

    } 

    @Override 
    public void afterTextChanged(Editable arg0) { 
     new SearchTask().execute(seq.toString().trim()); 
    } 

}); 
8

jedermann unter Verwendung butter. Sie können wie verwenden:

@OnTextChanged(R.id.zip_code) 
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) { 

} 
7

Es wurde stört mich, dass für alle meine EditText Felder ein Zuhörer Implementierung erforderlich mich hässlich, ausführliche Code zu haben, so schrieb ich die unten Klasse. Kann nützlich sein, wenn jemand darüber stolpert.

public abstract class TextChangedListener<T> implements TextWatcher { 
    private T target; 

    public TextChangedListener(T target) { 
     this.target = target; 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

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

    @Override 
    public void afterTextChanged(Editable s) { 
     this.onTextChanged(target, s); 
    } 

    public abstract void onTextChanged(T target, Editable s); 
} 

Jetzt implementieren ein Listener ist ein bisschen sauberer.

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) { 
      @Override 
      public void onTextChanged(EditText target, Editable s) { 
       //Do stuff 
      } 
     }); 

Was, wie oft es feuert, könnte man vielleicht einen Scheck implementieren ihren gewünschten Code in //Do stuff nach einem einem

2
myTextBox.addTextChangedListener(new TextWatcher() { 

  public void afterTextChanged(Editable s) {} 

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

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

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox); 
    myOutputBox.setText(s); 

    } 
}); 
+2

Am Ende gibt es eine unnötige} – Howard