Ich habe eine solide Erfahrung im Nicht-Java- und Nicht-Android-Bereich und lerne Android.
Ich habe viel Verwirrung mit verschiedenen Bereichen, einer davon ist der Umgang mit Tastenklicks. Es gibt mindestens 4 Art und Weise zu tun , dass (!!!), sie kurz sind aufgelistet hier
Aus Konsistenzgründen werde ich sie auflisten:
Haben Sie ein Mitglied der
View.OnClickListener
Klasse in der Aktivität und weisen Sie es einer Instanz zu, die dieonClick
Logik in deronCreate
Aktivitätsmethode verarbeitet.Erstellen Sie 'onClickListener' in der Aktivitätsmethode 'onCreate' und weisen Sie es der Schaltfläche mit setOnClickListener zu
Implementieren Sie 'onClickListener' in der Aktivität selbst und weisen Sie 'this' als Listener für die Schaltfläche zu. Für den Fall, dass die Aktivität nur wenige Schaltflächen enthält, sollte die Schaltflächen-ID analysiert werden, um den 'onClick'-Handler für die richtige Schaltfläche auszuführen
Verfügen Sie über eine öffentliche Methode für die Aktivität, die die 'onClick'-Logik implementiert, und weisen Sie sie der Schaltfläche in der Aktivitäts-XML-Deklaration zu
Frage 1:
Sind das alles Methoden, gibt es eine andere Option? (Ich brauche keine andere, nur neugierig)
Für mich wäre der intuitivste Weg der neueste: Er erfordert die geringste Menge an Code und ist am besten lesbar (zumindest für mich).
Ich sehe diesen Ansatz jedoch nicht weit verbreitet. Was sind die Nachteile für die Verwendung?
Frage 2:
Was sind Vor- und Nachteile für jede dieser Methoden? Bitte teilen Sie entweder Ihre Erfahrungen oder einen guten Link.
Jedes Feedback ist willkommen!
PS Ich habe versucht, bei Google etwas für dieses Thema zu finden, aber die einzigen Dinge, die ich gefunden habe, sind die Beschreibung "wie", nicht warum es gut oder schlecht ist.
onCreate()
, was nicht sehr lang ist. Die Click-Listener-Zuweisungen und die anonymen Klassen können in eine separate Hilfsmethode zerlegt werden, von der aus aufgerufen wirdonCreate()
.# 1 Ich benutze die letzte häufig, wenn Schaltflächen im Layout nicht generiert werden (aber offensichtlich statisch).
Wenn Sie es in der Praxis und in einer Geschäftsanwendung verwenden, achten Sie hier besonders darauf, denn wenn Sie Quell-Obfuscater wie ProGuard verwenden, müssen Sie diese Methoden in Ihrer Aktivität als nicht verschleiert markieren.
Schauen Sie sich Android Lint ( Beispiel ) an, um mit diesem Ansatz eine Art Sicherheit zur Kompilierungszeit zu archivieren .
# 2 Vor- und Nachteile für alle Methoden sind fast gleich und die Lektion sollte sein:
Wenn Sie dasselbe
OnClickListener
mehreren Instanzen von Schaltflächen zuweisen müssen , speichern Sie es im Klassenbereich (Nr. 1). Wenn Sie einen einfachen Listener für einen Button benötigen, führen Sie eine anonyme Implementierung durch:Ich neige dazu, das
OnClickListener
in der Aktivität nicht zu implementieren , dies wird von Zeit zu Zeit etwas verwirrend (insbesondere wenn Sie mehrere andere Event-Handler implementieren und niemand weiß, wasthis
alles tut).quelle
Ich bevorzuge Option 4, aber es macht für mich intuitiv Sinn, weil ich viel zu viel in Grails, Groovy und JavaFX arbeite. "Magische" Verbindungen zwischen der Ansicht und dem Controller sind allen gemeinsam. Es ist wichtig, die Methode gut zu benennen:
Fügen Sie in der Ansicht die onClick-Methode zur Schaltfläche oder einem anderen Widget hinzu:
Behandeln Sie dann in der Klasse die Methode:
Nennen Sie die Methode wieder klar, was Sie sowieso tun sollten, und die Wartung wird zur Selbstverständlichkeit.
Ein großer Vorteil ist, dass Sie jetzt Unit-Tests für die Methode schreiben können. Option 1 kann dies tun, aber 2 und 3 sind schwieriger.
quelle
Am häufigsten wird eine anonyme Erklärung verwendet
Sie können auch das View.OnClickListener-Objekt erstellen und es später auf die Schaltfläche setzen. Sie müssen jedoch beispielsweise die onClick-Methode weiterhin überschreiben
Wenn Ihre Aktivität die OnClickListener-Schnittstelle implementiert, müssen Sie die onClick (View v) -Methode auf Aktivitätsebene überschreiben. Anschließend können Sie diese Aktivität als Listener für die Schaltfläche zuweisen, da sie bereits die Schnittstelle implementiert und die onClick () -Methode überschreibt
(imho) 4. Ansatz, der verwendet wird, wenn mehrere Schaltflächen denselben Handler haben und Sie eine Methode in der Aktivitätsklasse deklarieren und diese Methode mehreren Schaltflächen im XML-Layout zuweisen können. Sie können auch eine Methode für eine Schaltfläche erstellen, aber in diesem Fall I. deklarieren Sie lieber Handler innerhalb der Aktivitätsklasse.
quelle
Option 1 und 2 beinhalten die Verwendung einer inneren Klasse, die den Code durcheinander bringt. Option 2 ist etwas chaotisch, da es für jede Taste einen Listener gibt. Wenn Sie eine kleine Anzahl von Tasten haben, ist dies in Ordnung. Für Option 4 wird dies meiner Meinung nach schwieriger zu debuggen sein, da Sie zurückgehen und den XML- und Java-Code vierteln müssen. Ich persönlich verwende Option 3, wenn ich mit mehreren Tastenklicks umgehen muss.
quelle
Mein Beispiel, getestet in Android Studio 2.1
Schaltfläche im XML-Layout definieren
Java-Pulsationserkennung
quelle
Zur Vereinfachung der Frage 2 können Sie die Lambda-Methode wie diese verwenden, um variablen Speicher zu sparen und das Navigieren in Ihrer Ansichtsklasse nach oben und unten zu vermeiden
Wenn Sie jedoch in einer Methode das Klickereignis sofort auf Ihre Schaltfläche anwenden möchten.
Sie können Frage 3 von @D verwenden. Tran Antwort. Vergessen Sie jedoch nicht, Ihre Ansichtsklasse mit zu implementieren
View.OnClickListener
.In anderen, um Frage 3 richtig zu verwenden
quelle
Frage 1 - Dies ist die einzige Möglichkeit, mit Ansichtsklicks umzugehen.
Frage 2 -
Option 1 / Option 4 - Es gibt keinen großen Unterschied zwischen Option 1 und Option 4. Der einzige Unterschied, den ich sehe, besteht in einem Fall darin, den OnClickListener zu implementieren, während in dem anderen Fall eine anonyme Implementierung erfolgt.
Option 2 - Bei dieser Methode wird eine anonyme Klasse generiert. Diese Methode ist etwas umständlich, da Sie sie mehrmals ausführen müssen, wenn Sie mehrere Schaltflächen haben. Bei anonymen Klassen müssen Sie vorsichtig mit Speicherlecks umgehen.
Option 3 - Dies ist jedoch ein einfacher Weg. Normalerweise versuchen Programmierer, keine Methode zu verwenden, bis sie sie schreiben, und daher ist diese Methode nicht weit verbreitet. Sie werden sehen, dass die meisten Leute Option 4 verwenden. Weil es in Bezug auf Code sauberer ist.
quelle
Es gibt auch Optionen in Form verschiedener Bibliotheken, die diesen Prozess Personen, die andere MVVM-Frameworks verwendet haben, sehr vertraut machen können.
https://developer.android.com/topic/libraries/data-binding/
Zeigt ein Beispiel einer offiziellen Bibliothek, mit der Sie Schaltflächen wie folgt binden können:
quelle
Schritt 1: Erstellen Sie eine XML-Datei:
Schritt 2: Erstellen Sie MainActivity:
HappyCoding!
quelle