Android Fragment Lifecycle
idag lär vi oss om Android Fragment Lifecycle och implementerar en enda aktivitetsklass bestående av två fragment i android-applikationen.
Android Fragment
Fragment
klass i Android används för att bygga dynamiska användargränssnitt. Fragment bör användas inom aktiviteten. En största fördel med fragment är att det förenklar uppgiften att skapa användargränssnitt för flera skärmstorlekar. En aktivitet kan innehålla valfritt antal fragment.
ett Android-fragment är inte i sig en underklass av vy som de flesta andra UI-komponenter är. Istället har ett fragment en vy inuti den. Det är denna vy som så småningom visas inuti den aktivitet där fragmentet lever.
eftersom ett Android-fragment inte är en vy ser det något annorlunda ut än att lägga till en vy (t.ex. TextView). Ett fragment läggs till i en Vygrupp inuti aktiviteten. Fragmentets vy visas i denna Vygrupp.
Följande diagram visar visar vad som händer när ett fragment läggs till i en aktivitet:
först får aktiviteten en hänvisning till fragmentet. Då blir det en referens till Vygruppen fragmentets vy kommer att återges inuti. Sedan lägger aktiviteten till fragmentet. Fragmentet skapar sedan sin vy och returnerar den till aktiviteten. Vyn infogas sedan i ViewGroup-föräldern och fragmentet lever.
Fragment livscykel
Android fragment livscykel illustreras i bilden nedan.
nedan är metoderna för fragment lifecycle.
-
onAttach()
:denna metod kommer att kallas först, även före onCreate(), så att vi vet att ditt fragment har kopplats till en aktivitet. Du har passerat den aktivitet som kommer att vara värd för ditt fragment -
onCreateView()
: Systemet kallar denna återuppringning när det är dags för fragmentet att rita sitt användargränssnitt för första gången. För att rita ett användargränssnitt för fragmentet måste en Vykomponent returneras från denna metod som är roten till fragmentets layout. Vi kan returnera null om fragmentet inte ger ett användargränssnitt -
onViewCreated()
: detta kommer att kallas efter onCreateView(). Detta är särskilt användbart när du ärver implementeringen av onCreateView () men vi måste konfigurera de resulterande vyerna, till exempel med en ListFragment och när du ska ställa in en adapter -
onActivityCreated()
:Detta anropas efter onCreate () och onCreateView (), för att indikera att aktivitetens onCreate () har slutförts. Om det finns något som behövs för att initieras i fragmentet som beror på aktivitetens onCreate() efter att ha avslutat sitt arbete kan onActivityCreated() användas för det initialiseringsarbetet -
onStart()
: onstart () – metoden kallas när fragmentet blir synligt -
onPause()
: systemet kallar den här metoden som den första metoden för att skapa en första indikationen på att användaren lämnar fragmentet. Det är vanligtvis där du bör begå ändringar som ska kvarstå utöver den aktuella användarsessionen -
onStop()
: Fragment kommer att stoppas genom att ringa onStop() -
onDestroyView()
: det kallas före onDestroy(). Detta är motsvarigheten till onCreateView () där vi ställer in användargränssnittet. Om det finns saker som behövs för att rengöras specifikt för användargränssnittet, kan den logiken sättas upp i onDestroyView () -
onDestroy()
: onDestroy () kallas för att göra slutstädning av fragmentets tillstånd men garanteras inte av Android-plattformen. -
onDetach()
: det kallas efter onDestroy(), för att meddela att fragmentet har tagits bort från sin värdaktivitet
Android Fragmentklasser
fragment lades till Android API i Honeycomb(API 11).
-
android.app.Fragment
: basklassen för alla fragmentdefinitioner -
android.app.FragmentManager
: Klassen för interaktion med fragmentobjekt i en aktivitet -
android.app.FragmentTransaction
: klassen för att utföra en atomuppsättning fragmentoperationer
När du använder ett kompatibilitetspaketbibliotek som tillhandahålls av Google används följande klasser för implementering.
-
android.support.v4.app.FragmentActivity
: Basklassen för alla aktiviteter som använder kompatibilitetsbaserade fragment (och loader) funktioner android.support.v4.app.Fragment
android.support.v4.app.FragmentManager
android.support.v4.app.FragmentTransaction
Android Fragment onCreateView()
här är ett provfragment med oncreateview() för dess genomförande:
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()
metoden får en layoutinflater, en viewgroup och en bunt som parametrar.
LayoutInflater
är en komponent som kan skapa visa instans baserad på layout XML-filer. Som du kan se gör exemplet faktiskt det genom att ringa layout.inflate()
.
inflate()
metoden tar tre parametrar: id för en layout XML-fil (inuti R. layout), en överordnad Visningsgrupp i vilken fragmentets vy ska infogas och en tredje boolesk som berättar om fragmentets vy som uppblåst från layout XML-filen ska infogas i den överordnade Visningsgruppen. I det här fallet skickar vi falskt eftersom vyn kommer att bifogas den överordnade Visningsgruppen någon annanstans, med en del av Android-koden vi kallar. När du skickar false som sista parameter för att blåsa upp () används den överordnade Visningsgruppen fortfarande för layoutberäkningar av den uppblåsta vyn, så du kan inte skicka null som överordnad Visningsgrupp .
ViewGroup
parameter för onCreateView() är den överordnade Vygruppen i vilken vyn av fragmentet ska infogas. Detta är en Vygrupp inuti aktiviteten som kommer att ”vara värd” för fragmentet.
Bundle
parameter för onCreateView() är ett bunt där fragmentet kan spara data, precis som i en aktivitet.
Android Fragment Example
Android fragments example project comprises of a single activity holding two fragments: TextFragment and MenuFragment respectively.
Android Fragment Example Code
The MainActivity
holds the two fragments TextFragment
and MenuFragment
. Så låt oss börja med att definiera fragmenten i xml-layouten
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>
som vi kan se klassfilerna för fragmenten som ingår i denna aktivitet definieras som class=”journaldev.com.fragments.fragments.TextFragment”
fragmentklasserna och deras layouter definieras som visas i avsnittet utdrag nedan.
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>
textfragmentet består av textvisningar som håller android-versionens namn och nummer.
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>
Menyenfragmentet visar en listvy. Som vi kan se här är layouten för ListView standard simple_list_item_1 motsatt den anpassade layouten som vi skapade för ListView i föregående artikel.
huvudaktiviteten åberopar setContentView från Oncreate-metoden, det är det. Fragmenten anropas från xml-filen.
Alternativt kan vi lägga till fragmenten från aktivitetsklassen med FragmentManager
som visas i avsnittet nedan:
getFragmentManager() .beginTransaction() .add(R.id.fragmentParentViewGroup, new MyFragment()) .commit();
här tillhör id fragmentParentViewGroup till FrameLayout som visas nedan:
<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
nedan visar utmatningen som produceras av vårt projekt, du kan se att två fragment finns här och när du väljer någon av dem i vänstra fragmentet, visas data från blir befolkade i höger sida fragment.
Du kan ladda ner final android fragment project underifrån länk.