Está en la página 1de 6

Fragment

Un fragment (véase el capítulo Principios de programación - Componentes Android) es un compoenente


que debe adjuntarse a una actividad para poder utilizarse. Su ciclo de vida se parece al de la actividad
que lo contiene pero tiene algunas particularidades.

1. Ciclo de vida de un fragment


La primera etapa del ciclo de vida de un fragment se corresponde con el instante en que el fragment
se adjunta a la actividad que lo contiene (onAttach). A continuación, el fragment se inicializa en la
llamada al método onCreate, seguido de la creación y de la carga de la interfaz del fragment
(método onCreateView).

Una vez que la actividad padre y el fragment se han creado, la llamada


al método onActivityCreatedindica el final del ciclo de creación de la interfaz.

El método onStart coincide con el paso del fragment a primer plano, seguido de la llamada
almétodo onResume (mismo funcionamiento que para una actividad - véase el capítulo Principios de
programación - Ciclo de vida de una actividad).

Cuando un fragment pasa a estar inactivo, la llamada al método onPause permite ejecutar las
acciones adecuadas (deshabilitar actualizaciones, listener...). Después de esta llamada, se invoca
almétodo onStop (el fragmento deja de estar en primer plano).

Si se destruye un fragment, se invocará respectivamente a los siguientes métodos:

onDestroyView: destrucción de la vista.

onDestroy: destrucción del fragment.

onDetach: el fragment se desvincula de la actividad que lo contiene.

2. Ejemplo
En el siguiente ejemplo, se creará una vista compuesta de dos secciones:

Aplicación en modo vertical: compuesta por dos actividades. La primera representa la lista
de versiones de Android y la segunda representa la vista de detalles que se muestra cuando
el usuario hace clic en un elemento de la lista.

Aplicación en modo apaisado: compuesta por una única actividad pero con dos fragments.
En el momento en que el usuario hace clic en la lista que se encuentra en el primer fragment,
el segundo automáticamente se actualizará con los detalles.

Para empezar, cree en la carpeta layout un archivo XML que represente la vista en modo
apaisado (vista compuesta de dos fragments).

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

<fragment
android:id="@+id/listFragment"
android:layout_width="150dip"
android:layout_height="match_parent"
class="com.eni.android.fragment.ListFragment" >
</fragment>
<fragment
android:id="@+id/detailFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.eni.android.fragment.DetailFragment" >
</fragment>

</LinearLayout>

Este archivo se compone de dos fragments:

Fragment 1: representa una lista de versiones de Android. Se declara en el


archivoListFragment (véase el atributo class).

Fragment 2: representa la vista detallada de una versión de Android. Se declara en el


archivo DetailFragment.

Ahora, implemente el primer fragment (lista de versiones de Android) heredando de la


claseListFragment.

public class ListFragment extends android.app.ListFragment {

private String[] values = {"Cupcake", "Donut", "Eclair", "Froyo",


"Gingerbread", "Honeycomb", "Ice Cream Sandwich", "Jelly Bean"};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);

@Override
public void onListItemClick(ListView l, View v, int position,
long id) {
String item = (String) getListAdapter().getItem(position);
DetailFragment fragment = (DetailFragment)
getFragmentManager().findFragmentById(R.id.detailFragment);
if (fragment != null && fragment.isInLayout()) {
fragment.setText(item);
} else {
Intent intent = new
Intent(getActivity().getApplicationContext(),
DetailActivity.class);
intent.putExtra("value", item);
startActivity(intent);
}

El método OnActivityCreated se invoca en la creación de un fragment.

En este método, el adapter se inicializa mediante la tabla values.

Después, la lista se asocia al adapter.

El método onListItemClick se sobrecarga para gestionar el clic en un elemento de la lista:

Se obtiene el elemento que ha recibido el clic usando el adapter.


Se inicializa el fragment que sirve para mostrar los detalles.

Si no se ha encontrado ningún problema en la inicialización, significa que la aplicación está


enmodo apaisado y, por lo tanto, que se puede usar el fragment de detalles. En caso
contrario la aplicación está en modo vertical.

Si la inicialización funciona correctamente, permite definir el texto que se muestra en el


fragment de detalles.

En caso contrario, hay que ejecutar la actividad de detalles y no el fragment de detalles.

Ahora, hay que implementar el fragment que sirve para mostrar los detalles:

public class DetailFragment extends Fragment {


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.details,
container, false);
return view;
}

public void setText(String item) {


TextView view = (TextView)
getView().findViewById(R.id.detailsText);
view.setText(item);
}
}

Una vez que se han realizado estos pasos, el modo apaisado estará correctamente implementado.

El siguiente paso consiste en implementar las interfaces y los tratamientos para el modo vertical. Para
ello, hay que crear la carpeta layout-port que contendrá una segunda versión del archivomain.xml.

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

<fragment
android:id="@+id/listFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.eni.android.fragment.ListFragment" />

</LinearLayout>

En esta versión, el archivo se compone únicamente de un fragment (el que muestra la lista de
versiones de Android). Las diferencias entre el archivo main.xml en modo vertical y en modo
apaisado permiten identificar la orientación en la inicialización de la vista y, por lo tanto, adoptar el
comportamiento adecuado en función de cada caso.
Cree un archivo XML que represente la vista de detalles. Contendrá el fragment que permite
mostrar los detalles de una versión de Android en modo vertical.

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<fragment
android:id="@+id/detailFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.eni.android.fragment.DetailFragment" />

</LinearLayout>

Finalmente, se han separado los dos fragments que se encontraban en el mismo archivo (modo
apaisado) en dos archivos diferentes (modo vertical).

A continuación, hay que crear la actividad que permite gestionar la vista de detalles.

public class DetailActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.details_activity_layout);
Bundle extras = getIntent().getExtras();
if (extras != null) {
String s = extras.getString("value");
TextView view = (TextView)
findViewById(R.id.detailsText);
view.setText(s);
}

}
}

Esta actividad carga el nuevo layout y muestra la cadena de caracteres que se pasa como parámetro
(extras).

Para finalizar, hay que implementar la actividad principal del ejemplo:

public class FragmentExampleActivity extends Activity {


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

Y el archivo de manifiesto que contiene las diferentes declaraciones:

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".FragmentExampleActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".DetailActivity"></activity>
</application>

Ahora puede probar el ejemplo, empezando en modo vertical y pasando después al modo apaisado.

Con lo que obtendrá los siguientes resultados:

Modo vertical - Lista de versiones de Android


Modo vertical - Detalle de una versión de Android

Modo apaisado

También podría gustarte