Articles

Android Fragment Lifecycle

Heute lernen wir den Android Fragment Lifecycle kennen und implementieren eine einzelne Aktivitätsklasse, die aus zwei Fragmenten in der Android-Anwendung besteht.

Android Fragment

Fragment Klasse in Android wird verwendet, um dynamische Benutzeroberflächen zu erstellen. Fragment sollte innerhalb der Aktivität verwendet werden. Ein großer Vorteil von Fragmenten besteht darin, dass es die Erstellung von Benutzeroberflächen für mehrere Bildschirmgrößen vereinfacht. Eine Aktivität kann eine beliebige Anzahl von Fragmenten enthalten.

Ein Android-Fragment ist an sich keine Unterklasse von View wie die meisten anderen UI-Komponenten. Stattdessen hat ein Fragment eine Ansicht darin. Es ist diese Ansicht, die schließlich innerhalb der Aktivität angezeigt wird, in der das Fragment lebt.

Da ein Android-Fragment keine Ansicht ist, sieht das Hinzufügen zu einer Aktivität etwas anders aus als das Hinzufügen einer Ansicht (z. B. TextView). Ein Fragment wird einer ViewGroup innerhalb der Aktivität hinzugefügt. Die Ansicht des Fragments wird in dieser Ansichtsgruppe angezeigt.

Das folgende Diagramm zeigt, was passiert, wenn ein Fragment zu einer Aktivität hinzugefügt wird:

android fragment

Zuerst erhält die Aktivität einen Verweis auf das Fragment. Dann erhält es einen Verweis auf die ViewGroup, in der die Ansicht des Fragments gerendert wird. Dann fügt die Aktivität das Fragment hinzu. Das Fragment erstellt dann seine Ansicht und gibt sie an die Aktivität zurück. Die Ansicht wird dann in das übergeordnete Element der Ansichtsgruppe eingefügt, und das Fragment ist aktiv.

Fragmentlebenszyklus

Der Lebenszyklus von Android-Fragmenten ist im folgenden Bild dargestellt.

android fragment lifecycle

Unten sind die Methoden des Fragment Lifecycle .

  1. onAttach() :Diese Methode wird zuerst aufgerufen, noch vor onCreate() , um uns mitzuteilen, dass Ihr Fragment an eine Aktivität angehängt wurde. Sie erhalten die Aktivität, die Ihr Fragment hostet
  2. onCreateView() : Das System ruft diesen Rückruf auf, wenn das Fragment zum ersten Mal seine Benutzeroberfläche zeichnet. Um eine Benutzeroberfläche für das Fragment zu zeichnen, muss eine Ansichtskomponente von dieser Methode zurückgegeben werden, die das Stammverzeichnis des Fragmentlayouts ist. Wir können null zurückgeben, wenn das Fragment keine Benutzeroberfläche bereitstellt
  3. onViewCreated() : Dies wird nach onCreateView() aufgerufen. Dies ist besonders nützlich, wenn die onCreateView() Implementierung geerbt wird, aber wir müssen die resultierenden Ansichten konfigurieren, z. B. mit einem ListFragment und wann ein Adapter eingerichtet werden muss
  4. onActivityCreated() :Dies wird nach onCreate() und onCreateView() aufgerufen, um anzuzeigen, dass die Aktivität onCreate() abgeschlossen ist. Wenn im Fragment etwas initialisiert werden muss, das davon abhängt, dass onCreate() der Aktivität seine Arbeit abgeschlossen hat, kann onActivityCreated() für diese Initialisierungsarbeit verwendet werden
  5. onStart(): Die Methode onStart() wird aufgerufen, sobald das Fragment sichtbar wird
  6. onPause() : Das System ruft diese Methode als ersten Hinweis darauf auf, dass der Benutzer verlässt das Fragment. Hier sollten Sie normalerweise alle Änderungen festschreiben, die über die aktuelle Benutzersitzung hinaus beibehalten werden sollen
  7. onStop() : Fragment wird durch Aufruf von onStop() gestoppt
  8. onDestroyView() : Es wird vor onDestroy() aufgerufen. Dies ist das Gegenstück zu onCreateView(), wo wir die Benutzeroberfläche einrichten. Wenn es Dinge gibt, die speziell für die Benutzeroberfläche bereinigt werden müssen, kann diese Logik in onDestroyView()
  9. onDestroy() : onDestroy() wird aufgerufen, um den Status des Fragments endgültig zu bereinigen, wird jedoch nicht garantiert von der Android-Plattform aufgerufen.
  10. onDetach() : Es wird nach onDestroy() aufgerufen, um zu benachrichtigen, dass das Fragment von seiner Hosting-Aktivität getrennt wurde

Android-Fragmentklassen

Fragmente wurden der Android-API in Honeycomb hinzugefügt (API 11).

  1. android.app.Fragment : Die Basisklasse für alle Fragmentdefinitionen
  2. android.app.FragmentManager : Die Klasse für die Interaktion mit Fragmentobjekten innerhalb einer Aktivität
  3. android.app.FragmentTransaction : Die Klasse zum Ausführen eines atomaren Satzes von Fragmentoperationen
  4. Bei Verwendung einer von Google bereitgestellten Kompatibilitätspaketbibliothek werden die folgenden Klassen zur Implementierung verwendet.

  • android.support.v4.app.FragmentActivity : Die Basisklasse für alle Aktivitäten mit kompatibilitätsbasierten Fragment- (und Loader-) Funktionen
  • android.support.v4.app.Fragment
  • android.support.v4.app.FragmentManager
  • android.support.v4.app.FragmentTransaction
  • Android Fragment onCreateView()

    Hier ist ein Beispielfragment mit onCreateView() für seine Implementierung:

public class SampleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup parentViewGroup, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_sample, parentViewGroup, false); return rootView; }}

