Articles

Android Fragment Lifecycle

i dag lærer vi om Android Fragment Lifecycle og implementerer en enkelt aktivitetsklasse bestående af to fragmenter i android-applikationen.

Android Fragment

Fragment klasse i Android bruges til at opbygge dynamiske brugergrænseflader. Fragment skal bruges inden for aktiviteten. En største fordel ved fragmenter er, at det forenkler opgaven med at skabe UI for flere skærmstørrelser. En aktivitet kan indeholde et vilkårligt antal fragmenter.

et Android-fragment er ikke i sig selv en underklasse af visning, som de fleste andre UI-komponenter er. I stedet har et fragment en visning inde i det. Det er denne opfattelse, der til sidst vises inde i den aktivitet, hvor fragmentet lever.

fordi et Android-fragment ikke er en visning, ser det noget anderledes ud end at tilføje en visning (f.eks. Et fragment føjes til en Visningsgruppe inde i aktiviteten. Fragmentets visning vises inde i denne Visningsgruppe.

følgende diagram viser, hvad der sker, når et fragment føjes til en aktivitet:

android fragment

først får aktiviteten en henvisning til fragmentet. Så får det en henvisning til Visningsgruppen fragmentets visning vil blive gengivet indeni. Derefter tilføjer aktiviteten fragmentet. Fragmentet opretter derefter sin visning og returnerer den til aktiviteten. Visningen indsættes derefter i visningsgruppens forælder, og fragmentet er i live.

Fragment Lifecycle

Android fragment lifecycle er illustreret i nedenstående billede.

android fragment lifecycle

nedenfor er metoderne til fragment lifecycle.

  1. onAttach(): denne metode kaldes først, selv før onCreate(), så vi ved, at dit fragment er knyttet til en aktivitet. Du er bestået den aktivitet, der vil være vært for dit fragment
  2. onCreateView() : Systemet kalder denne tilbagekald, når det er tid for fragmentet at tegne sin brugergrænseflade for første gang. For at tegne et brugergrænseflade til fragmentet skal en Visningskomponent returneres fra denne metode, som er roden til fragmentets layout. Vi kan returnere null, hvis fragmentet ikke giver et UI
  3. onViewCreated() : dette vil blive kaldt efter oncreatevisning(). Dette er især nyttigt, når vi arver implementeringen af oncreatevisning (), men vi er nødt til at konfigurere de resulterende visninger, f. eks. med en Listefragment og hvornår der skal oprettes en adapter
  4. onActivityCreated() :Dette kaldes efter onCreate () og oncreatevisning() for at indikere, at aktivitetens onCreate () er afsluttet. Hvis der er noget, der skal initialiseres i fragmentet, der afhænger af aktivitetens onCreate() efter at have afsluttet sit arbejde, kan onActivityCreated() bruges til det initialiseringsarbejde
  5. onStart() : onStart () – metoden kaldes, når fragmentet bliver synligt
  6. onPause() : systemet kalder denne metode som en metode, der er blevet den første indikation af, at brugeren forlader fragmentet. Dette er normalt, hvor du skal begå ændringer, der skal opretholdes ud over den aktuelle brugersession
  7. onStop() : Fragment vil blive stoppet ved at kalde onStop()
  8. onDestroyView() : det kaldes før onDestroy(). Dette er modstykket til oncreatevisning (), hvor vi opsætter brugergrænsefladen. Hvis der er ting, der skal ryddes op specifikt for brugergrænsefladen, så kan logikken sættes op i ondestroyvisning ()
  9. onDestroy() : onDestroy () kaldet til at gøre endelig oprydning af fragmentet tilstand, men ikke garanteret at blive kaldt af Android-platformen.
  10. onDetach(): det kaldes efter onDestroy () for at meddele, at fragmentet er blevet adskilt fra dets hostingaktivitet

Android Fragment Classes

fragmenter blev føjet til Android API i Honeycomb(API 11).

  1. android.app.Fragment: basisklassen for alle fragmentdefinitioner
  2. android.app.FragmentManager : Klassen til interaktion med fragmentobjekter inde i en aktivitet
  3. android.app.FragmentTransaction : klassen til udførelse af et atomart sæt fragmentoperationer
  4. Når du bruger et kompatibilitetspakkebibliotek leveret af Google, bruges følgende klasser til implementering.

  • android.support.v4.app.FragmentActivity : Basen klasse for alle aktiviteter ved hjælp af kompatibilitet-baserede fragment (og loader) funktioner
  • android.support.v4.app.Fragment
  • android.support.v4.app.FragmentManager
  • android.support.v4.app.FragmentTransaction
  • Android Fragment oncreatevisning()

    Her er et eksempelfragment, der bruger oncreatvisning() til implementering:

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() metode får en layoutinflater, en visningsgruppe og et bundt som parametre.

LayoutInflater er en komponent, der kan oprette Visningsinstans baseret på layout-filer. Som du kan se, gør eksemplet det faktisk ved at kalde layout.inflate().

inflate() metoden tager tre parametre: id ‘ et for en layoutfil (inde i R. layout), en overordnet Visningsgruppe, som fragmentets visning skal indsættes i, og en tredje boolsk, der fortæller, om fragmentets visning som oppustet fra LAYOUTFILEN skal indsættes i den overordnede Visningsgruppe. I dette tilfælde videregiver vi falsk, fordi visningen vil blive knyttet til den overordnede Visningsgruppe andetsteds ved hjælp af nogle af den Android-kode, vi kalder. Når du overfører falsk som sidste parameter for at puste(), bruges den overordnede Visningsgruppe stadig til layoutberegninger af den oppustede visning, så du kan ikke videregive null som overordnet Visningsgruppe .

ViewGroup parameter for oncreatevisning() er den overordnede Visningsgruppe, som visningen af fragmentet skal indsættes i. Dette er en Visningsgruppe inde i aktiviteten, der vil “være vært” for fragmentet.

Bundle parameter for oncreatevisning() er et bundt, hvor fragmentet kan gemme data, ligesom 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

Android Fragment Example Code

The MainActivity holds the two fragments TextFragment and MenuFragment.

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>

da vi kan se klassefilerne for de fragmenter, der er en del af denne aktivitet, er defineret som class=”journaldev.com.fragments.fragments.tekstfragment”

fragmentklasserne og deres layout er defineret som class = “journaldev.com. fragments. fragments. fragments. tekstfragment”

fragmentklasserne og deres layout er defineret som class = “journaldev. com. fragments. fragments. fragments. tekstfragment”

fragmentklasserne og deres layouts er defineret som vist i uddragene nedenfor.

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>

tekstfragmentet består af tekstvisninger med android-versionens navn og 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>

Menuenfragment viser en listevisning. Som vi kan se her, er layoutet af Listevisning standard simple_list_item_1 i modsætning til det brugerdefinerede layout, vi oprettede til listevisningen i den forrige artikel.

hovedaktiviteten påberåber sig setindholdvisningen fra onCreate-metoden, det er det. Fragmenterne kaldes fra filen.

Alternativt kan vi tilføje fragmenterne fra aktivitetsklassen ved hjælp af FragmentManager som vist i uddraget nedenfor:

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

Her hører id-fragmentparentvisningsgruppen til FrameLayout vist nedenfor:

<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 Eksempel App

nedenfor viser output produceret af vores projekt, du kan se, at der er to fragmenter til stede her, og når du vælger en af dem i venstre sidefragment, skal du bliver befolket i højre side fragment.

android fragmenter eksempel fragment livscyklus

Du kan hente endelige android fragment projekt fra nedenstående link.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *