Wohin mit dem Code? In die Activity oder in die Fragment Klasse?

  • Hallo zusammen,


    irgendwie verstehe ich die Sache mit den Fragments noch nicht so richtig.


    Mal angenommen, ich habe eine Activity welche zwei Fragments darstellt.
    Ein Fragment enthält einen Button das andere ein TextView.
    Um zu erreichen dass, das TextView seinen Text ändert wenn man
    auf den Button klickt habe ich bis jetzt zwei Möglichkeiten gefunden:


    1. alles in die Activity Klasse zu schreiben und dort auch auf OnClick zu reagieren.
    ungefähr so:


    oder 2. alles in die Fragment Klassen zu packen und mit Callbacks zu arbeiten.


    Welche Variante ist besser? Im Netz findet man beide Varianten.
    Die erste Variante ist deutlich einfacher und kürzer. Aber ich habe das
    Gefühl, dass die zweite Variante irgendwie korrekter ist.


    oder 3. ich habe alles total falsch verstanden ?( und es gibt noch einen eleganteren besseren Weg.


    Gruß Marcel

  • Also grundsätzlich für diesen speziellen Fall: gar nicht.
    Es ist eigentlich nicht im Sinne der User Experience, wenn man auf einem Fragment einen Button drückt der auf einem anderen Fragment die Darstellung verändert.
    Aber ich denke mal, Du machst das symbolisch beispielsweise als Navigationselement links und Contentarea rechts.


    Wie dem auch sei, Dir fehlt scheinbar noch eine ganz wichtige Verständniskomponente für die Fragmente.
    Mit den Fragmenten kannst Du User Interfaces unterschiedlich zusammen bauen, ohne dass Du die Logik mehrfach implementieren musst.


    Am Liebsten wird das für die Unterscheidung Tablet - Phone genutzt.


    TabletLayout wäre dann sinngemäß


    Und das PhoneLayout wäre ungefähr


    Du siehst also: auf dem Tablet präsentiert eine Activity zwei Fragmente, auf dem Phone präsentieren hingegen zwei Activities jeweils ein Fragment.


    Insofern wird die Sache hoffentlich etwas klarer: die Activity sollte immer die Interaktion zwischen den Fragmenten steuern. Denn die Fragmente selbst wissen im Allgemeinen überhaupt nichts voneinander. Die Activity hingegen weiß alles von den Fragmenten, da sie diese ja anzeigt.


    Der komplett richtige Weg wäre also:
    • Dein Button-Fragment implementiert die OnClick für den Button. (Das Fragment verwaltet ALLE seine UI Elemente selbst – dafür ist es da.)
    • Dein Button-Fragment speichert sich eine Referenz auf die aufrufende Activity, welche ein paar Callbacks definiert. (onAttach() im Fragment gibt einen Parameter auf die Activity mit, welche Du casten kannst.)
    • Deine OnClick Implementierung für den Button ruft irgendwann besagtes Callback der Activity auf.
    • Die Activity regelt dann den Rest.
    Pro-Tipp:
    • Definiere für die Callbacks ein ButtonClickCallbackInterface.


    Wenn Du nun eine 1-Activity-Tablet-Lösung hast, dann wird in dieser Callback-Methode Deiner einen Activity das andere Fragment entsprechend bearbeitet.
    (Hier also: eine Methode aufgerufen, die den Text des TextView ändert. Im Navigationsfall: das Fragment gegen ein Anderes austauschen)
    Wenn Du eine 2-Activity-Phone-Lösung hast, dann wird in dieser Callback-Methode Deiner ersten Activity alles für den Aufruf der zweiten Activity vorbereitet, der zu setzende Text übergeben und die zweite Activity setzt dann den Text im TextEdit des Fragments auf den gewünschten Wert.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Marco,


    das war ja eine richtig klasse Erklärung, nun habe ich es verstanden (glaube ich jedenfalls).


    Wenn man hin und wieder ein paar Hintergründe erfährt, warum dieses und jenes genau so
    und nicht anders gemacht werden sollte, fällt einem das Verständnis dafür gleich viel leichter.


    Vielen Dank


    Gruß Marcel


    PS: Das Beispiel mit dem Button und dem TextView war tatsächlich nur als Beispiel gedacht.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!