Los fragmentos
Presentación
La aplicación LocDVD está destinada a difundirse en smartphones y tabletas. Si para los smartphones las pantallas implementadas son satisfactorias, no ocurre lo mismo con las tabletas: la lista de DVD aparece en la totalidad de la pantalla, lo cual resulta poco legible. El espacio disponible en las tabletas puede explotarse de una manera más eficaz si se utilizan, principalmente, fragmentos.
La noción de fragmento se introdujo en Android con la versión 3 (Android Honeycomb, específica para las tabletas) para ayudar a los desarrolladores a tener en cuenta las tabletas. Integrados después en Android 4, los fragmentos se han impuesto progresivamente hasta convertirse en uno de los elementos esenciales para la programación de aplicaciones en Android.
1. Fragmento (fragment) y actividad
Un fragmentoo (fragment, en inglés) debe considerarse como una subactividad desde el punto de vista de la programación o, si lo miramos desde el punto de vista de diseñar aplicaciones, como un fragmento de la pantalla (por oposición a una actividad, que utiliza necesariamente la pantalla íntegra).
Los fragmentos, a diferencia de las actividades, no son elementos autónomos: cada fragmento, para poder mostrarse, debe estar integrado en una actividad.
Una actividad puede contener uno o varios fragmentos, cada uno de ellos independiente de los demás.
Como hemos visto...
Trabajar con los fragmentos
La adaptación de la aplicación a las tabletas empieza con una modificación de la actividad principal MainActivity: en lugar de gestionar directamente la lista de DVD, MainActivity debe simplemente cargar un fragmento, la lista se gestionará dentro de este fragmento.
De modo que es preciso, en primer lugar, crear esta nueva clase ListDVDFragment e integrar el código que gestiona la lista de DVD, y a continuación modificar la actividad MainActivity así como su archivo de layout para integrar el fragmento creado.
1. Creación del fragmento
En el explorador del proyecto Android Studio, cree una clase ListDVDFragment en el paquete com.ejemplo.locdvd.
Esta clase debe heredar de android.support.v4.app.Fragment: indique que la clase hereda de Fragment:
public class ListDVDFragment extends Fragment {
}
Sitúe el cursor de texto antes del término Fragment y presione [Alt][Enter]: seleccione la opción Import Class en la lista desplegable que se muestra.
Aparece una segunda lista desplegable, que permite escoger entre dos clases: android.app.Fragment y android.support.v4.app.Fragment: seleccione la clase de soporte (la segunda opción).
Android Studio agrega el import correspondiente.
paquete com.ejemplo.locdvd;
import android.support.v4.app.Fragment;
public class ListDVDFragment extends Fragment {
}
Si para las actividades, el vínculo entre el código de la actividad y el archivo de layout se hace en el método onCreate, para los fragmentos, este vínculo se realiza en el método onCreateView.
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
-
LayoutInflater inflater: este objeto permite crear la vista que se mostrará por pantalla.
-
ViewGroup container: representa la vista madre del fragmento.
-
Bundle savedInstanceState: como con las actividades, este objeto es distinto de nulo en el caso de que el fragmento se haya recreado (tras una rotación de la pantalla, por ejemplo).
El código de este método onCreateView difiere ligeramente del código clásico del método onCreate de una actividad: en vez de invocar setContentView para vincular el archivo de layout, hay que invocar aquí el método...
Implementación del modelo Master/Detail
De momento, la aplicación LocDVD no es óptima para las tabletas: en efecto, estas, utilizadas principalmente en modo apaisado, presentan una visualización mucho más ancha que alta. La lista de DVD mostrada en modo apaisado en una pantalla grande pierde legibilidad.
La plantilla Master/Detail permite resolver este problema de manera sencilla: en vez de dedicar íntegramente la pantalla a la visualización de la lista, prevé utilizar solo una parte, dejando el resto para la visualización del detalle del elemento seleccionado en la lista.
Esta plantilla puede resumirse en los siguientes esquemas:
Para los smartphones, el encadenamiento de las pantallas Lista/Detalle es el siguiente:
El usuario visualiza la lista en el conjunto de la pantalla. Cuando selecciona un elemento de la lista haciendo clic en él, se carga una segunda pantalla que presenta los detalles del elemento seleccionado.
En la vista tableta, una única pantalla muestra, a la vez, la lista y el detalle:
1. Implementación del layout
Sería posible implementar la visualización previa para las tabletas sin recurrir a fragmentos: para ello habría que desarrollar un layout específico que muestre al mismo tiempo un componente listView -en la parte izquierda de la pantalla- y un conjunto de componentes para la información relativa al DVD seleccionado.
Sin embargo, esto implica desarrollar una versión de la pantalla específica para las tabletas, lo cual representa una carga de trabajo suplementaria.
Los fragmentos permiten minimizar los desarrollos suplementarios: cada zona de la pantalla se define en un fragmento y la aplicación muestra uno o dos fragmentos según si el usuario trabaja en un smartphone o en una tableta.
Hay que implementar, por tanto, un archivo de layout que autorice la visualización de ambos fragmentos uno al lado del otro y, a continuación, detectar en tiempo de ejecución si hay que mostrar el layout con un único fragmento o el correspondiente a dos fragmentos.
El administrador de recursos permite implementar fácilmente este esquema de diseño utilizando calificadores de recursos, como vimos en la sección Gestionar la fragmentación del capítulo Preparación del proyecto LocDVD.
Así, definiendo una carpeta de layout específica...