android edittext onchange listener

114

Ich weiß ein bisschen darüber Bescheid, TextWatcheraber das wird bei jedem Charakter ausgelöst, den Sie eingeben. Ich möchte einen Listener, der ausgelöst wird, wenn der Benutzer die Bearbeitung beendet hat. Ist es möglich? Auch in TextWatcherbekomme ich eine Instanz von, Editableaber ich brauche eine Instanz von EditText. Wie bekomme ich das?

EDIT : Die zweite Frage ist wichtiger. Bitte beantworten Sie das.

Zinken
quelle
1
versuchen , den Fokus Zuhörer hinzuzufügen, wenn der editText den Fokus nehmen, das bedeutet , dass der Benutzer der Bearbeitung begonnen hat, und wenn die editText den Fokus verlieren, bedeutet dies , dass die Bearbeitung beendet ist
Houcine

Antworten:

213

Zunächst können Sie sehen, ob der Benutzer die Bearbeitung des Textes abgeschlossen hat, wenn der EditTextFokus verloren geht oder ob der Benutzer die Schaltfläche " Fertig" drückt (dies hängt von Ihrer Implementierung ab und davon, was für Sie am besten geeignet ist). Zweitens können Sie keine EditTextInstanz innerhalb der TextWatchernur erhalten, wenn Sie das EditTextals Instanzobjekt deklariert haben . Auch wenn Sie das nicht EditTextinnerhalb des bearbeiten sollten, TextWatcherweil es nicht sicher ist.

BEARBEITEN:

Um die EditTextInstanz in Ihre TextWatcherImplementierung zu integrieren, sollten Sie Folgendes versuchen:

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 das obige Beispiel möglicherweise einige Fehler enthält, aber ich wollte Ihnen nur ein Beispiel zeigen.

Cata
quelle
17

Es hat mich gestört, dass für die Implementierung eines Listeners für alle meine EditText-Felder hässlicher, ausführlicher Code erforderlich war, sodass ich die folgende Klasse schrieb. Kann für jeden nützlich sein, der 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 ist die Implementierung eines Listeners etwas sauberer.

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

Wie oft es ausgelöst wird, könnte man vielleicht eine Prüfung durchführen, um den gewünschten Code //Do stuffnach einem bestimmten a auszuführen

RNGuy
quelle
Das funktioniert sehr gut für mich, spart viele Codezeilen! Du bist ein Genie!
huypham99
12

Jeder, der ButterKnife benutzt . Sie können wie folgt verwenden:

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

}
Prakash
quelle
6

Ich habe es gemacht mit AutotextView:

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

});
Zar E Ahmer
quelle
3
 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);  

    }  
});  
Ramesh Sambu
quelle
2
Es gibt eine unnötige} am Ende
Howard
2

TextWatcherhat bei mir nicht funktioniert, da es immer wieder für jeden feuerte EditTextund die Werte des anderen durcheinander brachte.

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

Mit der getChildAt(xx)Methode können Sie also jeden Artikel in der abrufen ListViewund den einzelnen Artikel mit abrufen findViewById. Und es wird dann den neuesten Wert geben.

user2566490
quelle
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 fertig geschrieben hat? Entweder bei Fokusverlust oder durch Klicken auf die Schaltfläche "OK". Ich habe keine Möglichkeit zu wissen, dass der Benutzer das letzte Zeichen gedrückt hat ...

Rufen onFocusChange(View v, boolean hasFocus)Sie also eine Schaltfläche und einen Klick-Listener an oder fügen Sie sie hinzu.

Nuno Gonçalves
quelle
0

Die Watcher-Methode wird bei jeder Zeicheneingabe ausgelöst. Also habe ich diesen Code basierend auf der onFocusChange-Methode erstellt:

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

Um es zu benutzen, rufen Sie einfach so auf:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

Sie können die Funktion comS ignorieren, indem Sie! ComS (dat.s, "" + EdTe.getText ()) durch die Funktion! Equal ersetzen. Allerdings funktioniert die Gleichheitsfunktion selbst einige Zeit zur Laufzeit nicht richtig.

Der onChange-Listener merkt sich beim Eingeben des Benutzerfokus alte Daten von EditText und vergleicht die neuen Daten, wenn der Benutzer den Fokus verliert oder zu einer anderen Eingabe springt. Wenn der alte String nicht mit dem neuen String verglichen wird, wird die Arbeit ausgelöst.

Wenn Sie nur 1 EditText haben, müssen Sie eine ClearFocus-Funktion erstellen, indem Sie einen Ultimate Secret Transparent Micro EditText (außerhalb der Fenster) erstellen und den Fokus darauf anfordern. Anschließend können Sie die Tastatur über den Import Method Manager ausblenden.

phnghue
quelle