Fragment vs. benutzerdefinierte Ansicht in Android
Lesezeit: 5 Minuten
Kai
Das Fragment und die benutzerdefinierte Ansicht können die ähnliche Funktion erreichen, ich weiß, dass das Fragment im Vergleich zur benutzerdefinierten Ansicht wiederverwendbarer ist, irgendwelche anderen Vorteile/Verbesserungen für die Verwendung von Fragment? Soll Fragment die benutzerdefinierte Ansicht ersetzen oder nur eine Erweiterung für einen bestimmten Zweck?
Der folgende Code ist beispielsweise 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);
}
}
Beide TestFragment und TestCustomView kann eine Ansicht erstellen, bestehend aus TextView und Buttonsund verwenden Sie Tags von Framelayout/fragment und com.packagename.TestCustomView in der XML-Layoutdatei der Aktivität zu deklarieren, aber was sind die Vorteile der Verwendung von Fragment?
Ich finde Fragmente nützlich, wenn Sie Zugriff auf etwas benötigen, das die Ansicht nicht hat, z. B. Informationen über den Fragment-Lebenszyklus oder so etwas wie ‘LoaderManager’.
– Karakuri
5. Juli 2015 um 23:42 Uhr
Fragment kann in verschiedenen Szenarien verwendet werden, aber die am häufigsten verwendeten sind:
Wrapper um eine Ansicht
Kopfloses Fragment – dh keine Ansicht => im Allgemeinen nicht sehr hilfreich, kann aber verwendet werden
einbehaltbares Fragment – kann eines der oben genannten sein. Durch die Nutzung Fragment.setRetainInstance(true) kannst du umgehen Fragment.onDestroy()dh kann Fragmentdaten bei Konfigurationsänderungen behalten, aber die Struktur der Fragmentansicht wird immer noch zerstört/neu erstellt
kann zum Aktivitäts-Backstack hinzugefügt werden, dh einfache Zurück-Schaltfläche zum vorherigen Zustand wiederherstellen
Es gibt Fälle, in denen Fragmente völlige Nackenschmerzen sind, dann gibt es Fälle, in denen sie schneller Ergebnisse erzielen können.
In einigen benutzerdefinierten und flexibleren Situationen können Fragmente unübersichtlich werden und ihre Verwaltung wäre schwierig. Daher kann der direkte Umgang mit Ansichten in einigen Fällen sehr praktisch und hilfreicher sein. Aber alles basiert auf Anforderungen.
NotizView hat auch einen eigenen Lebenszyklus und kann gespeicherte Instanzzustände speichern/wiederherstellen. Ein bisschen mehr Arbeit, aber es hat auch die Option.
Danke für die Antwort. Es wäre schön, einige spezifische Beispiele zu sehen, die die Vor- und Nachteile der Verwendung von Fragmenten gegenüber Ansichten und umgekehrt demonstrieren, um besser zu verstehen, welcher Ansatz besser geeignet ist. Derzeit sieht es für mich so aus, als ob Fragmente der richtige Weg sind, aber auch hier könnten einige Beispiele helfen, mögliche Nachteile dieses Ansatzes zu verstehen.
– Virus
22. Oktober 2017 um 17:23 Uhr
Benutzerdefinierte Ansichten haben den Vorteil der Einfachheit und ihr Hauptzweck besteht darin, Daten auf dem Bildschirm anzuzeigen. Sie müssen sich auf andere Komponenten verlassen, um mehr zu leisten.
Stellen Sie sich Fragmente als funktionale Einheit vor, eine Möglichkeit, einen Teil der Benutzeroberfläche anzuzeigen, der einen bestimmten Zweck hat, indem Sie eine oder mehrere Ansichten verwenden. Fragmente sind mit dem Aktivitätslebenszyklus verbunden und können Loader enthalten und steuern, um die Ansichten mit Daten zu füllen. Sie können auch Unterfragmente enthalten. Schließlich können sie auch einem synthetischen Backstack hinzugefügt werden. Sie können viele Dinge tun und sind etwas komplex zu lernen.
Wie Sie sehen können, haben Fragmente viel mehr mit Aktivitäten gemeinsam als mit benutzerdefinierten Ansichten.
Als Randnotiz können Fragmente auch kopflos sein (ohne UI). Headless-Fragmente bieten eine Möglichkeit, nicht-visuelle Funktionen zu kapseln, die sich auf den Aktivitätslebenszyklus in einer separaten Komponente stützen.
Alles richtig, aber das erklärt nicht, was der Vorteil der Verwendung eines Fragments gegenüber der benutzerdefinierten Ansicht ist
– Nir Alfasi
6. Juli 2015 um 0:13 Uhr
In dem in der Frage angegebenen Beispiel würde es keinen Vorteil geben, da nur einige statische Daten aus einem Layout angezeigt werden. In realen Beispielen, wenn Sie komplexe Schnittstellen erstellen müssen, die auf Benutzerinteraktionen 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 derselben Ebene vergleichen können, da sie unterschiedliche Zwecke haben.
– BladeCoder
6. Juli 2015 um 0:19 Uhr
Malthan
Fragmente haben ihren eigenen Lebenszyklus, der ein Hindernis oder ein Bonus sein kann, je nachdem, was Sie brauchen.
Fragmente erhalten Lebenszyklusmethoden wie onResume oder onSavedInstanceState, die Ihnen beim Umgang mit Statusübergängen in Ihrer Anwendung helfen können. Wenn Sie benutzerdefinierte Ansichten verwenden, müssen Sie diese Art von Dingen selbst handhaben.
Die nützlichste Funktionalität der Verwendung Fragments Über Custom Views ist, dass sie ihre eigenen Lifecycle Callbacks haben, dh wir können unsere eigenen registrieren FragmentLifecycleCallbacks um einige Operationen vorher/nachher durchzuführen Fragment Schöpfung/Zerstörung.
Wir können unsere eigenen erstellen FragmentLifecycleCallbacks und registriere es mit Activity Abhängigkeiten einzufügen Fragment durch Dagger. Es gibt einige Problemumgehungen, um Abhängigkeiten einzufügen Custom Views auch, aber durchziehen FragmentLifecycleCallbacks ist viel sauberer und einfacher zu machen.
12711400cookie-checkFragment vs. benutzerdefinierte Ansicht in Androidyes
Ich finde Fragmente nützlich, wenn Sie Zugriff auf etwas benötigen, das die Ansicht nicht hat, z. B. Informationen über den Fragment-Lebenszyklus oder so etwas wie ‘LoaderManager’.
– Karakuri
5. Juli 2015 um 23:42 Uhr