Cómo crear un fragmento

Puedes pensar en un fragmento como una sección modular de una actividad que tiene un ciclo de vida propio, recibe sus propios eventos de entrada y que puedes agregar o quitar mientras la actividad se esté ejecutando (algo así como una "subactividad" que puedes volver a usar en diferentes actividades). Esta lección muestra cómo extender la clase Fragment mediante el uso de la Biblioteca de compatibilidad de modo que la app siga siendo compatible con dispositivos que ejecuten versiones del sistema tan antiguas como Android 1.6.

En lugar de configurar los componentes dependientes en los métodos del ciclo de vida de tu elemento Fragment, deberías crear un componente que priorice el ciclo de vida. El componente puede controlar cualquier configuración requerida a medida que el elemento Fragment atraviesa su ciclo de vida. El componente que prioriza el ciclo de vida puede reutilizarse en otros elementos Fragment y Activity para evitar la duplicación de código, y reducir la cantidad de ajustes que debes configurar en los propios elementos. Para obtener más información, lee Cómo controlar ciclos de vida con componentes que los priorizan.

Antes de que comiences esta lección, debes configurar tu proyecto Android para poder usar la Biblioteca de compatibilidad. Si no la utilizaste anteriormente, configura tu proyecto para usar la v4. Para ello, sigue las instrucciones que se indican en el documento Configuración de la biblioteca de compatibilidad. No obstante, también puedes incluir la barra de app en tus actividades, para lo que deberás utilizar la biblioteca v7 appcompat, que es compatible con Android 2.1 (nivel de API 7) y también incluye las API Fragment.

Para obtener más información sobre cómo implementar fragmentos, consulta Elementos Fragment. También puede obtener más detalles explorando la app de muestra correspondiente.

Cómo crear una clase de Fragment

Para crear un fragmento, extiende la clase Fragment y luego reemplaza los métodos clave del ciclo de vida para insertar la lógica de tu app, tal como lo harías con una clase Activity.

Una de las diferencias al crear un Fragment es que debes usar la devolución de llamada onCreateView() para definir el diseño. De hecho, esta es la única devolución de llamada que necesitas para ejecutar un fragmento. Por ejemplo, aquí te mostramos un fragmento que especifica su propio diseño:

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) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.article_view, container, false);
    }
}

Al igual que una actividad, un fragmento debe implementar otras devoluciones de llamada de ciclo de vida que te permitan administrar su estado al agregarlo y quitarlo de la actividad, y mientras la actividad pasa de un estado a otro de su ciclo de vida. Por ejemplo, cuando se invoca al método onPause() de la actividad, cualquier fragmento presente en la actividad también recibe una llamada para onPause().

Puedes encontrar más información sobre el ciclo de vida del fragmento y los métodos de devolución de llamada en la guía para desarrolladores de Elementos Fragment.

Cómo agregar un elemento Fragment a una actividad usando XML

Si bien los fragmentos son reutilizables, los componentes modulares de la IU, cada instancia de una clase de Fragment, deben estar asociados a una FragmentActivity primaria. Puedes realizar esta asociación mediante la definición de cada fragmento en el archivo XML de diseño de tu actividad.

Nota: FragmentActivity es una actividad especial que se proporciona en la Biblioteca de compatibilidad para controlar fragmentos en versiones del sistema anteriores al nivel de API 11. Si la versión del sistema más antigua que admites es un nivel de API de 11 o más alto, puedes usar una Activity común.

Aquí te mostramos un ejemplo de archivo de diseño que agrega dos fragmentos a una actividad cuando la pantalla del dispositivo se considera "grande" (que se especifica con 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>

Sugerencia: Para obtener más información sobre la creación de diseños para distintos tamaños de pantalla, lee Cómo admitir diferentes tamaños de pantalla.

Luego aplica el diseño a tu actividad:

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);
    }
}

Si estás usando la biblioteca v7 appcompat, tu actividad debería extender AppCompatActivity, que es una subclase de FragmentActivity. Para obtener más información, lee Cómo agregar la barra de apps.

Nota: Cuando agregas un fragmento al diseño de una actividad mediante la definición del fragmento en el archivo XML de diseño, no puedes quitar el fragmento durante el tiempo de ejecución. Si piensas insertar y quitar tus fragmentos durante la interacción con el usuario, debes agregar el fragmento a la actividad cuando esta recién se inicia, tal como se muestra en Cómo crear una IU flexible.