Está en la página 1de 6

Fragment

Un fragment (vase el captulo Principios de programacin - 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 continuacin, el fragment se inicializa en la
llamada al mtodo onCreate, seguido de la creacin y de la carga de la interfaz del fragment
(mtodo onCreateView).

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


al mtodo onActivityCreatedindica el final del ciclo de creacin de la interfaz.

El mtodo onStart coincide con el paso del fragment a primer plano, seguido de la llamada
almtodo onResume (mismo funcionamiento que para una actividad - vase el captulo Principios de
programacin - Ciclo de vida de una actividad).

Cuando un fragment pasa a estar inactivo, la llamada al mtodo onPause permite ejecutar las
acciones adecuadas (deshabilitar actualizaciones, listener...). Despus de esta llamada, se invoca
almtodo onStop (el fragmento deja de estar en primer plano).

Si se destruye un fragment, se invocar respectivamente a los siguientes mtodos:

onDestroyView: destruccin de la vista.

onDestroy: destruccin 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:

Aplicacin 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.

Aplicacin 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 automticamente 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 (vase el atributo class).

Fragment 2: representa la vista detallada de una versin 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 mtodo OnActivityCreated se invoca en la creacin de un fragment.

En este mtodo, el adapter se inicializa mediante la tabla values.

Despus, la lista se asocia al adapter.

El mtodo 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 ningn problema en la inicializacin, significa que la aplicacin est


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

Si la inicializacin 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 versin 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 versin, 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 orientacin en la inicializacin de la vista y, por lo tanto, adoptar el
comportamiento adecuado en funcin de cada caso.
Cree un archivo XML que represente la vista de detalles. Contendr el fragment que permite
mostrar los detalles de una versin 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 continuacin, 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 parmetro
(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 despus al modo apaisado.

Con lo que obtendr los siguientes resultados:

Modo vertical - Lista de versiones de Android


Modo vertical - Detalle de una versin de Android

Modo apaisado

También podría gustarte