Ich habe eine Situation, in der es zwei Felder gibt. field1
und field2
. Ich möchte nur leer sein, field2
wenn field1
es geändert wird und umgekehrt. Am Ende enthält also nur ein Feld Inhalt.
field1 = (EditText)findViewById(R.id.field1);
field2 = (EditText)findViewById(R.id.field2);
field1.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) {
field2.setText("");
}
});
field2.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) {
field1.setText("");
}
});
Es funktioniert gut , wenn ich anhängen addTextChangedListener
zu field1
nur, aber wenn ich es für beide Felder die App abstürzt. Offensichtlich, weil sie versuchen, sich auf unbestimmte Zeit zu verändern. Sobald field1
Änderungen, die field2
in diesem Moment gelöscht werden,
field2
geändert werden, wird sie gelöscht field1
und so weiter ...
Kann jemand eine Lösung vorschlagen?
starting waiting blocking gc alloc
diese Art von Fehler verursachen, der sogar zum Absturz und zum Hängen führen kann sicher und jetzt von google empfohlen ..Antworten:
Sie können ein Häkchen hinzufügen, um nur zu löschen, wenn der Text im Feld nicht leer ist (dh wenn die Länge von 0 abweicht).
Dokumentation für
TextWatcher
hier .Bitte beachten Sie auch die Namenskonventionen .
quelle
Ich weiß, dass dies alt ist, aber eines Tages könnte jemand wieder darauf stoßen.
Ich hatte ein ähnliches Problem, bei dem ich setText für einen EditText aufrief und onTextChanged aufgerufen wurde, wenn ich es nicht wollte. Meine erste Lösung bestand darin, nach dem Aufruf von setText () Code zu schreiben, um den vom Listener verursachten Schaden rückgängig zu machen. Das war aber nicht sehr elegant. Nach einigen Recherchen und Tests stellte ich fest, dass mit getText (). Clear () der Text auf die gleiche Weise wie mit setText ("") gelöscht wird, aber da der Text nicht festgelegt wird, wird der Listener nicht aufgerufen löste mein Problem. Ich habe alle meine setText ("") - Aufrufe auf getText (). Clear () umgestellt und brauchte die Bandagen nicht mehr. Vielleicht löst das auch Ihr Problem.
Versuche dies:
quelle
Wenn Sie Kotlin für die Android-Entwicklung verwenden, können Sie Folgendes hinzufügen
TextChangedListener()
:quelle
Eine etwas späte Antwort, aber hier ist eine wiederverwendbare Lösung:
Wenn also das oben
setText()
Gesagte verwendet wird, führen Aufrufe im TextWatcher nicht dazu, dass der TextWatcher erneut aufgerufen wird:quelle
Ich habe auch das gleiche Problem und bekomme immer wieder
stackOverflow
Ausnahmen, und ich komme mit der folgenden Lösung.anfangs deklariert boolean skipOnChange = false;
quelle
Sie können auch die Methode hasFocus () verwenden:
Ich habe dies für eine College-Aufgabe getestet, an der ich gearbeitet habe, um Temperaturskalen während der Eingabe durch den Benutzer zu konvertieren. Hat perfekt funktioniert und ist viel einfacher.
quelle
Überprüfen Sie den String, bevor Sie einen anderen
EditText
auf leer setzen. WennField1
es leer ist, warum muss es dann wieder auf ("") geändert werden? So können Sie die Größe Ihres Strings mit s.lenght () oder einer anderen Lösung überprüfenEine andere Möglichkeit, die Länge von String zu überprüfen, ist:
quelle
Ich habe meine eigene Erweiterung dafür geschrieben, sehr hilfreich für mich. (Kotlin)
Sie können nur so schreiben:
Meine Erweiterung:
quelle
In diesem Code sind noteid im Grunde genommen Argumente, die zurückgenommen werden und in den Einzug eingefügt oder durch den Einzug geleitet werden.
Der Code auf der Unterseite ist im Grunde der zusätzliche Code, wenn Sie klarer verstehen wollen.
neuer Aktivitätscode mit dem Namen NoteEditor.java zu Bearbeitungszwecken. Meine App ist im Grunde die Notiz-App.
quelle
Verwenden Sie in Kotlin einfach die KTX-Erweiterungsfunktion : (Es wird verwendet
TextWatcher
)Import
core-KTX
:quelle
Wir können den TextWatcher für ein Feld unmittelbar vor der Bearbeitung des Texts entfernen und ihn nach der Bearbeitung des Textes wieder hinzufügen.
Deklarieren Sie Text Watchers für Feld1 und Feld2 als separate Variablen, um ihnen einen Namen zu geben: z. B. für Feld1
Fügen Sie dann den Watcher mit seinem Namen hinzu:
field1.addTextChangedListener(Field_1_Watcher)
für Feld1 undfield2.addTextChangedListener(Field_2_Watcher)
für Feld2Entfernen Sie vor dem Ändern des Feld2- Textes den TextWatcher:
field2.removeTextChangedListener(Field_2_Watcher)
Ändern Sie den Text:field2.setText("")
Fügen Sie dann den TextWatcher wieder hinzu:
field2.addTextChangedListener(Field_2_Watcher)
Machen Sie dasselbe für das andere Feld
quelle
Fügen Sie Hintergrund dynamisch in
onCreate
Methode hinzu:Entfernen Sie auch den Hintergrund aus XML.
quelle