Android Fragment Lifecycle
Oggi impareremo a conoscere il ciclo di vita dei frammenti di Android e implementeremo una singola classe di attività composta da due frammenti nell’applicazione Android.
Frammento Android
Fragment
classe in Android viene utilizzato per costruire interfacce utente dinamiche. Il frammento dovrebbe essere usato all’interno dell’Attività. Un grande vantaggio di frammenti è che semplifica il compito di creare UI per più dimensioni dello schermo. Un’attività può contenere un numero qualsiasi di frammenti.
Un frammento Android non è di per sé una sottoclasse di Vista che la maggior parte degli altri componenti dell’interfaccia utente sono. Invece, un frammento ha una vista al suo interno. È questa vista che alla fine viene visualizzata all’interno dell’attività in cui vive il frammento.
Poiché un frammento Android non è una vista, aggiungerlo a un’attività sembra un po ‘ diverso dall’aggiungere una vista (ad esempio TextView). Un frammento viene aggiunto a un ViewGroup all’interno dell’attività. La vista del frammento viene visualizzata all’interno di questo ViewGroup.
Il seguente diagramma mostra cosa succede quando un frammento viene aggiunto a un’attività:
Prima l’attività ottiene un riferimento al frammento. Quindi ottiene un riferimento al ViewGroup la vista del frammento verrà renderizzata all’interno. Quindi l’attività aggiunge il frammento. Il frammento crea quindi la sua vista e la restituisce all’attività. La vista viene quindi inserita nel genitore ViewGroup e il frammento è vivo.
Fragment Lifecycle
Android fragment lifecycle è illustrato nell’immagine qui sotto.
Di seguito sono riportati i metodi del fragment lifecycle.
-
onAttach()
:Questo metodo verrà chiamato per primo, anche prima di onCreate(), facendoci sapere che il tuo frammento è stato collegato a un’attività. Viene passata l’Attività che ospiterà il frammento -
onCreateView()
: Il sistema chiama questo callback quando è il momento per il frammento di disegnare la sua interfaccia utente per la prima volta. Per disegnare un’interfaccia utente per il frammento, un componente Vista deve essere restituito da questo metodo che è la radice del layout del frammento. Possiamo restituire null se il frammento non fornisce un’interfaccia utente -
onViewCreated()
: Questo verrà chiamato dopo onCreateView(). Ciò è particolarmente utile quando si eredita l’implementazione onCreateView (), ma è necessario configurare le viste risultanti, ad esempio con un ListFragment e quando impostare un adattatore -
onActivityCreated()
:Questo verrà chiamato dopo onCreate () e onCreateView (), per indicare che l’attività onCreate () è stata completata. Se c’è qualcosa che è necessario per essere inizializzato nel frammento che dipende dall’attività di onCreate() aver completato il suo lavoro quindi onActivityCreated() può essere utilizzato per l’inizializzazione di lavoro -
onStart()
: onStart() viene chiamato il metodo, una volta che il frammento diventa visibile -
onPause()
: Il sistema si chiama questo metodo come la prima indicazione che l’utente lascia il frammento. Questo è di solito dove è necessario eseguire il commit di eventuali modifiche che dovrebbero essere persistite oltre la sessione utente corrente -
onStop()
: Il frammento verrà interrotto chiamando onStop () -
onDestroyView()
: Viene chiamato prima di onDestroy(). Questa è la controparte di onCreateView () in cui abbiamo impostato l’interfaccia utente. Se ci sono cose che sono necessarie per essere ripulite specifiche per l’interfaccia utente, allora quella logica può essere inserita in onDestroyView () -
onDestroy()
: onDestroy () chiamato a fare pulizia finale dello stato del frammento, ma non garantito per essere chiamato dalla piattaforma Android. -
onDetach()
: Viene chiamato dopo onDestroy(), per notificare che il frammento è stato dissociato dalla sua attività di hosting
Classi di frammenti Android
I frammenti sono stati aggiunti all’API Android in Honeycomb(API 11).
-
android.app.Fragment
: La classe base per tutte le definizioni di frammenti -
android.app.FragmentManager
: La classe per interagire con gli oggetti fragment all’interno di un’attività -
android.app.FragmentTransaction
: La classe per eseguire un insieme atomico di operazioni fragment
Quando si utilizza una libreria di pacchetti di compatibilità fornita da Google, vengono utilizzate le seguenti classi per l’implementazione.
-
android.support.v4.app.FragmentActivity
: La classe base per tutte le attività che utilizzano la compatibilità basato su frammento (e loader) caratteristiche android.support.v4.app.Fragment
android.support.v4.app.FragmentManager
android.support.v4.app.FragmentTransaction
Android Frammento onCreateView()
Ecco un esempio di frammento usando onCreateView() per la sua attuazione:
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()
metodo ottiene un LayoutInflater, un ViewGroup e un Bundle come parametri.
LayoutInflater
è un componente che può creare un’istanza di visualizzazione basata su file XML di layout. Come puoi vedere, l’esempio lo fa effettivamente chiamandolayout.inflate()
.
inflate()
il metodo accetta tre parametri: L’id di un file XML di layout (all’interno di R. layout), un ViewGroup padre in cui deve essere inserita la Vista del frammento e un terzo booleano che indica se la vista del frammento gonfiata dal file XML di layout deve essere inserita nel ViewGroup padre. In questo caso passeremo false perché la Vista sarà collegata al ViewGroup genitore altrove, da parte di alcuni del codice Android che chiamiamo. Quando si passa false come ultimo parametro a gonfiare (), il ViewGroup padre viene ancora utilizzato per i calcoli di layout della vista gonfiata, quindi non è possibile passare null come ViewGroup padre .
ViewGroup
parametro di onCreateView() è il ViewGroup padre in cui deve essere inserita la Vista del frammento. Questo è un ViewGroup all’interno dell’attività che “ospiterà” il frammento.
Bundle
parametro di onCreateView () è un pacchetto in cui il frammento può salvare i dati, proprio come in un’attività.
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
. Quindi, consente di iniziare con la definizione di frammenti xml di 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>
Come si può vedere il file di classe dei frammenti che sono una parte di questa attività sono definiti come class=”journaldev.com.frammenti.frammenti.TextFragment”
Il frammento di classi e il loro layout sono definiti come mostrato in frammenti di seguito.
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>
Il TextFragment comprende textviews con il nome e il numero della versione di Android.
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>
Il MenuFragment visualizza un ListView. Come possiamo vedere qui, il layout di ListView è simple_list_item_1 predefinito opposto al layout personalizzato che abbiamo creato per ListView nell’articolo precedente.
MainActivity richiama setContentView dal metodo onCreate, il gioco è fatto. I frammenti vengono chiamati dal file xml.
In alternativa possiamo aggiungere i frammenti dalla classe activity usando FragmentManager
come mostrato nello snippet sottostante:
getFragmentManager() .beginTransaction() .add(R.id.fragmentParentViewGroup, new MyFragment()) .commit();
Qui l’id fragmentParentViewGroup appartiene alla FrameLayout mostrato di seguito:
<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 Frammento di Applicazione di Esempio
di Seguito mostra l’output prodotto dal nostro progetto, si può vedere che i due frammenti sono qui presenti e, quando si seleziona uno di loro nella parte sinistra del frammento, dati viene popolata in destra del frammento.
È possibile scaricare finale progetto frammento Android dal link sottostante.