Mir ist klar, dass zuvor eine ähnlich formulierte Frage gestellt wurde, aber das ist anders. Ich bin ziemlich neu in der Entwicklung von Android-Apps und habe drei Fragen zu den Unterschieden zwischen dem android:onclick=""
XML-Attribut und der setOnClickListener
Methode.
Was sind die Unterschiede zwischen den beiden? Liegt der Unterschied zwischen den beiden Implementierungen zur Kompilierungs- oder Laufzeit oder bei beiden?
Welche Anwendungsfälle sind für welche Implementierung günstig?
Welchen Unterschied macht die Verwendung von Fragmenten in Android bei der Auswahl der Implementierung?
android
xml
performance
android-fragments
KG6ZVP
quelle
quelle
onclick
da Sie sicherstellen müssen, dass jede Klasse diese Methode implementiert. Dies setzt voraus, dass Sie das Layout mehrmals verwenden. Wenn Sie jedoch eine Java-Schnittstelle hätten, um sicherzustellen, dass die Methode in allen Klassen vorhanden ist, die sie implementiert haben, müssen Sie sich keine Sorgen machen.android:onclick
wenn es bequem ist, aber ich weiß, dass es manchmal Probleme verursacht hat, und ich kann mich auch nicht daran erinnern :)Antworten:
Unterschied zwischen OnClickListener und OnClick:
Beide funktionieren auf die gleiche Weise, nur dass einer über Java-Code und der andere über XML-Code festgelegt wird.
Implementierung des setOnClickListener-Codes:
XML-Implementierung:
Performance:
Beide sind in der Leistung gleich. XML wird beim Kompilieren in Binärcode vorab analysiert. Es gibt also keinen Overhead in Xml.
Einschränkung:
android: onClick ist ab API-Level 4 verfügbar. Wenn Sie also auf <1,6 abzielen, können Sie es nicht verwenden.
quelle
Ich bin schockiert, dass niemand darüber gesprochen hat, aber seien Sie vorsichtig, obwohl
android:onClick
XML eine bequeme Möglichkeit zu sein scheint, mit Klicks umzugehen, macht diesetOnClickListener
Implementierung etwas Zusätzliches als das Hinzufügen vononClickListener
. In der Tat hat es die Eigenschaft viewclickable
auf true gesetzt.Während dies bei den meisten Android-Implementierungen möglicherweise kein Problem darstellt, ist die Schaltfläche laut Telefonkonstruktor standardmäßig immer klickbar = wahr, während andere Konstruktoren in einigen Telefonmodellen in Nicht-Schaltflächenansichten möglicherweise standardmäßig klickbar = falsch sind.
Das Festlegen des XML-Dokuments reicht also nicht aus. Sie müssen die ganze Zeit darüber nachdenken, eine
android:clickable="true"
Nicht-Schaltfläche hinzuzufügen. Wenn Sie ein Gerät haben, auf dem die Standardeinstellung anklickbar ist = true, und Sie einmal vergessen, dieses XML-Attribut einzufügen, werden Sie es nicht bemerken Das Problem zur Laufzeit wird aber das Feedback auf den Markt bekommen, wenn es in den Händen Ihrer Kunden liegt!Darüber hinaus können wir nie sicher sein, wie Proguard XML-Attribute und Klassenmethoden verschleiern und umbenennen wird, sodass wir nicht 100% sicher sind, dass sie eines Tages niemals einen Fehler haben werden.
Wenn Sie also nie Probleme haben und nie darüber nachdenken möchten, ist es besser,
setOnClickListener
Bibliotheken wie ButterKnife mit Anmerkungen zu verwenden@OnClick(R.id.button)
quelle
android:onClick
?Einfach:
Wenn Sie
android:onClick = "someMethod"
in XML haben , sucht espublic void someMethod
in Ihrer Aktivitätsklasse nach.OnClickListener
wird direkt von Ihrer Aktivität aufgerufen und ist mit einer bestimmten verknüpftView
. Zum BeispielsomeButton.setOnClickListener
und im folgenden Code wird gesagt, was zu tun ist, wennsomeButton
gedrückt wird.Ich hoffe es hilft :)
quelle
Wie bereits erwähnt: Beide sind eine Möglichkeit, als Reaktion auf ein Ereignis, in diesem Fall ein Klickereignis, Logik hinzuzufügen.
Ich würde eine Trennung zwischen Logik und Präsentation anstreben, genau wie wir es in der HTML / JavaScript-Welt tun: Lassen Sie das XML für die Präsentation und fügen Sie Ereignis-Listener mithilfe von Code hinzu.
quelle
Wenn Sie mehrere Schaltflächen mit nur einer Methode haben, empfehle ich, dies in Java zu tun. Wenn Sie jedoch eine Schaltfläche mit einer bestimmten Methode haben, ist onClick in XML besser.
quelle
Es ist bequemer, immer das Attribut android: onClick zu verwenden, es sei denn, Sie haben einen guten Grund, dies nicht zu tun, wenn Sie beispielsweise die Schaltfläche zur Laufzeit instanziieren oder das Klickverhalten in einer Fragment-Unterklasse deklarieren müssen.
quelle
Es gibt mehrere Gründe, warum Sie eine programmgesteuert festlegen möchten
OnClickListener
. Das erste ist, wenn Sie jemals das Verhalten Ihrer Schaltfläche ändern möchten, während Ihre App ausgeführt wird. Sie können Ihre Schaltfläche ganz auf eine andere Methode richten oder die Schaltfläche einfach deaktivieren, indem Sie eine festlegenOnClickListener
festlegen, die nichts bewirkt.Wenn Sie einen Listener mit dem definieren
onClick
Attributs definieren, sucht die Ansicht nur in ihrer Hostaktivität nach einer Methode mit diesem Namen. Durch programmgesteuertes Festlegen vonOnClickListener
können Sie das Verhalten einer Schaltfläche von einem anderen Ort als der Hostaktivität aus steuern. Dies wird sehr relevant, wenn wirFragments
Mini-Aktivitäten verwenden, mit denen Sie wiederverwendbare Sammlungen von Ansichten mit einem eigenen Lebenszyklus erstellen können, die dann zu Aktivitäten zusammengestellt werden können. Fragmente müssen immerOnClickListeners
zur Steuerung ihrer Schaltflächen verwendet werden, da sie keine Aktivitäten sind und nicht nach in onClick definierten Listenern durchsucht werden.quelle
Ich denke, der Hauptunterschied zwischen ihnen ist:
OnClick: Wenn Sie mit dem Finger auf die Schaltfläche klicken.
OnClickListner: Es kann eine größere Auswahl sein, die in verschiedenen Codes implementiert wird.
Wenn Sie beispielsweise die URL "ymail.com" eingeben, findet Yahoo Ihren Benutzernamen und Ihr Passwort in Ihrem Browser und aktiviert die Schaltfläche "Status klicken", um Ihre E-Mail zu öffnen. Diese Aktion sollte nur in onClickListener implementiert werden.
Das ist meine Idee!
quelle