onCreateView() Die Methode ruft einen LayoutInflater, eine ViewGroup und ein Bundle als Parameter ab.

LayoutInflater ist eine Komponente, die eine Ansichtsinstanz basierend auf Layout-XML-Dateien erstellen kann. Wie Sie sehen können, tut das Beispiel dies tatsächlich, indem es layout.inflate() aufruft.

inflate() Die Methode verwendet drei Parameter: Die ID einer Layout-XML-Datei (innerhalb von R.layout), eine übergeordnete Ansichtsgruppe, in die die Ansicht des Fragments eingefügt werden soll, und einen dritten booleschen Wert, der angibt, ob die Ansicht des Fragments, die aus der Layout-XML-Datei aufgeblasen wurde, in die übergeordnete Ansichtsgruppe eingefügt werden soll. In diesem Fall übergeben wir false, da die Ansicht durch einen Teil des von uns aufgerufenen Android-Codes an anderer Stelle an die übergeordnete Ansichtsgruppe angehängt wird. Wenn Sie false als letzten Parameter an inflate() übergeben, wird die übergeordnete Ansichtsgruppe weiterhin für Layoutberechnungen der aufgeblasenen Ansicht verwendet, sodass Sie nicht null als übergeordnete Ansichtsgruppe übergeben können.

ViewGroup Parameter von onCreateView() ist die übergeordnete Ansichtsgruppe, in die die Ansicht des Fragments eingefügt werden soll. Dies ist eine ViewGroup innerhalb der Aktivität, die das Fragment „hostet“.

Bundle Parameter von onCreateView() ist ein Bundle, in dem das Fragment Daten speichern kann, genau wie in einer Aktivität.

Android Fragment Example

Android fragments example project comprises of a single activity holding two fragments: TextFragment and MenuFragment respectively.

android fragment example

Android Fragment Example Code

The MainActivity holds the two fragments TextFragment and MenuFragment. Beginnen wir also mit der Definition der Fragmente im XML-Layout

activity_main.xml

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:weightSum="1.0"> <fragment android:layout_height="match_parent" android:layout_width="match_parent" class="journaldev.com.fragments.fragments.MenuFragment" android:id="@+id/fragment" android:layout_weight="0.5"/> <fragment android:layout_width="match_parent" android:layout_height="match_parent" class="journaldev.com.fragments.fragments.TextFragment" android:id="@+id/fragment2" android:layout_weight="0.5"/></LinearLayout>

Wie wir sehen können, sind die Klassendateien der Fragmente, die Teil dieser Aktivität sind, als class=“journaldev.com.fragments.fragments.TextFragment“

Die Fragmentklassen und ihre Layouts sind wie in den folgenden Snippets definiert.

package journaldev.com.fragments.fragments;import android.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import journaldev.com.fragments.R;public class TextFragment extends Fragment { TextView text,vers; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.text_fragment, container, false); text= (TextView) view.findViewById(R.id.AndroidOs); vers= (TextView)view.findViewById(R.id.Version); return view; } public void change(String txt, String txt1){ text.setText(txt); vers.setText(txt1); }}

text_fragment.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:gravity="center" android:background="#5ba4e5" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40px" android:textColor="#ffffff" android:layout_gravity="center" android:id="@+id/AndroidOs"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textColor="#ffffff" android:textSize="30px" android:id="@+id/Version"/></LinearLayout>

Das TextFragment besteht aus Textansichten, die den Namen und die Nummer der Android-Version enthalten.

package journaldev.com.fragments.fragments;import android.app.ListFragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ListView;import journaldev.com.fragments.R;public class MenuFragment extends ListFragment { String AndroidOS = new String { "Cupcake","Donut","Eclair","Froyo","Gingerbread","Honeycomb","Ice Cream SandWich","Jelly Bean","KitKat" }; String Version = new String{"1.5","1.6","2.0-2.1","2.2","2.3","3.0-3.2","4.0","4.1-4.3","4.4"}; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) { View view =inflater.inflate(R.layout.list_fragment, container, false); ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, AndroidOS); setListAdapter(adapter); return view; } @Override public void onListItemClick(ListView l, View v, int position, long id) { TextFragment txt = (TextFragment)getFragmentManager().findFragmentById(R.id.fragment2); txt.change(AndroidOS,"Version : "+Version); getListView().setSelector(android.R.color.holo_blue_dark); }}

list_fragment.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@android:id/list" /></LinearLayout>

Das MenuFragment zeigt eine Listenansicht an. Wie wir hier sehen können, ist das Layout von ListView standardmäßig simple_list_item_1 im Gegensatz zu dem benutzerdefinierten Layout, das wir für die ListView im vorherigen Artikel erstellt haben.

Die MainActivity ruft die setContentView von der onCreate Methode auf, das war’s. Die Fragmente werden aus der XML-Datei aufgerufen.

Alternativ können wir die Fragmente aus der Aktivitätsklasse mit FragmentManager hinzufügen, wie im folgenden Snippet gezeigt:

getFragmentManager() .beginTransaction() .add(R.id.fragmentParentViewGroup, new MyFragment()) .commit();

Hier gehört die ID fragmentParentViewGroup zum unten gezeigten FrameLayout:

<FrameLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:id="@+id/fragmentParentViewGroup" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MyActivity" tools:ignore="MergeRootFrame" />

Android Fragment Example App

Unten sehen Sie die Ausgabe unseres Projekts, Sie können sehen, dass hier zwei Fragmente vorhanden sind und wenn Sie eines davon im linken Fragment auswählen, werden die Daten im rechten Fragment seitenfragment.

Beispiel für Android-Fragmente, Fragment-Lebenszyklus

Sie können das endgültige Android-Fragment-Projekt unter folgendem Link herunterladen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.