it-swarm.com.de

Was ist der Vorteil der Verwendung von Fragmenten in Android anstelle von Ansichten?

Bei der Entwicklung für Android können Sie Ihr Ziel (oder Minimum) sdk auf 4 (API 1.6) setzen und das Kompatibilitätspaket Android v4) hinzufügen, um die Unterstützung für Fragments hinzuzufügen erfolgreich implementiert Fragments, um Daten aus einer benutzerdefinierten Klasse zu visualisieren.

Meine Frage lautet: Was ist der Vorteil der Verwendung von Fragments gegenüber dem einfachen Abrufen einer Ansicht von einem benutzerdefinierten Objekt und der Unterstützung von API 1.5?

Angenommen, ich habe die Klasse Foo.Java:

public class Foo extends Fragment {

    /** Title of the Foo object*/
    private String title;
    /** A description of Foo */
    private String message;

    /** Create a new Foo
     * @param title
     * @param message */
    public Foo(String title, String message) {
        this.title = title;
        this.message = message;
    }//Foo

    /** Retrieves the View to display (supports API 1.5. To use,
     * remove 'extends Fragment' from the class statement, along with
     * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) 
     * @param context Used for retrieving the inflater */
    public View getView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//getView 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//onCreateView

}//Foo

Beide Methoden sind sehr einfach zu erstellen und in einer Aktivität zu verwenden, die beispielsweise ein List<Foo> zum Anzeigen (z. B. durch programmgesteuertes Hinzufügen zu einem ScrollView), sind Fragments wirklich so nützlich, oder handelt es sich nur um eine überglorifizierte Vereinfachung des Abrufens einer Ansicht, z. B. durch den obigen Code?

102
Phil

Der Hauptgrund für die Verwendung von Fragmenten sind die Backstack- und Lifecycle-Funktionen. Ansonsten sind benutzerdefinierte Ansichten leichter und einfacher zu implementieren.

Zuerst habe ich tatsächlich versucht, eine Telefon-/Tablet-App mit benutzerdefinierten Ansichten zu erstellen. Alles erschien, um über Telefone UND Tablets hinweg zu arbeiten, sogar um von einem einzelnen Panel zu einem geteilten Panel zu wechseln. Ich hatte Probleme mit dem Zurück-Button und dem Lebenszyklus. Da ich Ansichten einfach manuell aktualisierte, gab es nichts, was den Verlauf von Ansichten und ihren Zuständen verfolgte. Aus diesem Grund funktionierte die Schaltfläche "Zurück" nicht wie erwartet und es war schwierig, auch den neuesten Status während Lebenszyklusereignissen, z. B. beim Drehen der App, wiederherzustellen. Um dies zu beheben, musste ich meine benutzerdefinierten Ansichten in Fragmente packen und den FragmentManager verwenden, damit die vorherigen Zustände gespeichert und neu erstellt wurden.

Nachdem ich geantwortet hatte, dass ich ein Jahr zuvor eine ähnliche Frage gestellt hatte:https://stackoverflow.com/a/11126397/618881

166
Henry

Ich würde sagen, Fragmente sind in zwei Szenarien nützlich: Wenn Sie Ansichten auf einigen Geräten/Ausrichtungen aufteilen und sie in zwei Aktivitäten anzeigen und den gesamten Inhalt in einem auf anderen Geräten anzeigen. Dies wäre ein Anwendungsfall, wenn Sie auf einem Tablet oder sogar im Querformat auf einem Telefon arbeiten: z. Sie zeigen die Liste der Elemente und die Details auf einem Bildschirm. auf einem Telefon oder im Hochformat zeigen Sie nur einen Teil.

Ein weiterer Anwendungsfall sind wiederverwendbare Ansichten. Wenn Sie also einige Ansichten haben, die für verschiedene Aktivitäten sichtbar sind, und auch einige Aktionen ausführen, können Sie dieses Verhalten in ein Fragment packen und es dann wiederverwenden. Natürlich können Sie das auch mit benutzerdefinierten Widgets tun.

Ich würde keinen Grund dafür sehen, Fragmente für jede Ansicht zu verwenden, und ich denke, es wäre nur ein Overhead. Ich benutze sie nur im ersten Anwendungsfall und ich würde hier sagen, es ist eine Vereinfachung.

27
Maria Neumayer

Android hat Fragmente in Android 3.0 (API-Version 11)) eingeführt, um vor allem dynamischere und flexiblere Benutzeroberflächendesigns auf großen Bildschirmen wie Tablets zu unterstützen, da der Bildschirm eines Tablets viel größer ist als der eines Mobilteils Fragmente ermöglichen solche Entwürfe, ohne dass Sie komplexe Änderungen an der Ansichtshierarchie vornehmen müssen. Durch die Aufteilung des Layouts einer Aktivität in Fragmente können Sie das Erscheinungsbild der Aktivität zur Laufzeit und zur gleichen Zeit ändern Behalten Sie diese Änderungen in einem Backstack bei, der von der Aktivität verwaltet wird.

hier kannst du mehr lesen.

3
Yury
  1. Geteilter Bildschirm für Szenarioaktivitäten - Wir haben ein Layout und eine Aktivität, die den linken und rechten Bildschirmteil bearbeiten
  2. Szenario FragmentAktivität Wir haben ein Layout für den Hauptbildschirm, eines für links und eines für rechts

Szenario eins ist gut, wenn Sie eine einfache Anwendung haben.

Szenario zwei ist gut, wenn Sie mehrere Fragmente und mehrere FragmentAktivitäten haben möchten und Sie diese kombinieren können. Sie können auch Interaktionen zwischen Fragmenten durchführen.

Ich habe Splitscreen-Fragmentaktivität. Ich kann es mit 'Intent Extras' aufrufen und fragmentActivity mitteilen, welches Fragment geladen werden soll. Fragmente sind gut, weil sie nicht in Manifest vorhanden sind, sodass Sie wiederverwendbare Fragmente und FragmentActvity erstellen können.

Aber es vergrößert Ihr Projekt. Aber wenn Sie ein großes Projekt machen, können Sie viele sparen. Weil Sie dieselben Fragmente oder dieselbe Fragmentaktivität verwenden können.

Und ich denke, dass diese Fragmente etwas spät kommen, also musst du versuchen, auf neue Weise zu denken. Vielleicht versuchen Sie einfach, Ihre Aktivität in FragmentActivity umzuwandeln. Versuchen Sie später, wiederverwendbaren Code zu finden und daraus ein Fragment zu erstellen.

Es ist nützlich, aber ich weiß nicht wie im Moment. Aber ich habe einige Ideen.

Das ist immer ein Problem. Android Team hat gedacht und niemand weiß wozu das gut ist. Weil wir kaum so lernen wie es war und hier kommen ein paar neue Sachen.

Meiner Meinung nach ist es gut, aber nicht ohne Grund, dass uns Google davon erzählt.

3
Mertuarez

Fügen Sie einen Fall hinzu, wenn Sie Fragment oder Aktivität über CustomView verwenden:

Wenn Sie mit CursorLoader bestimmte Ansichten, ListView oder TextView, beobachten und deren Anzeigewert aktualisieren möchten, wenn die Daten Ihres ContentProviders im Back-End aktualisiert werden (am häufigsten haben Sie einen Dienst, der Ihre lokale Datenbank durch periodisches Abfragen von Daten aus der entfernten Datenbank/Cloud aktualisiert )

0
macio.Jun