Intro:
Das grundlegende Muster "Fragment-Tutorial" sieht ungefähr so aus:
- Haben Sie auf einem Tablet links eine Liste, rechts Details.
- Beide sind
Fragments
und beide wohnen im selbenActivity
. - Haben Sie auf einem Telefon eine Liste
Fragment
in einerActivity
. - Starten Sie eine neue
Activity
mit den DetailsFragment
.
(zB Android 3.0 Fragments API von Dianne Hackborn und das Fragments API Guide )
Auf beiden Geräten befindet sich die Funktionalität in der Fragments
. (einfach)
Auf dem Tablet ist die gesamte App 1Activity
, auf dem Telefon gibt es vieleActivities
.
Fragen:
- Gibt es einen Grund, die Telefon-App in viele zu teilen
Activities
?
Ein Problem bei dieser Methode besteht darin, dass Sie einen Großteil der Logik im Haupttablett Activity
und im separaten Telefon duplizierenActivities
.
- Wäre es nicht einfacher, das 1-Aktivitätsmodell in beiden Fällen beizubehalten
Fragments
und dieselbe Logik für das Ein- und Ausschalten zu verwenden (nur mit einem anderen Layout)?
Auf diese Weise befindet sich der größte Teil der Logik in sich Fragments
selbst, und es gibt nur eine einzige Activity
Duplizierung von Code.
Auch das, was ich über das lesen ActionBarSherlock
ist , dass es am besten zu funktionieren mit scheint Fragments
statt Activities
(aber ich habe nicht mit ihm noch gearbeitet).
Sind die Tutorials zu stark vereinfacht oder habe ich bei diesem Ansatz etwas Wichtiges verpasst?
Wir haben beide Ansätze erfolgreich im Büro ausprobiert - aber ich bin dabei, ein größeres Projekt zu starten und möchte es mir so einfach wie möglich machen.
Einige Links zu verwandten Fragen:
- Dilemma: Wann sollten Fragmente oder Aktivitäten verwendet werden?
- Muster für die Verwendung von Aktivitätsübergang und dynamischen Fragmenten
- Android - Ich brauche einige Klarstellungen von Fragmenten gegenüber Aktivitäten und Ansichten
- Aktivitäten oder Fragmente in Android?
- Interaktionsdesign für mehrere Fragmente und Aktivitäten
- Was sind die genauen Vorteile von Fragmenten in Android 3.0?
Aktualisierung
Begonnenes Kopfgeld auf Frage - immer noch nicht überzeugt, warum ich meine App-Logik in meiner Tablet-Aktivität und in jeder Telefonaktivität duplizieren muss.
Fand auch einen interessanten Artikel von den Jungs von Square, der es wert ist, gelesen zu werden:
quelle
onItemSelected()
Methode in der Aktivität zu haben. In meiner "echten" App habe ich viele Listen und Unterlisten. Dieses Muster legt nahe, dass meine Tab-Aktivität eineonItemSelected()
Methode zum Behandeln jeder der Listen haben muss. Außerdem muss in den Telefonaktivitäten jeweils dieselbe Logik dupliziert sein. IMHO ist es viel besser, die Item Selected-Logik in jedes Fragment einzufügen - es gibt keine Duplizierung und ich bevorzuge diese Art der Strukturierung des Codes. Ich hoffe das hilftAntworten:
Ich bin damit einverstanden, dass die Tutorials sehr vereinfacht sind. Sie stellen nur vor,
Fragments
aber ich stimme dem vorgeschlagenen Muster nicht zu.Ich stimme auch zu, dass es keine gute Idee ist, die Logik Ihrer App über viele Aktivitäten hinweg zu duplizieren (siehe DRY-Prinzip auf Wikipedia ).
Ich bevorzuge das Muster der
ActionBarSherlock
Fragments Demo App ( hier herunterladen und Quellcode hier ). Die Demo, die dem in der Frage erwähnten Tutorial am ehesten entspricht, heißt in der App "Layout". oderFragmentLayoutSupport
im Quellcode.In dieser Demo wurde die Logik aus dem
Activity
und in den verschobenFragment
. DasTitlesFragment
enthält tatsächlich die Logik zum Ändern von Fragmenten. Auf diese Weise ist jede Aktivität sehr einfach. Das Duplizieren vieler sehr einfacher Aktivitäten, bei denen sich keine Logik in den Aktivitäten befindet, macht es sehr einfach.Wenn Sie die Logik in die Fragmente einfügen, müssen Sie den Code nicht mehr als einmal schreiben . Es ist verfügbar, unabhängig davon, in welche Aktivität das Fragment versetzt wird. Dies macht es zu einem leistungsfähigeren Muster als das im Basis-Tutorial vorgeschlagene.
Ein weiterer Vorteil des ABS- Musters besteht darin, dass Sie keine Tablet-Aktivität mit viel Logik erhalten, was bedeutet, dass Sie Speicherplatz sparen. Das Tutorial-Muster kann zu einer sehr großen Hauptaktivität in einer komplexeren App führen. da es die Logik aller Fragmente verarbeiten muss, die jederzeit darin platziert werden.
Betrachten Sie es insgesamt nicht als gezwungen, viele Aktivitäten zu nutzen. Stellen Sie sich vor, Sie haben die Möglichkeit, Ihren Code in viele Fragmente aufzuteilen und bei deren Verwendung Speicherplatz zu sparen.
quelle
Ich denke, Sie sind auf dem richtigen Weg. (Und ja, die Tutorials sind zu stark vereinfacht).
In einem Tablet-Layout können Sie eine einzelne Aktivität verwenden und Fragmente ein- und auswechseln (in mehreren "Fenstern"). In einem Telefonlayout können Sie für jedes Fragment eine neue Aktivität verwenden.
Wie so:
Es mag wie viel zusätzliche Arbeit erscheinen, aber durch die Verwendung mehrerer Aktivitäten für Telefone aktivieren Sie den grundlegenden Aktivitätslebenszyklus und das Übergeben von Absichten. Dadurch kann das Framework auch alle Animationen und den Backstack verarbeiten.
Um den Code zu reduzieren, können Sie a verwenden
BaseActivity
und daraus erweitern.Wenn der Benutzer also ein Tablet hat, das Sie verwenden würden,
MyMultiPaneFragActivity
oder ähnliches. Diese Aktivität ist für die Verwaltung von Rückrufen von den Fragmenten und das Weiterleiten von Absichten an das richtige Fragment (z. B. eine Suchabsicht) verantwortlich.Wenn der Benutzer ein Telefon hat, können Sie eine reguläre Aktivität mit sehr wenig Code verwenden und diese erweitern
MyBaseSingleFragActivity
oder ähnliches. Diese Aktivitäten können sehr einfach sein, 5-10 Codezeilen (vielleicht sogar weniger).Der schwierige Teil ist das Weiterleiten von Absichten und so weiter. * (Bearbeiten: siehe unten).
Ich denke, der Grund, warum dies empfohlen wird, besteht darin, Speicherplatz zu sparen und Komplexität und Kopplung zu reduzieren. Wenn Sie Fragmente austauschen,
FragmentManager
behält das einen Verweis auf dieses Fragment für den Backstack bei. Es vereinfacht auch, was für den Benutzer "ausgeführt" werden soll. Dieses Setup entkoppelt auch die Ansichten sowie das Layout und die Logik im Fragment vom Aktivitätslebenszyklus. Auf diese Weise kann ein Fragment in einer einzelnen Aktivität neben einem anderen Fragment (zwei Fenster) oder in einer Aktivität mit drei Fenstern usw. vorhanden sein.* Einer der Vorteile des regelmäßigen Intent-Routings besteht darin, dass Sie eine Aktivität explizit von einer beliebigen Stelle im Backstack aus starten können. Ein Beispiel könnten Suchergebnisse sein. (MySearchResults.class).
Lesen Sie hier mehr:
http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html
quelle
Hier ist die Antwort von Reto Meier, die aus diesem Video des Android Fundamentals-Kurses von Udacity stammt .
quelle
Im Master-Detail-Muster gibt es zwei Aktivitäten. Man zeigt beide Fragmente auf größeren Bildschirmen und nur das "Master" -Fragment auf kleineren Bildschirmen. Das andere zeigt das "Detail" -Fragment auf kleineren Bildschirmen.
Ihre Detaillogik sollte im Detailfragment verknüpft sein. Daher gibt es keine Codeduplizierung in Bezug auf die Detaillogik zwischen Aktivitäten - die Detailaktivität zeigt lediglich das Detailfragment an und übergibt möglicherweise Daten von einem
Intent
Extra.ActionBarSherlock hat nicht mehr mit Fragmenten zu tun als die native Aktionsleiste, da ActionBarSherlock lediglich ein Backport der nativen Aktionsleiste ist.
quelle
Bezugnehmend auf die erste Frage von "Gibt es einen Grund, die Telefon-App in viele Aktivitäten aufzuteilen?" - Ja. Es kommt einfach auf den verfügbaren Platz an. Ein Tablet bietet Entwicklern mehr Platz und ermöglicht es Entwicklern, mehr auf einen Bildschirm zu bringen. Android sagt uns, dass Aktivitäten einen Bildschirm bereitstellen können . Was Sie also mit einem großen Bildschirm auf einem Tablet tun können, muss möglicherweise auf mehrere Bildschirme eines Telefons verteilt werden, da nicht genügend Platz für alle Fragmente vorhanden ist.
quelle