Creando un fragmento

Esta lección te enseñará a

  1. Crear un fragmento
  2. Añadir un fragmento a una actividad usando XML

También deberías leer

Puedes pensar en un fragmento como en una sección modular de una actividad, que tiene su propio ciclo de vida, recibe sus propios eventos de entrada, y que puedes añadir o quitar mientras la actividad se está ejecutando (un poco como una "subactividad" que puedes reutilizar en distintas actividades). Esta lección muestra cómo extender la clase Fragment usando la librería de soporte para que tu aplicación sea compatible con dispositivos que ejecuten Android 1.6 o superior.

Nota: Si por alguna razón decides que el nivel API mínimo que requiere tu aplicación es 11 o superior, no necesitas usar la librería de soporte y en su lugar puedes utilizar la clase Fragment y las APIs relacionadas incluídas con la plataforma. Simplemente ten en cuenta que esta lección está enfocada en utilizar las APIs de la librería de soporte, que utiliza un paquete y algunos nombres distintos de las versiones incluídas en la plataforma.

Crear un fragmento


Para crear un fragmento, extiende la clase Fragment y sobreescribe los métodos de ciclo de vida necesarios para insertar la lógica de tu aplicación, de forma similar a como lo harías con la clase Activity.

Una diferencia a la hora de crear un Fragment es que debes usar el método de retrollamda onCreateView() para definir la interfaz de usuario. De hecho, esta es la única retrollamada que necesitas implementar para usar un fragmento. Por ejemplo, a continuación se muestra un sencillo fragmento que especifica su propia interfaz de usuario:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;

public class ArticleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
        // Inflamos la interfaz de usuario para este fragmento
        return inflater.inflate(R.layout.article_view, container, false);
    }
}

De igual forma que con las actividades, un fragmento debería implementar otras retrollamadas de ciclo de vida que te permitan gestionar su estado al ser añadido o quitado de la actividad y cuando la actividad transiciona entre sus estados de ciclo de vida. Por ejemplo, cuando se llama al método onPause() de la actividad, todo fragmento de la actividad también recibe una llamada a su método onPause().

Hay más información disponible acerca del ciclo de vida de los fragmentos y sus métodos de retrollamada en la guía de desarrollo de Fragmentos.

Añadir un fragmento a una actividad usando XML


Aunque los fragmentos son componentes de interfaz de usuario reusables y modulares, cada instancia de la clase Fragment debe estar asociada con una FragmentActivity padre. Puedes crear esta asociación definiendo cada fragmento en el archivo XML de interfaz de usuario de tu actividad.

Nota: FragmentActivity es un tipo especial de actividad que proporciona la librería de soporte para manejar fragmentos en versiones del sistema anteriores al nivel API 11. Si la mínima versión del sistema que soportas es el nivel API 11 o superior, puedes utilizar una Activity normal.

A continuación se muestra un archivo de interfaz de usuario de ejemplo que añade dos fragmentos a una actividad cuando la pantalla del dispositivo se considera grande (especificado por el calificador large en el nombre del directorio).

res/layout-large/news_articles.xml:

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

    <fragment android:name="com.example.android.fragments.HeadlinesFragment"
              android:id="@+id/headlines_fragment"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

    <fragment android:name="com.example.android.fragments.ArticleFragment"
              android:id="@+id/article_fragment"
              android:layout_weight="2"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

</LinearLayout>

Consejo: Para más información sobre la creación de interfaces de usuario para distintos tamaños de pantalla, lee Soportando distintos tamaños de pantalla.

Así es como una actividad aplicaría esta interfaz de usuario:

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);
    }
}

Nota: Cuando añades un fragmento a la interfaz de usuario de una actividad definiendo el fragmento en el archivo XML de interfaz de usuario, no puedes quitar el fragmento en tiempo de ejecución. Si tienes pensado añadir y quitar fragmentos durante la interacción con el usuario, debes añadir el fragmento a la actividad cuando se inicia la actividad, tal y como se muestra en la siguiente lección.