Articles

Android Fragment Lifecycle

vandaag leren we over Android Fragment Lifecycle en implementeren we een enkele activity class bestaande uit twee fragmenten in android applicatie.

Android Fragment

Fragment klasse in Android wordt gebruikt om dynamische gebruikersinterfaces te bouwen. Fragment moet binnen de activiteit worden gebruikt. Een grootste voordeel van fragmenten is dat het vereenvoudigt de taak van het maken van UI voor meerdere schermformaten. Een activiteit kan elk aantal fragmenten bevatten.

een Android-fragment is op zichzelf geen subklasse van weergave die de meeste andere UI-componenten zijn. In plaats daarvan heeft een fragment een blik erin. Het is deze visie die uiteindelijk wordt weergegeven in de activiteit waarin het fragment leeft.

omdat een Android-fragment geen weergave is, ziet het toevoegen aan een activiteit er iets anders uit dan het toevoegen van een weergave (bijvoorbeeld TextView). Een fragment wordt toegevoegd aan een Weergavegroep binnen de activiteit. De weergave van het fragment wordt weergegeven in deze Weergavegroep.

het volgende diagram laat zien wat er gebeurt wanneer een fragment aan een activiteit wordt toegevoegd:

android fragment

eerst krijgt de activiteit een verwijzing naar het fragment. Dan krijgt het een verwijzing naar de Kijkgroep waarin de weergave van het fragment wordt weergegeven. Dan voegt de activiteit het fragment toe. Het fragment creëert dan zijn uitzicht en geeft het terug aan de activiteit. De weergave wordt dan ingevoegd in de bovenliggende Weergavegroep en het fragment leeft.

Fragment Lifecycle

Android fragment lifecycle wordt weergegeven in onderstaande afbeelding.

android fragment lifecycle

hieronder vindt u de methoden van fragment lifecycle.

  1. onAttach() :deze methode zal eerst aangeroepen worden, nog voor onCreate(), om ons te laten weten dat uw fragment aan een activiteit is gekoppeld. U bent geslaagd voor de activiteit die uw fragment zal hosten
  2. onCreateView() : Het systeem roept deze callback aan wanneer het tijd is voor het fragment om zijn gebruikersinterface voor de eerste keer te tekenen. Om een gebruikersinterface voor het fragment te tekenen, moet een Weergavecomponent worden teruggegeven van deze methode die de root is van de lay-out van het fragment. We kunnen null retourneren als het fragment geen UI
  3. onViewCreated() geeft: dit zal na onCreateView () aangeroepen worden. Dit is vooral handig bij het erven van de oncreateview () implementatie, maar we moeten de resulterende weergaven configureren, zoals met een ListFragment en wanneer een adapter
  4. onActivityCreated()moet worden ingesteld :Dit zal na onCreate() en onCreateView () worden genoemd, om aan te geven dat de activiteit onCreate() is voltooid. Als er iets moet worden geïnitialiseerd in het fragment dat afhangt van het feit dat de activiteit onCreate() zijn werk heeft voltooid, dan kan onActivityCreated() worden gebruikt voor dat initialisatiewerk
  5. onStart() : de methode onStart() wordt aangeroepen zodra het fragment zichtbaar wordt
  6. onPause() : het systeem roept deze methode aan als de eerste indicatie dat de gebruiker verlaat het fragment. Dit is meestal waar je wijzigingen moet vastleggen die moeten worden voortgezet na de huidige gebruikerssessie
  7. onStop() : Fragment wordt gestopt door onStop()
  8. onDestroyView() : Het wordt voor onDestroy () aangeroepen. Dit is de tegenhanger van onCreateView () waar we de gebruikersinterface opzetten. Als er dingen moeten worden opgeschoond die specifiek zijn voor de gebruikersinterface, dan kan die logica worden weergegeven in onDestroyView ()
  9. onDestroy() : onDestroy () aangeroepen om de staat van het fragment definitief op te ruimen, maar niet gegarandeerd te worden aangeroepen door het Android-platform.
  10. onDetach() : het wordt genoemd na onDestroy(), om aan te geven dat het fragment is losgemaakt van zijn hostingactiviteit

