2015-07-05 9 views
32

Die Fragment-und benutzerdefinierte Ansicht kann die ähnliche Funktion zu erreichen, ich weiß, dass Fragment im Vergleich zu benutzerdefinierten Ansicht wiederverwendbar ist, weitere Vorteile/Verbesserungen für die Verwendung von Fragment? Soll Fragment die benutzerdefinierte Ansicht oder nur eine Erweiterung für einen bestimmten Zweck ersetzen?Fragment vs. Benutzerdefinierte Ansicht in Android

Zum Beispiel unter dem Code Fragment:

public class TestFragment extends Fragment { 

    private TextView tv_name; 
    private Button btn_play; 
    private Button btn_delete; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.testfragment, container, false); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 

     tv_name = (TextView)getView().findViewById(R.id.tv_name); 
     btn_play = (Button)getView().findViewById(R.id.btn_play); 
     btn_delete = (Button)getView().findViewById(R.id.btn_delete); 

    } 
} 

Der Code für benutzerdefinierte Ansicht:

public class TestCustomView extends LinearLayout { 

    private TextView tv_name; 
    private Button btn_play; 
    private Button btn_delete; 

    public TestCustomView(Context context, AttributeSet attrs){ 
     super(context, attrs); 

     setOrientation(LinearLayout.HORIZONTAL); 
     setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 

     tv_name = new TextView(context); 
     addView(tv_name); 

     btn_play = new Button(context); 
     addView(btn_play); 

     btn_delete = new Button(context); 
     addView(btn_delete); 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.testfragment, container, false); 
    } 
} 

Sowohl TestFragment und TestCustomView eine Ansicht TextView bestehend erstellen und Buttons und verwenden Sie die Tags Framelayout/fragment und com.packagename.TestCustomView, um in der Aktivität zu deklarieren. s XML-Layout-Datei, aber was sind die Vorteile, um Fragment zu verwenden?

+0

Ich finde Fragmente nützlich, wenn Sie auf etwas zugreifen müssen, das die Ansicht nicht hat, z. Informationen über den Fragment-Lebenszyklus oder etwas wie "LoaderManager". – Karakuri

Antwort

21

Fragment kann in verschiedenen Szenarien verwendet werden, aber die meisten verwendet werden, sind:

  • Wrapper um einen Blick
  • kopflos Fragment - also keine Aussicht => im Allgemeinen nicht sehr hilfreich, kann aber
  • thermotrope verwendet werden Fragment - kann eine der oben genannten sein. Durch Fragment.setRetainInstance(true) verwenden Sie Fragment.onDestroy() umgehen können, das heißt Fragmentdaten auf Konfigurationsänderungen aber Fragmentsicht Struktur halten kann immer noch zerstört wird/neu erstellt
  • kann Aktivität zurück Stapel hinzugefügt werden, dh leicht Zurück-Taste vorherigen Zustand

Es wiederherstellen sind Fälle, in denen das Fragment ein kompletter Nackenschmerz ist, dann gibt es Fälle, in denen sie schneller Ergebnisse erzielen können.

Für einige benutzerdefinierte und flexiblere Situationen können Fragmente überladen werden und ihre Verwaltung wäre schwierig. Der direkte Umgang mit Ansichten kann in manchen Fällen sehr hilfreich und hilfreich sein. Aber alles basiert auf Anforderungen.

HinweisView hat auch einen eigenen Lebenszyklus und kann gespeicherten Instanzstatus speichern/neu erstellen. Ein bisschen mehr Arbeit, aber es hat auch die Option.

+0

Thans für die Antwort. Es wäre schön, einige spezifische Beispiele zu sehen, die Vor- und Nachteile der Verwendung von Fragmenten über Ansichten und umgekehrt zeigen, um besser zu verstehen, welcher Ansatz geeigneter ist. Momentan sieht es so aus, als wären Fragmente der richtige Weg, aber einige Beispiele könnten helfen, mögliche Nachteile dieses Ansatzes zu verstehen. –

13

Fragmente haben ihren eigenen Lebenszyklus, was je nach Bedarf ein Hindernis oder ein Bonus sein kann.

