Android Fragment Lifecycle
Hoy aprenderemos sobre el ciclo de vida de Android Fragment e implementaremos una única clase de actividad que consta de dos fragmentos en la aplicación Android.
Fragmento de Android
Fragment
la clase en Android se utiliza para crear interfaces de usuario dinámicas. El fragmento se debe usar dentro de la Actividad. Una gran ventaja de fragments es que simplifica la tarea de crear una interfaz de usuario para múltiples tamaños de pantalla. Una actividad puede contener cualquier número de fragmentos.
Un fragmento de Android no es por sí solo una subclase de vista como lo son la mayoría de los demás componentes de la interfaz de usuario. En su lugar, un fragmento tiene una vista en su interior. Es esta vista la que finalmente se muestra dentro de la actividad en la que vive el fragmento.
Debido a que un fragmento de Android no es una vista, agregarlo a una actividad parece algo diferente a agregar una vista (por ejemplo, TextView). Se agrega un fragmento a un grupo de vista dentro de la actividad. La vista del fragmento se muestra dentro de este grupo de vistas.
El siguiente diagrama muestra lo que sucede cuando se agrega un fragmento a una actividad:
Primero, la actividad obtiene una referencia al fragmento. Luego obtiene una referencia al ViewGroup en el que se renderizará la vista del fragmento. A continuación, la actividad añade el fragmento. A continuación, el fragmento crea su vista y la devuelve a la actividad. A continuación, la vista se inserta en el grupo de vistas principal y el fragmento está activo.
Ciclo de vida del fragmento
El ciclo de vida del fragmento de Android se ilustra en la imagen siguiente.
A continuación se muestran los métodos del ciclo de vida del fragmento.
-
onAttach()
: Este método se llamará primero, incluso antes de onCreate (), informándonos de que tu fragmento se ha adjuntado a una actividad. Se le pasa la Actividad que alojará su fragmento -
onCreateView()
: El sistema llama a esta devolución de llamada cuando es el momento de que el fragmento dibuje su interfaz de usuario por primera vez. Para dibujar una interfaz de usuario para el fragmento, se debe devolver un componente de vista desde este método, que es la raíz del diseño del fragmento. Podemos devolver null si el fragmento no proporciona una interfaz de usuario -
onViewCreated()
: Se llamará después de onCreateView(). Esto es particularmente útil cuando heredamos la implementación de onCreateView (), pero necesitamos configurar las vistas resultantes, como con un ListFragment y cuándo configurar un adaptador -
onActivityCreated()
:Esto se llamará después de onCreate () y onCreateView (), para indicar que el onCreate () de la actividad se ha completado. Si hay algo que se necesita inicializar en el fragmento que depende de que onCreate() de la actividad haya completado su trabajo, se puede usar onActivityCreated() para ese trabajo de inicialización -
onStart()
: Se llama al método onStart() una vez que el fragmento se hace visible -
onPause()
: El sistema llama a este método como primera indicación de que el usuario está dejando el fragmento. Por lo general, aquí es donde debe confirmar cualquier cambio que deba persistir más allá de la sesión de usuario actual -
onStop()
: El fragmento se detendrá llamando a onStop() -
onDestroyView()
: Se llama antes de onDestroy(). Esta es la contraparte de onCreateView () donde configuramos la interfaz de usuario. Si hay cosas que se necesitan limpiar específicas de la interfaz de usuario, entonces esa lógica se puede poner en onDestroyView () -
onDestroy()
: onDestroy () llamada para hacer la limpieza final del estado del fragmento, pero no se garantiza que sea llamada por la plataforma Android. -
onDetach()
: Se llama después de onDestroy (), para notificar que el fragmento se ha desvinculado de su actividad de alojamiento
Clases de fragmentos de Android
Se agregaron fragmentos a la API de Android en Honeycomb(API 11).
-
android.app.Fragment
: La clase base para todos fragmento de definiciones -
android.app.FragmentManager
: La clase para interactuar con objetos de fragmento dentro de una actividad -
android.app.FragmentTransaction
: La clase para realizar un conjunto atómico de operaciones de fragmento
Cuando se utiliza una biblioteca de paquetes de compatibilidad proporcionada por Google, se utilizan las siguientes clases para la implementación.
-
android.support.v4.app.FragmentActivity
: La clase base para todas las actividades que utilizan funciones de fragmento (y cargador) basadas en compatibilidad android.support.v4.app.Fragment
android.support.v4.app.FragmentManager
android.support.v4.app.FragmentTransaction
Android Fragment onCreateView()
Aquí hay un fragmento de muestra que usa onCreateView() para su implementación:
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()
el método obtiene un LayoutInflater, un ViewGroup y un Bundle como parámetros.
LayoutInflater
es un componente que puede crear instancias de vista basadas en archivos XML de diseño. Como puede ver, el ejemplo en realidad lo hace llamando a layout.inflate()
.
inflate()
El método toma tres parámetros: El id de un archivo XML de diseño (dentro de R. layout), un grupo de vista principal en el que se va a insertar la vista del fragmento, y un tercer booleano que indica si la Vista del fragmento inflada desde el archivo XML de diseño debe insertarse en el grupo de vista principal. En este caso, pasaremos false porque la vista se adjuntará al grupo de vista principal en otro lugar, por parte del código de Android que llamemos. Cuando pasa false como último parámetro a inflate (), el grupo de vista principal se sigue utilizando para los cálculos de diseño de la Vista inflada, por lo que no puede pasar null como grupo de vista principal .
ViewGroup
el parámetro de onCreateView () es el grupo de vista principal en el que se insertará la Vista del fragmento. Este es un ViewGroup dentro de la actividad que «alojará» el fragmento.
Bundle
el parámetro de onCreateView () es un paquete en el que el fragmento puede guardar datos, al igual que en una Actividad.
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
. Así que comencemos con la definición de los fragmentos en el diseño 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>
Como podemos ver, los archivos de clase de los fragmentos que forman parte de esta actividad se definen como class=»journaldev.com.fragments.fragments.TextFragment»
Las clases de fragmentos y sus diseños se definen como se muestra en los fragmentos a continuación.
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>
El fragmento de texto incluye textviews que contiene el nombre y el número de la versión de 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>
El menú muestra una vista de lista. Como podemos ver aquí, el diseño de ListView es por defecto simple_list_item_1 opuesto al diseño personalizado que creamos para ListView en el artículo anterior.
La actividad principal invoca el setContentView desde el método onCreate, eso es todo. Los fragmentos se llaman desde el archivo xml.
Alternativamente, podemos agregar los fragmentos de la clase activity usando FragmentManager
como se muestra en el fragmento de código a continuación:
getFragmentManager() .beginTransaction() .add(R.id.fragmentParentViewGroup, new MyFragment()) .commit();
Aquí el id fragmentParentViewGroup pertenece al FrameLayout que se muestra a continuación:
<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" />
La aplicación de ejemplo de fragmentos de Android
A continuación muestra la salida producida por nuestro proyecto, puede ver que dos fragmentos están presentes aquí y cuando selecciona cualquiera de ellos en el fragmento del lado izquierdo, los datos obtienen poblado en el fragmento del lado derecho.
Puede descargar el proyecto final de fragmentos de Android desde el enlace siguiente.