Die EditText setError-Nachricht wird nach der Eingabe nicht gelöscht

75

Ok, ich habe nur ein EditText-Feld und eine Schaltfläche, die beim Drücken eine AsyncTask auslöst.

EditText playerName = (EditText)findViewById(R.id.playerEditText);

if(playerName.getText().toString().length() == 0 )
    playerName.setError("Player name is required!");
else {
    // do async task
}

Das Problem ist, dass die Fehlermeldung auch dann noch angezeigt zu werden scheint, wenn ich gültigen Text für die Suche eingebe. Gibt es eine Möglichkeit, den Fehler zu beheben, sobald der EditText nicht leer ist?

Michael
quelle

Antworten:

144

Geben Sie in Ihre else-Klammer ein, um playerName.setError(null)den Fehler zu beheben.

Alex Curran
quelle
12
Dadurch wird der Fehler behoben, wenn die Taste gedrückt wird. Er sollte jedoch gelöscht werden, wenn sich die Texteingabe ändert. Dies sollte gemäß den Dokumenten automatisch erfolgen : "Das Symbol und die Fehlermeldung werden auf null zurückgesetzt, wenn wichtige Ereignisse Änderungen am Text der Textansicht verursachen."
Blahdiblah
4
Ich sehe dasselbe beim Drücken von Löschen, aber es wird gelöscht, wenn neuer Text eingegeben wird - Galaxy Nexus 4.3. In früheren Betriebssystemen nicht bemerkt. Also werde ich sagen, dass Android fehlerhaft ist.
Sofi Software LLC
Rücktaste scheint Fehlermeldung auf meinem 2.3.3-Telefon zu löschen, aber nicht auf 4.1.1 mit der gleichen APK und Support-Bibliothek
Eugene
Sie können eine TextWatcherand override- afterTextChangedMethode verwenden.
MChaker
1
@blahdiblah du machst eine gute Beobachtung. Aber denken Sie nicht, dass es ein Fehler ist. Nur Googles wirklich schlechtes Dokument. Der zweite Satz besagt, dass die Fehlermeldung auf "null" gesetzt wird, was bedeutet, dass das Symbol noch aktiv ist. Der letzte Satz besagt, dass Symbol und Nachricht nur gelöscht werden (dh zurückgesetzt werden), wenn setError (null). Google hätte weitere 5 Minuten investieren können, um dies aufzuschreiben. Möglicherweise ist es zu beschäftigt, Geld zu zählen und an selbstfahrenden Autos zu arbeiten.
AngryITguy
53

API-Dokumentation: "Das Symbol und die Fehlermeldung werden auf null zurückgesetzt, wenn wichtige Ereignisse Änderungen am Text von TextView verursachen." Obwohl es nicht so ist - und deshalb können wir dies als Fehler betrachten.

Wenn Sie inputType wie textNoSuggestions, textEmailAddress, textPassword verwenden, wird der Fehler nach der Eingabe eines Zeichens deaktiviert. Fast wie dokumentiert, aber auch hier nicht genau - wenn Sie ein Zeichen löschen, bleibt der Fehler bestehen. Es scheint, dass eine einfache Problemumgehung mit addTextChangedListener und setError (null) das versprochene Verhalten erreichen kann.

Außerdem gibt es Beiträge über Symbolverlust auf Android 4.2. Also vorsichtig verwenden.

Gints
quelle
7
Diese Antwort sollte höher eingestuft werden - sie liefert sehr wertvolle Informationen.
Rosomack
1
Es ist wirklich verwirrend, aber kein Fehler ... nur ziemlich schlechtes Dokument ... siehe meinen Kommentar in der genehmigten Antwort.
AngryITguy
25.1.0+ immer noch Fehler.
Rachael
1
@ Giulio Es ist ein Fehler. In meinem Telefon tritt das Problem beispielsweise nur bei einigen inputTypeund nur dann auf, wenn ich ein einzelnes Zeichen eingebe. Nach der zweiten Zeicheneingabe EditTextverhält sich das wie erwartet und der Fehler verschwindet. Diese Inkonsistenz ähnelt eher einem Fehler.
Gustavo
12

Versuchen Sie diesen Hörer:

      playerName.addTextChangedListener(new TextWatcher()
                {
                    public void afterTextChanged(Editable edt){
                        if( playerName.getText().length()>0)
                        {
                             playerName.setError(null);
                        }
                    }
Jan Ziesse
quelle
Test auf Länge> 0 scheint optional.
Eugene
Dies liegt daran, dass er sagte "Entfernen Sie den Fehler, sobald der EditText nicht leer ist". Wenn Sie diesen Test nicht durchführen, wird der Fehler des leeren Felds entfernt, wenn der Benutzer ein Zeichen eingibt und es löscht.
Jan Ziesse
3

Wenn Sie die Fehlermeldung auf eine Weise ausblenden möchten, wenden Sie onclicklistener auf das Bearbeitungsfeld an und dann

editTextName.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            editTextName.setError(Null)
        }
    });
Ayush Bagaria
quelle
23
Großbuchstaben verletzen meine Augen! aber im Ernst ... du solltest es editTextNamestattdessen versuchen .
fernandohur
Dies funktioniert nur, wenn der Benutzer das EditTextnamegenau auf seiner Linie berührt ... Weniger Chance, dass dies passiert. (Oh, dieser Name bringt mich zum Erbrechen !!!!!)
SREE
2

Der folgende Code hat bei mir funktioniert

@OnTextChanged(
            value = R.id.editTextName,
            callback = OnTextChanged.Callback.TEXT_CHANGED)
    public void afterInput(CharSequence sequence) {
        editTextName.setError(null);
        editTextName.setErrorEnabled(false);
    }

'

editTextName.setError(null) Löscht die Fehlermeldung.

editTextName.setErrorEnabled(false) Entfernt zusätzliche Polster.

Rissmon Suresh
quelle
1
Eine vollständige Erklärung zur Verwendung von Butter Knife finden Sie hier .
XME
0

Fügen Sie Ihrem EditText und onError einen TextWatcher hinzu, und zeigen Sie Ihre Fehlermeldung an. Andernfalls et.setError(errorMessage)können Sie die Fehlermeldung und das Fehlersymbol wie unten entfernen.

// to remove the error message in your EditText
et.setError(null);

// to remove the error icon from EditText.
et.setCompoundDrawables(null, null, null, null);
SureshCS50
quelle