Articles

Cykl życia fragmentu Androida

dzisiaj poznamy cykl życia fragmentu Androida i zaimplementujemy w aplikacji Android jedną klasę aktywności składającą się z dwóch fragmentów.

Fragment Androida

Fragment klasa w Androidzie służy do budowania dynamicznych interfejsów użytkownika. Fragment powinien być użyty w ramach Działania. Największą zaletą fragmentów jest to, że upraszcza zadanie tworzenia interfejsu użytkownika dla wielu rozmiarów ekranu. Czynność może zawierać dowolną liczbę fragmentów.

fragment Androida nie jest sam w sobie podklasą widoku, którą jest większość innych komponentów interfejsu. Zamiast tego fragment ma widok wewnątrz. To właśnie ten widok jest ostatecznie wyświetlany wewnątrz aktywności, w której żyje fragment.

ponieważ fragment Androida nie jest widokiem, dodanie go do działania wygląda nieco inaczej niż dodanie widoku (np. TextView). Fragment jest dodawany do grupy widoków wewnątrz działania. Widok fragmentu jest wyświetlany wewnątrz tej grupy widoku.

poniższy diagram pokazuje, co się dzieje, gdy fragment jest dodawany do aktywności:

Android fragment

najpierw aktywność uzyskuje odniesienie do fragmentu. Następnie otrzymuje odniesienie do grupy ViewGroup, w której Widok fragmentu będzie renderowany. Następnie czynność dodaje fragment. Fragment następnie tworzy swój widok i zwraca go do działania. Widok jest następnie wstawiany do rodzica ViewGroup, a fragment jest żywy.

cykl życia fragmentu Androida

cykl życia fragmentu Androida jest zilustrowany na poniższym obrazku.

cykl życia fragmentu Androida

poniżej znajdują się metody cyklu życia fragmentu.

  1. onAttach() :ta metoda zostanie wywołana jako pierwsza, nawet przed OnCreate(), informując nas, że Twój fragment został dołączony do działania. Jesteś przekazana aktywność, która będzie hostować Twój fragment
  2. onCreateView() : System wywołuje to wywołanie zwrotne, gdy nadszedł czas, aby fragment narysował swój interfejs użytkownika po raz pierwszy. Aby narysować interfejs dla fragmentu, należy zwrócić komponent View z tej metody, który jest korzeniem układu fragmentu. Możemy zwrócić null, jeśli fragment nie zawiera interfejsu
  3. onViewCreated(): zostanie to wywołane po wywołaniu oncreateview(). Jest to szczególnie przydatne podczas dziedziczenia implementacji oncreateview (), ale musimy skonfigurować wynikowe widoki, takie jak ListFragment i kiedy skonfigurować adapter
  4. onActivityCreated() :Zostanie wywołana po OnCreate () i onCreateView (), aby wskazać, że funkcja OnCreate () zakończyła działanie. Jeśli jest coś, co musi zostać zainicjalizowane w fragmencie, co zależy od tego, że funkcja OnCreate() wykonała swoją pracę, to można użyć onactivitycreated() do tej pracy inicjalizacyjnej
  5. onStart() : metoda OnStart() zostanie wywołana, gdy fragment stanie się widoczny
  6. onPause() : wywołanie systemowe metoda ta jest pierwszą wskazówką, że użytkownik opuszcza fragment. To jest zazwyczaj miejsce, w którym powinieneś zatwierdzić wszelkie zmiany, które powinny pozostać poza bieżącą sesją użytkownika
  7. onStop() : Fragment zostanie zatrzymany przez wywołanie OnStop()
  8. onDestroyView() : jest wywoływany przed onDestroy(). Jest to odpowiednik oncreateview (), w którym ustawiamy interfejs użytkownika. Jeśli są rzeczy, które muszą zostać wyczyszczone specyficznie dla interfejsu użytkownika, to tę logikę można umieścić w onDestroyView ()
  9. onDestroy() : ondestroy () wywołane w celu ostatecznego oczyszczenia stanu fragmentu, ale nie gwarantowane, że zostanie wywołane przez platformę Android.
  10. onDetach() : jest wywoływany po ondestroy(), aby powiadomić, że fragment został odłączony od swojej aktywności hostingowej

