Navigation Tabs - Best practices

  • Hi,


    ich habe ein Standard Navigation Tabs Layout (welches mir android studio ja out-of-the-box erstellt)


    Ich habe mich dann mit diesem Layout beschäftigt an folgender Stelle wird ein PlaceholderFragment instanziiert:



    Java
    @Override
            public Fragment getItem(int position) {
                // getItem is called to instantiate the fragment for the given page.
                // Return a PlaceholderFragment (defined as a static inner class below).
                return PlaceholderFragment.newInstance(position + 1);
            }



    innerhalb dessen wird dann eine view mit dem fragment_main-layout erstellt und je nach page der jeweilige text gesetzt



    Java
    @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_main, container, false);
                TextView textView = (TextView) rootView.findViewById(R.id.section_label);
                textView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));
                return rootView;
            }


    jetzt hätte ich dazu ein paar Fragen:
    1. warum geht man den Umweg über den PlaceholderFragment?
    2. Ist dieser weg Best-Pratice? D.h. sollte ich bei den Tabs jeweils auf ein Fragment (bzw. auf den Placeholder) verweisen oder macht es evtl. mehr Sinn eine neue Activity zu starten? So müsste ich nicht den Ganzen Code für jede Tab in der MainActivity mitschleppen und hätte eine saubere Trennung!
    3. Android ist geil :)


    Danke!


    Gruß

  • 1) Damit Du siehst wie es gemacht wird. Der Sinn hinter den Navigation Tabs ist es, dass mit Fragmenten gearbeitet wird. So kannst Du ein und dieselbe Ansicht in unterschiedlichen Programmabschnitten immer und immer wieder verwenden. Bevor es Fragmente gab war das ein unglaublich nerviges Gefrickel.
    Das Ding heißt nur 'Placeholder' und tut nix Sinnvolles, da Android Studio ja nicht wissen kann, was das Fragment jetzt genau tun soll.
    Vermutlich liegt das nur der Übersicht halber im Code der Main Activity. Eigene Fragmente gehören meiner Auffassung nach in eigene Klassen.


    2) Leg Dir um Himmels Willen Fragmente an und nimm so wenig Activities wie möglich (und so viele wie nötig.)
    Zur sauberen Trennung sei gesagt: niemand zwingt Dich, jedes einzelne Fragment als interne Klasse deiner Activity zu nutzen. Das ist sogar ausgesprochen kontraproduktiv.
    Ein Fragment = eine Klasse hat sich bewährt.


    Also: Fragments sind Best Practice, Fragments als eigene Klassen innerhalb der Activity sind Mumpitz.


    3) Kann man so und so sehen. ^^

    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!«

  • eine kleine Frage hat sich jetzt noch ergeben.
    Ich hab jetzt die Tabs auf jeweils ein neues Fragment verwiesen (in der MainActivity)



    wenn ich jetzt aber einen Button in einem Fragment definieren, muss der onClick-Listener ja Standardmäßig in der Acitvity registriert werden.
    Ich hab es jetzt so gelöst, damit ich die Buttons der Fragmente unabhängig von der Activity halten kann.



    leider kann ich so den buttons in der layout-ansicht keinen onClick listener mehr zuweisen, da dieser immer in der MainActivity sucht. Aber so funktioniert es.


    Jetzt zur Frage. Kann man das so lassen oder schaufle ich mir hier mein eigenes Grab?


    Edit: Mir war bis vorhin noch nicht bewusst, dass die Navigation Tabs swipe optimiert sind und nicht onClick geladen werden (sondern immer das nächste Tab auch noch)


    Jetzt habe ich allerdings das Problem, das ich innerhalb einer Tab (bspw. Tab 3) das Fragment verändere (bspw. TextView ändern) switche ich jetzt zu 2 und wieder zurück ist die testview unverändert. Switche ich zu 1 und dann wieder 3 ist die textview wieder im ursprungszustand... soweit so gut und verstanden.


    Aber wenn ich in jedem der 3 Fragmente Änderungen habe und diese bei Tabwechsel verwerfen möchte, frage ich mich gerade ob die navigation tabs überhaupt das richtige widget für diese Aktion sind?


    Danke!

  • Jetzt habe ich allerdings das Problem, das ich innerhalb einer Tab (bspw. Tab 3) das Fragment verändere (bspw. TextView ändern) switche ich jetzt zu 2 und wieder zurück ist die testview unverändert. Switche ich zu 1 und dann wieder 3 ist die textview wieder im ursprungszustand... soweit so gut und verstanden.


    Ja. So lange Dein Tab noch im Speicher ist sind alle Änderungen drin.
    Sobald es rausfliegt (also nicht mehr direkt neben dem angezeigten Tab liegt) muss es danach neu geladen werden und Deine Änderungen sind weg.


    Aber wenn ich in jedem der 3 Fragmente Änderungen habe und diese bei Tabwechsel verwerfen möchte, frage ich mich gerade ob die navigation tabs überhaupt das richtige widget für diese Aktion sind?


    Klar.
    Dein Fragment hat genau wie Deine Activity einen Lebenszyklus.
    Wenn es den Fokus verliert, wird es pausiert. Also die onPause() Methode wird aufgerufen.
    Dort kannst Du dann alle gemachten Änderungen verwerfen, beispielsweise in dem Du den Textfeldern ein setText(""); sendest.

    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!«

  • Laut Dokumentation:

    Zitat

    The system calls this method as the first indication that the user is leaving the fragment (though it does not always mean the fragment is being destroyed).


    Das liest sich für mich halt so, dass es aufgerufen wird, sobald das Ding seinen Fokus verliert.

    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!«

Jetzt mitmachen!

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