Ich habe drei EditText
Widgets in meinem Ansichtslayout. Gibt es eine Möglichkeit, TextWatcher
für alle drei eine einzige zu verwenden?EditTexts
?
android
textwatcher
bie
quelle
quelle
Antworten:
Ich bin gerade auf dieses Problem gestoßen. Ich habe es gelöst, indem ich eine Implementierung der inneren Klasse erstellt habe
TextWatcher
, die eine Ansicht als Argument verwendet. Schalten Sie dann in der Methodenimplementierung einfach die Ansicht ein, um zu sehen, von welcher dieEditable
stammtErklärung:
Verwendung:
quelle
Single TextWatcher for multiple EditTexts
. Es sind 3 Instanzen einer TextWatcher-Klasse. 3 separate TextWatcher steuern also 3 EditTexts.Wenn Sie nur afterTextChanged verwenden möchten, vergleichen Sie die bearbeitbaren Dateien:
quelle
==
anstelle von verwenden.equals()
.MultiTextWatcher-Implementierung
Verwendung
quelle
TextView
die Veränderung kommt.Wenn Sie onTextChanged verwenden möchten, vergleichen Sie
hashCode()
die unten genannten -Oder
Wenn Sie afterTextChanged verwenden möchten, vergleichen Sie
Editable
die unten genannten -quelle
Es wird mit diesem Code funktionieren
Fügen Sie dies dann in oncreate hinzu
quelle
Ich weiß, dass dies ein altes Problem ist und es die richtige Entscheidung gibt. Ich werde ihre eigenen schreiben, vielleicht hilft es jemandem.
Emulieren Sie das klassische Beispiel, in dem wir N EditText haben, und wir möchten die Schaltfläche anzeigen, wenn alle Felder ausgefüllt sind. Dieses Beispiel ist sinnvoll, insbesondere wenn für jeden weitere Validatoren verwendet werden.
Ich habe ein Beispiel in Bezug auf das Problem gemacht, aber Sie können jeden Satz machen
MultiEditText.class
Es sieht jetzt sehr einfach aus
CustomTextWatcher.class
Ich werde ein Layout hinzufügen, damit Sie keine Zeit verschwenden
multi_edit_text.xml
quelle
Lassen Sie Ihre Klasse von Activity erben und implementieren Sie TextWatcher.
Dann müssen Sie durch die Magie des Polymorphismus nur noch die Ereignisse abonnieren.
Dies sagt Ihnen nicht, was TextEdit geändert hat, aber wenn Sie eine Kombination aus dieser und der Antwort von Sky Kelsey verwenden , können Sie das gut klären.
quelle
Dann:
quelle
quelle
Dies ist meine Lösung für Kotlin. Sie können einfach die referenzielle Gleichheit (===) verwenden, um dasselbe Objekt zu überprüfen, und es funktioniert einwandfrei.
quelle
Ich weiß, dass diese Frage alt ist, aber ich wollte eine meiner Lösungen (in Kotlin) teilen. Meine Lösung ist eine Verbesserung der Antwort von @Shwarz Andrei. Mein Grund war, wenn Sie mehr Dinge / Objekte manipulieren wollten.
Anstatt beide
list of EditTexts
unda Button
als Parameter zu übergeben, würden Sie nur Ihre übergebenlist of editText
. Dann würden Sie in Ihrer benutzerdefinierten Klasse ein Lambda implementieren, z.Dann setzen oder heben Sie es in der
afterTextChanged
quelle
So habe ich es gemacht:
Erstellen Sie eine ArrayList von EditTexts und verwenden Sie dann eine for-Schleife, um den TextWatcher für alle EditTexts anzuwenden. Wenn Sie ein Verhalten für alle editTexts haben, wenden Sie es einfach dort an. Wenn Sie bestimmte Verhaltensweisen für bestimmte editTexts festlegen, können Sie ein if verwenden Anweisung zum Auswählen und Anwenden auf einzelne editTexts.
Hier ist mein Code:
Hoffe das hilft
quelle
onTextChanged
ziemlich kompliziert für etwas, das so häufig ist wie auf einem EditText. Das Hinzufügen einesonFocusChange
für mehrere Widgets ist viel einfacher, da das Absenderobjekt mit dem Methodenaufruf übergeben wurde. Anschließend können Sie untersuchen, welches Objekt den Aufruf ausgelöst hat, und ihn von dort aus bearbeiten.