Fragmente erhalten Lifecycle-Methoden wie onResume oder onSavedInstanceState, mit denen Sie mit Zustandsübergängen in Ihrer Anwendung umgehen können. Wenn Sie benutzerdefinierte Ansichten verwenden, müssen Sie diese Art von Aufgaben selbst erledigen.

Es gibt Menschen, die gegen die Verwendung von Fragmenten befürworten, schlage ich vor https://corner.squareup.com/2014/10/advocating-against-android-fragments.html Lesen

6

Seit Fragment hat seinen eigenen Lebenszyklus es, selbst wenn die Activity überleben kann es gebunden ist zerstört. Diese Eigenschaft kann von Vorteil sein, wenn Sie versuchen, mit Ereignissen zu arbeiten, die eine Zerstörung der Aktivität verursachen, z. B. Konfigurationsänderungen (z. B. Änderung der Ausrichtung).

+1

Ich weiß, dass dies eine alte Antwort ist, aber diese Antwort scheint falsch zu sein, da das Dokument sagt: "Ein Fragment muss immer in eine Aktivität eingebettet sein und der Lebenszyklus des Fragments wird direkt vom Lebenszyklus der Hostaktivität beeinflusst. Zum Beispiel wenn die Aktivität pausiert ist Alle Fragmente sind darin enthalten, und wenn die Aktivität zerstört wird, werden auch alle Fragmente gelöscht.Während jedoch eine Aktivität ausgeführt wird (im Zustand des wiederaufgenommenen Lebenszyklus), können Sie jedes Fragment unabhängig bearbeiten, z. B. hinzufügen oder entfernen . " Quelle: https://developer.android.com/guide/components/fragments.html – Pelpotronic

10

Benutzerdefinierte Ansichten haben den Vorteil der Einfachheit und ihr Hauptzweck besteht darin, ein Stück Daten auf dem Bildschirm anzuzeigen.Sie müssen sich auf andere Komponenten verlassen, um mehr zu tun.

Denken Sie an Fragmente als funktionale Einheit, eine Möglichkeit, einen Teil der Benutzeroberfläche mit einem bestimmten Zweck anzuzeigen, indem Sie eine oder mehrere Ansichten verwenden. Fragmente sind mit dem Aktivitätslebenszyklus verbunden und können Loader zum Laden der Ansichten mit Daten einschließen und steuern. Sie können auch Unterfragmente enthalten. Schließlich können sie auch einem synthetischen Rückstapel hinzugefügt werden. Sie können viele Dinge tun und sind etwas komplex zu lernen.

Wie Sie sehen, haben Fragmente mit Aktivitäten viel mehr gemeinsam als mit benutzerdefinierten Ansichten.

Als eine Randnotiz können Fragmente auch kopflos sein (ohne Benutzeroberfläche). Headless-Fragmente bieten eine Möglichkeit, nicht-visuelle Funktionen in Abhängigkeit vom Aktivitätslebenszyklus in einer separaten Komponente zu kapseln.

+3

Alles richtig, aber das erklärt nicht, was der Vorteil der Verwendung eines Fragments gegenüber der benutzerdefinierten Ansicht ist. – alfasin

+0

In dem in der Frage angegebenen Beispiel würde es keinen Vorteil geben, da es nur einige statische Daten aus einem Layout anzeigt. In realen Beispielen, wenn Sie komplexe Schnittstellen erstellen müssen, die auf Benutzerinteraktion basieren, Daten laden, Abschnitte in Ihrer App erstellen usw., müssen Sie beide gleichzeitig verwenden. Der Punkt meiner Antwort ist, dass Sie sie nicht auf der gleichen Ebene vergleichen können, weil sie unterschiedliche Zwecke haben. – BladeCoder

-4

Ein Fragment kann einige Ansichten enthalten, aber eine Ansicht sollte kein Fragment enthalten. So als eine Möglichkeit der Strukturierung Dinge: Aktivität -> Fragment -> Ansicht

Und das alles nur, hängt von Ihren Anforderungen und wie würden Sie die Struktur Ihrer Anwendung behandeln.