The Android Developer Challenge is back! Submit your idea before December 2.

Cómo crear un fragmento

Puedes pensar en un fragmento como una sección modular de una actividad que tiene su ciclo de vida propio, que 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). En esta lección, se muestra cómo extender la clase Fragment con la biblioteca de compatibilidad para que tu app siga siendo compatible con dispositivos que ejecutan versiones de sistema tan antiguas como Android 1.6.

En lugar de configurar tus componentes dependientes en los métodos del ciclo de vida de tu objeto Fragment, deberías crear un componente compatible con el ciclo de vida. El componente puede controlar cualquier configuración o anulación que se requiera a medida que tu objeto Fragment se mueva por su ciclo de vida. El componente compatible con el ciclo de vida se puede reutilizar en otros objetos Fragment y Activity a fin de evitar la duplicación de código y reducir la cantidad de configuración necesaria en los objetos Fragment y Activity. Para obtener más información, consulta Cómo manejar ciclos de vida con componentes optimizados para ciclos de vida.

Antes de que comiences esta lección, debes configurar tu proyecto Android para poder usar la biblioteca de compatibilidad. Si no utilizaste la biblioteca de compatibilidad anteriormente, configura tu proyecto para usar la v4 de la biblioteca: sigue las instrucciones del documento Configuración de la biblioteca de compatibilidad. Sin embargo, también puedes incluir la barra de la app en tus actividades mediante la biblioteca appcompat v7, que es compatible con Android 2.1 (API nivel 7) y también incluye las API de Fragment.

Para obtener más información sobre la implementación de fragmentos, consulta Fragmentos. También puedes obtener más información al explorar la app de muestra correspondiente.

Cómo crear una clase Fragment

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

Una diferencia al crear una clase 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:

Kotlin

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

    class ArticleFragment : Fragment() {
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup,
                         savedInstanceState: Bundle?): View {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.article_view, container, false)
        }
    }
    

Java

    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 llama al método onPause() de la actividad, cualquier fragmento de la actividad también recibe una llamada a 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 Fragmentos.

Cómo agregar un fragmento a una actividad con XML

Mientras los fragmentos son componentes modulares y reutilizables de la UI, cada instancia de una clase Fragment debe asociarse con una clase FragmentActivity superior. 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 proporcionada en la biblioteca de compatibilidad para manejar fragmentos en versiones del sistema anteriores a la API nivel 11. Si la versión de sistema más baja que admites la de API nivel 11 o más alto, puedes usar una clase 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 acerca de cómo crear diferentes diseños para diferentes tamaños de pantalla, consulta Compatibilidad con diferentes tamaños de pantalla.

Luego, aplica el diseño a tu actividad:

Kotlin

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

    class MainActivity : FragmentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.news_articles)
        }
    }
    

Java

    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 utilizando la biblioteca v7 appcompat, tu actividad debería extender AppCompatActivity, que es una subclase de FragmentActivity. Para obtener más información, consulta Adición de la barra de la app.

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 en el tiempo de ejecución. Si planeas intercambiar fragmentos durante la interacción del usuario, debes agregar el fragmento a la actividad cuando esta recién se inicia, como se muestra en Cómo crear una IU flexible.