Fragment es un componente de UI reutilizable en Android que se inserta en una Activity y se gestiona a través de FragmentManager. Cada fragmento tiene su propio ciclo de vida, layout y estado. Fragment simplifica la adaptación a diferentes tamaños de pantalla y la reutilización de código. Lea más en la guía oficial de Google.
Puntos clave
Fragment es un componente modular de interfaz de usuario de Android que representa una parte de la pantalla dentro de una Activity. Fragment puede gestionar su propio layout, manejar eventos del ciclo de vida y guardar su estado. Gracias a la modularidad, un mismo fragmento puede usarse en diferentes Activities y en diferentes dispositivos.
La API de Fragment apareció en Android 3.0 (Honeycomb, API 11) en 2011 para dar soporte a tabletas. Antes de eso, los desarrolladores tenían que crear Activities separadas para teléfono y tableta. Fragment permitió ensamblar una pantalla a partir de bloques independientes. En 2019, Google lanzó la biblioteca Jetpack Fragment con compatibilidad hacia atrás hasta API 4.
Según Google (2026), el 80% de las aplicaciones en Google Play usan Fragment de alguna forma. La biblioteca Jetpack Fragment se ha descargado más de 10 mil millones de veces a través de Google Play Services. Fragment sigue siendo un componente clave de la arquitectura Android incluso en la era de Jetpack Compose.
El ciclo de vida de Fragment es más complejo que el de Activity porque depende del estado de la Activity anfitriona. Fragment pasa por los mismos estados que Activity pero añade sus propios callbacks: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.
| Callback de Fragment | Equivalente en Activity | Propósito |
|---|---|---|
| onAttach | antes de onCreate | Fragment adjunto a Activity |
| onCreate | onCreate | Inicialización de datos no relacionados con UI |
| onCreateView | onCreate | Creación del layout mediante inflater |
| onViewCreated | onCreate | Vinculación de elementos UI tras crear la vista |
| onDestroyView | onDestroy | Eliminación de la vista, liberación de recursos UI |
| onDetach | onDestroy | Fragment desvinculado de Activity |
La principal diferencia del ciclo de vida de Fragment es la invocación de onCreateView y onDestroyView entre onCreate y onDestroy. Fragment puede existir sin UI (si onCreateView devuelve null). Tras la recreación de Activity, FragmentManager restaura los fragmentos automáticamente.
FragmentManager es la clase central para gestionar fragmentos en una Activity. Se encarga de añadir, eliminar, reemplazar fragmentos, gestionar la pila de retroceso y restaurar el estado. FragmentManager está disponible a través de supportFragmentManager (AndroidX) o fragmentManager (API antigua).
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Fragmento aún no añadido — creando
if (savedInstanceState == null) {
val transaction = this.supportFragmentManager
.beginTransaction()
transaction.add(R.id.fragment_container, ListFragment())
transaction.addToBackStack(null)
transaction.commit()
}
}
fun replaceFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit()
}
}Las transacciones de FragmentTransaction son atómicas. commit() programa la ejecución para el siguiente ciclo de Looper. Para ejecución inmediata use commitNow(). addToBackStack(null) añade la transacción a la pila de retroceso — el botón de retroceso deshará la operación.
Veamos los métodos clave del ciclo de vida de Fragment con un ejemplo en Kotlin. onCreateView crea un layout — a diferencia de Activity, el método debe devolver un View. onViewCreated se llama inmediatamente después, aquí es seguro encontrar elementos por id. onDestroyView es el último momento para limpiar referencias a la vista.
class DetailFragment : Fragment() {
private var _binding: FragmentDetailBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDetailBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textTitle.setText("Detalles")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}El patrón View Binding con _binding/binding garantiza que después de onDestroyView la referencia al layout se anula. Acceder a binding después de destruir la vista generará NullPointerException. Google recomienda este patrón para todos los fragmentos.
Para la transferencia de datos entre fragmentos, Android ofrece varios mecanismos. El más fiable es un ViewModel compartido entre fragmentos de una misma Activity. Fragment Result API es adecuado para eventos únicos. Los argumentos Bundle son para datos al crear un fragmento.
// ViewModel compartido para dos fragmentos
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// Fragmento A: envía evento mediante Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))
// Fragmento B: recibe evento
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API (añadido en Fragment 1.3.0) reemplaza los obsoletos setTargetFragment/onActivityResult. La API es type-safe, usa Bundle y no requiere conocer al receptor. Parent FragmentManager actúa como intermediario entre fragmentos.
La elección entre Fragment y Activity depende de la arquitectura de la aplicación. Fragment es obligatorio para layouts adaptativos (teléfono + tableta), para animaciones de transición personalizadas y para usar Jetpack Navigation. Activity es preferible para aplicaciones simples con una o dos pantallas.
| Criterio | Fragment | Activity |
|---|---|---|
| Velocidad de creación | Más rápida (componente ligero) | Más lenta (proceso del sistema) |
| Reutilización | Alta (un fragmento en diferentes Activities) | Baja (cada pantalla tiene su Activity) |
| Animación de transiciones | Flexible (FragmentTransaction) | Limitada (overridePendingTransition) |
| Conservación al rotar | Automática (el gestor restaura) | Manual (onSaveInstanceState) |
| Deep Links | A través de Navigation Component | Soporte nativo mediante intent-filter |
El enfoque moderno para trabajar con Fragment es Jetpack Navigation Component, que reemplaza la gestión manual de FragmentManager. La biblioteca proporciona NavGraph (grafo de navegación XML), NavHostFragment y Safe Args para transferencia de datos type-safe.
Jetpack Fragment library (androidx.fragment:fragment-ktx) incluye FragmentResult API, DialogFragment, BottomSheetDialogFragment e integración con componentes Lifecycle-aware. Desde 2026, Google recomienda usar Fragment solo a través de Jetpack Navigation, no directamente.
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@+id/listFragment">
<fragment
android:id="@+id/listFragment"
android:name=".ListFragment"
android:label="Lista">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="Detalles" />
</navigation>Preguntas frecuentes
FragmentManager es una clase que gestiona transacciones de fragmentos. Añade, elimina y reemplaza fragmentos en un contenedor de Activity. FragmentManager restaura el estado de los fragmentos al recrear la Activity y gestiona la pila de retroceso.
Fragment es una parte de la UI dentro de una Activity, no puede existir de forma independiente. Fragment sobrevive a la recreación de Activity al rotar la pantalla. Activity es una pantalla completa con su propio Lifecycle, Fragment depende del Lifecycle de Activity.
Fragment — cuando una pantalla consta de varios bloques independientes (pestañas, maestro-detalle, adaptación a tableta). Activity — cuando una pantalla no tiene bloques repetibles. Google recomienda Single Activity + múltiples Fragment.
Tres formas: a través de la Activity padre (un ViewModel compartido), a través de Fragment Result API (setFragmentResult), mediante argumentos Bundle al crear un Fragment. ViewModel es el método preferido ya que los datos se conservan durante la recreación.
Fragment Transaction es una operación atómica que cambia el conjunto de fragmentos. FragmentManager.beginTransaction() abre una transacción donde se puede llamar a add, remove, replace, hide, show. Cada transacción termina con commit() o commitNow().
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también