Android Fragment klassen

fragmenten werden toegevoegd aan de Android API in Honeycomb(API 11).

  1. android.app.Fragment: de basisklasse voor alle fragmentdefinities
  2. android.app.FragmentManager : De klasse voor interactie met fragmentobjecten binnen een activiteit
  3. android.app.FragmentTransaction : de klasse voor het uitvoeren van een atomaire set fragmentbewerkingen
  4. bij gebruik van een compatibiliteitspakketbibliotheek die door Google wordt geleverd, worden de volgende klassen gebruikt voor implementatie.

  • android.support.v4.app.FragmentActivity : De basisklasse voor alle activiteiten met het gebruik van compatibiliteit op basis van fragment (en lader) mogelijkheden
  • android.support.v4.app.Fragment
  • android.support.v4.app.FragmentManager
  • android.support.v4.app.FragmentTransaction
  • Android-Fragment onCreateView()

    Hier is een voorbeeld van een fragment met behulp van onCreateView() voor de uitvoering ervan:

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() methode krijgt een LayoutInflater, een ViewGroup en een Bundel als parameters.

LayoutInflater is een component die een weergave-instantie kan maken op basis van XML-opmaakbestanden. Zoals je kunt zien, doet het voorbeeld dat eigenlijk door layout.inflate()aan te roepen.

inflate() methode heeft drie parameters: de id van een XML-opmaakbestand (binnen R. layout), een bovenliggende Weergavegroep waarin de weergave van het fragment moet worden ingevoegd, en een derde boolean die aangeeft of de weergave van het fragment als opgeblazen uit het XML-opmaakbestand moet worden ingevoegd in de bovenliggende Weergavegroep. In dit geval zullen we false doorgeven omdat de weergave elders aan de bovenliggende Weergavegroep wordt gekoppeld, door een deel van de Android-code die we aanroepen. Wanneer u false als laatste parameter doorgeeft om op te blazen (), wordt de bovenliggende Weergavegroep nog steeds gebruikt voor opmaakberekeningen van de bovenliggende Weergavegroep, dus u kunt niet null doorgeven als bovenliggende Weergavegroep .

ViewGroup parameter van onCreateView() is de bovenliggende Weergavegroep waarin de weergave van het fragment moet worden ingevoegd. Dit is een Weergavegroep binnen de activiteit die het fragment zal” hosten”.

Bundle parameter van onCreateView() is een bundel waarin het fragment gegevens kan opslaan, net als in een activiteit.

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. Dus laten we beginnen met het definiëren van de fragmenten in de xml-indeling

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>

Zoals we kunnen zien is de class-bestanden van de fragmenten die deel uitmaken van deze activiteit worden gedefinieerd als class=”journaldev.com.fragmenten.fragmenten.TextFragment”

Het fragment klassen en hun lay-outs worden gedefinieerd, zoals weergegeven in de fragmenten hieronder.

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>

het tekstfragment bestaat uit tekstviews met de naam en het nummer van de android-versie.

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>

het menu toont een lijstweergave. Zoals we hier kunnen zien, is de lay-out van ListView standaard simple_list_item_1 in tegenstelling tot de aangepaste lay-out die we hebben gemaakt voor de ListView in het vorige artikel.

de hoofdactiviteit roept de setContentView aan vanuit de Oncreate methode, dat is het. De fragmenten worden aangeroepen vanuit het xml bestand.

als alternatief kunnen we de fragmenten uit de activiteitsklasse toevoegen met FragmentManager zoals getoond in het fragment hieronder:

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

hier de id fragmentParentViewGroup behoort tot de FrameLayout hieronder getoond:

<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

hieronder toont de uitvoer geproduceerd door ons project, kunt u zien dat twee fragmenten aanwezig zijn hier en wanneer u een van hen selecteert in het linker fragment, worden de gegevens ingevuld in de rechter zijfragment.

android fragments voorbeeld, fragment lifecycle

u kunt het uiteindelijke android fragment project downloaden via onderstaande link.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *