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
Si bien los fragmentos son componentes modulares y reutilizables de la IU, 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 del sistema más antigua que admites es API nivel 11 o superior, 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" (lo cual 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: Si deseas obtener más información acerca de cómo crear diseños para distintos 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.