Vor Honeycomb (Android 3) wurde jede Aktivität registriert, um Schaltflächenklicks über das onClick
Tag in der XML-Datei eines Layouts zu verarbeiten:
android:onClick="myClickMethod"
Innerhalb dieser Methode können Sie view.getId()
eine switch-Anweisung verwenden, um die Schaltflächenlogik auszuführen.
Mit der Einführung von Honeycomb zerlege ich diese Aktivitäten in Fragmente, die in vielen verschiedenen Aktivitäten wiederverwendet werden können. Das meiste Verhalten der Schaltflächen ist aktivitätsunabhängig, und ich möchte, dass sich der Code in der Fragmentdatei befindet, ohne die alte (vor 1.6) Methode zum Registrieren der OnClickListener
für jede Schaltfläche zu verwenden.
final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
}
});
Das Problem ist, dass beim Aufblasen meines Layouts immer noch die Hosting-Aktivität die Schaltflächenklicks erhält, nicht die einzelnen Fragmente. Gibt es einen guten Ansatz für beide
- Registrieren Sie das Fragment, um die Schaltflächenklicks zu erhalten?
- Übergeben Sie die Klickereignisse aus der Aktivität an das Fragment, zu dem sie gehören.
quelle
setOnClickListener
undfindViewById
für jede Schaltfläche wurde deshalbonClick
hinzugefügt, um die Dinge einfacher zu machen.Antworten:
Sie könnten dies einfach tun:
Aktivität:
Fragment:
Als Antwort auf @Ameen, der weniger Kopplung wollte, sind Fragmente wiederverwendbar
Schnittstelle:
Aktivität:
Fragment:
quelle
Ich bevorzuge die Verwendung der folgenden Lösung für die Behandlung von onClick-Ereignissen. Dies funktioniert auch für Aktivitäten und Fragmente.
quelle
Das Problem, denke ich, ist, dass die Ansicht immer noch die Aktivität ist, nicht das Fragment. Die Fragmente haben keine eigene unabhängige Ansicht und sind an die Ansicht der übergeordneten Aktivitäten angehängt. Deshalb endet das Ereignis in der Aktivität, nicht im Fragment. Es ist unglücklich, aber ich denke, Sie werden Code brauchen, damit dies funktioniert.
Während der Konvertierungen habe ich einfach einen Klick-Listener hinzugefügt, der den alten Ereignishandler aufruft.
zum Beispiel:
quelle
Ich habe dieses Problem kürzlich gelöst, ohne der Kontextaktivität eine Methode hinzufügen oder OnClickListener implementieren zu müssen. Ich bin mir nicht sicher, ob es auch keine "gültige" Lösung ist, aber es funktioniert.
Beyogen auf: https://developer.android.com/tools/data-binding/guide.html#binding_events
Dies kann mit Datenbindungen erfolgen: Fügen Sie einfach Ihre Fragmentinstanz als Variable hinzu, und Sie können eine beliebige Methode mit onClick verknüpfen.
Und der Fragmentverknüpfungscode wäre ...
quelle
android:name="fragment" android:type="com.example.testapp.fragments.CustomFragment"/>
name
undtype
desvariable
Tags sollten nicht dasandroid:
Präfix haben. Vielleicht gibt es eine alte Version von Android-Layouts, die dies erfordert?ButterKnife ist wahrscheinlich die beste Lösung für das Problem der Unordnung. Es verwendet Anmerkungsprozessoren, um den so genannten Boilerplate-Code der "alten Methode" zu generieren.
Die onClick-Methode kann jedoch weiterhin mit einem benutzerdefinierten Inflator verwendet werden.
Wie benutzt man
Implementierung
quelle
Ich würde mich lieber für die Klickbehandlung im Code entscheiden, als das
onClick
Attribut in XML zu verwenden, wenn ich mit Fragmenten arbeite.Dies wird noch einfacher, wenn Sie Ihre Aktivitäten in Fragmente migrieren. Sie können den Click-Handler (zuvor
android:onClick
in XML festgelegt) direkt von jedemcase
Block aus aufrufen .Wenn es darum geht, Klicks in Fragmenten zu verarbeiten, sieht das für mich einfacher aus als
android:onClick
.quelle
Dies ist ein anderer Weg:
1.Erstellen Sie ein BaseFragment wie folgt:
2.Verwenden
anstatt
3.In Ihrer Tätigkeit:
und
Ich hoffe es hilft.
quelle
In meinem Anwendungsfall habe ich 50 ungerade ImageViews, die ich zum Einbinden in eine einzelne onClick-Methode benötigte. Meine Lösung besteht darin, die Ansichten innerhalb des Fragments zu durchlaufen und für jeden den gleichen On-Click-Listener festzulegen:
quelle
Wie ich Antworten sehe, sind sie irgendwie alt. Kürzlich Google vorstellen Databinding , die viel einfacher zu handhaben onClick oder Zuweisung in Ihrem xml.
Hier ist ein gutes Beispiel, wie Sie damit umgehen können:
Es gibt auch sehr schön Tutorial über Databinding Sie sie finden können hier .
quelle
Sie können einen Rückruf als Attribut Ihres XML-Layouts definieren. Der Artikel Benutzerdefinierte XML-Attribute für Ihre benutzerdefinierten Android-Widgets zeigt Ihnen, wie Sie dies für ein benutzerdefiniertes Widget tun. Gutschrift geht an Kevin Dion :)
Ich untersuche, ob ich der Basisfragmentklasse stilbare Attribute hinzufügen kann.
Die Grundidee besteht darin, dieselbe Funktionalität zu haben, die View beim Umgang mit dem onClick-Rückruf implementiert.
quelle
Hinzufügen zu Blundells Antwort:
Wenn Sie mehr Fragmente haben, mit vielen onClicks:
Aktivität:
In deinem Fragment:
quelle
Wenn Sie sich mit android in Onml registrieren: Onclick = "", wird die respektierte Aktivität zurückgerufen, zu deren Kontext Ihr Fragment gehört (getActivity ()). Wenn eine solche Methode in der Aktivität nicht gefunden wird, löst das System eine Ausnahme aus.
quelle
Möglicherweise möchten Sie EventBus für entkoppelte Ereignisse verwenden. Sie können sehr einfach auf Ereignisse warten. Sie können auch sicherstellen, dass das Ereignis im UI-Thread empfangen wird (anstatt runOnUiThread .. für jedes Ereignisabonnement selbst aufzurufen).
https://github.com/greenrobot/EventBus
von Github:
quelle
Ich möchte die Antwort von Adjorn Linkz ergänzen .
Wenn Sie mehrere Handler benötigen, können Sie einfach Lambda-Referenzen verwenden
Der Trick dabei ist, dass
handler
die Signatur der Methode mit der Signatur übereinstimmtView.OnClickListener.onClick
. Auf diese Weise benötigen Sie dieView.OnClickListener
Schnittstelle nicht.Außerdem benötigen Sie keine switch-Anweisungen.
Leider ist diese Methode nur auf Schnittstellen beschränkt, für die eine einzelne Methode oder ein Lambda erforderlich ist.
quelle
Obwohl ich einige nette Antworten gefunden habe, die sich auf die Datenbindung stützen, habe ich bei diesem Ansatz keine vollständigen Antworten gesehen - im Sinne einer Aktivierung der Fragmentauflösung bei gleichzeitiger Berücksichtigung fragmentfreier Layoutdefinitionen in XMLs.
Vorausgesetzt also Datenbindung ist aktiviert, ist hier eine generische Lösung , die ich vorschlagen kann; Ein bisschen lang, aber es funktioniert definitiv (mit einigen Einschränkungen):
Schritt 1: Benutzerdefinierte OnClick-Implementierung
Dadurch wird eine fragmentbezogene Suche in Kontexten ausgeführt, die mit der angeklickten Ansicht verknüpft sind (z. B. Schaltfläche):
Schritt 2: Deklarative Anwendung in Layoutdateien
Dann in datenbindungsbewussten XMLs:
Vorsichtsmaßnahmen
FragmentActivity
Implementierung anquelle
Das hat bei mir funktioniert: (Android Studio)
quelle
Beste Lösung IMHO:
im Fragment:
dann in Fragment's onViewStateRestored:
quelle
Ihre Aktivität erhält den Rückruf wie folgt:
Wenn Sie möchten, dass Ihr Fragment einen Rückruf erhält, gehen Sie folgendermaßen vor:
und
onClickListener
Schnittstelle auf Fragment implementierenquelle