klasy fragmentów Androida

zostały dodane do API Androida w Honeycomb(API 11).

  1. android.app.Fragment : klasa bazowa dla wszystkich definicji fragmentów
  2. android.app.FragmentManager : Klasa do interakcji z obiektami fragment wewnątrz działania
  3. android.app.FragmentTransaction : Klasa do wykonywania atomowego zestawu operacji na fragmentach
  4. w przypadku korzystania z biblioteki pakietów kompatybilności dostarczanej przez Google do implementacji używane są następujące klasy.

  • android.support.v4.app.FragmentActivity : Podstawowa klasa dla wszystkich działań wykorzystujących oparty na kompatybilności fragment (i loader) funkcje
  • android.support.v4.app.Fragment
  • android.support.v4.app.FragmentManager
  • android.support.v4.app.FragmentTransaction
  • Fragment Androida onCreateView()

    oto przykładowy fragment wykorzystujący metodę oncreateview() do jej implementacji:

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() metoda pobiera jako parametry layoutinflater, ViewGroup i bundle.

LayoutInflater jest komponentem, który może tworzyć instancję widoku na podstawie plików XML układu. Jak widać, przykład faktycznie robi to wywołując layout.inflate().

inflate() metoda pobiera trzy parametry: id pliku XML układu (wewnątrz R. układu), nadrzędną grupę ViewGroup, do której ma być wstawiony Widok fragmentu, oraz trzecią logiczną informującą, czy Widok fragmentu jako nadmuchany z pliku XML układu powinien być wstawiony do nadrzędnej grupy ViewGroup. W tym przypadku przekażemy false, ponieważ Widok zostanie dołączony do nadrzędnej grupy ViewGroup gdzie indziej, przez część kodu Androida, który wywołujemy. Gdy przekazujesz false jako ostatni parametr do inflate (), nadrzędna ViewGroup jest nadal używana do obliczeń układu nadmuchanego widoku, więc nie możesz przekazać null jako nadrzędnej ViewGroup .

ViewGroup parametr Oncreateview() jest nadrzędną grupą widoku, do której ma zostać wstawiony Widok fragmentu. Jest to grupa ViewGroup wewnątrz aktywności, która będzie „hostować” fragment.

Bundle parametr oncreateview() jest pakietem, w którym fragment może zapisywać dane, tak jak w aktywności.

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. Zacznijmy więc od zdefiniowania fragmentów w układzie xml

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>

jak widzimy, pliki klas fragmentów, które są częścią tego działania, są zdefiniowane jako class=”journaldev.com.fragments.fragments.TextFragment”

klasy fragmentów i ich układy są zdefiniowane tak, jak pokazano w sekcji fragmenty poniżej.

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>

TextFragment składa się z textviews zawierających nazwę i numer wersji Androida.

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>

MenuFragment wyświetla widok listy. Jak widać tutaj, układ ListView jest domyślny simple_list_item_1 w przeciwieństwie do niestandardowego układu, który stworzyliśmy dla ListView w poprzednim artykule.

MainActivity wywołuje setContentView z metody onCreate, to wszystko. Fragmenty są wywoływane z pliku xml.

alternatywnie możemy dodać fragmenty z klasy activity używając FragmentManager jak pokazano w poniższym fragmencie:

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

tutaj grupa id fragmentparentview należy do FrameLayout pokazanego poniżej:

<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" />

Przykładowa aplikacja na Androida Fragment

poniżej pokazuje wyjście wyprodukowane przez nasz projekt, możesz zobaczyć, że znajdują się tu dwa fragmenty i po wybraniu dowolnego z nich w lewym fragmencie, dane zostaną wyświetlone zamieszkany w prawym fragmencie bocznym.

przykład fragmentów Androida, cykl życia fragmentu

możesz pobrać ostateczny projekt fragmentu Androida z poniższego linku.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *