Publicado el 20 de Octubre del 2018
882 visualizaciones desde el 20 de Octubre del 2018
641,3 KB
24 paginas
Creado hace 5a (07/06/2018)
Introducción
En realidad, las actividades abordadas en un capítulo anterior no son los únicos componentes de la
aplicación. Existen otros que responden a necesidades distintas.
Por ello, en este capítulo descubriremos los fragmentos, una especie de mini-actividades, que
permiten explotar plenamente pantallas de gran tamaño. Estudiaremos a continuación los servicios,
que permiten ejecutar en segundo plano una tarea sin interfaz gráfica. A continuación llegará el turno
a los receptores de eventos que se activan solamente tras la recepción de un mensaje.
Por último, si bien no son un componente principal de la aplicación hablando con propiedad,
ilustraremos la implementación de una lista, pues se trata de uno de los elementos más utilizados en
las aplicaciones.
Fragmento
La integración de Android en dispositivos con pantallas extra-grandes, tales como las tabletas táctiles, ha
revelado nuevas necesidades, en particular a la hora de utilizar plena, eficaz y fácilmente las grandes
resoluciones y el espacio disponible que proporcionan estas pantallas.
Los fragmentos, introducidos con la API 11 (Android 3.0) y generalizados para los smartphones en la API
14 (Android 4.0.1), ofrecen un método sencillo y económico en tiempo para adaptar la representación a
este espacio disponible.
Un fragmento puede verse como… un fragmento de actividad: que posee su propio layout e implementa el
código que gestiona los elementos presentes en dicho layout. De este modo, una actividad puede estar
compuesta por uno o varios fragmentos, según el espacio disponible en la pantalla.
El caso de uso típico de los fragmentos es el esquema Master/Detail, que puede traducirse como Vista
principal/Vista de detalle:
Existe un primer componente que presenta una lista de elementos.
La selección de un elemento - haciendo clic en él - ejecuta la representación de otro
componente que presenta los datos detallados acerca de dicho elemento.
En una tableta táctil con una pantalla lo suficientemente grande, ambos componentes pondrán
visualizarse en la misma pantalla, mientras que para un smartphone con una pantalla algo más pequeña
cada componente se mostrará uno a continuación del otro.
Los fragmentos proporcionan todas las funcionalidades necesarias para implementar este esquema.
Recuerde, si bien se introdujo con Android 3.0 (API 11), el concepto de fragmento puede
encontrarse en las versiones de Android 1.6 (API 4) y superiores importando la librería de
compatibilidad descendente de Android en el proyecto (consulte el capítulo El universo Android -
Entorno de desarrollo).
La clase madre de los fragmentos es la clase Fragment. De forma similar a las clases hijas ofrecidas por
la
el SDK, especializando
claseFragment que son DialogFragment, ListFragment y PreferenceFragment,representando
fragmentos especializados en funciones particulares.
la clase madre Activity, existen varias
clases hijas de
Para definir un fragmento hay que crear una clase que herede, directa o indirectamente, de la
claseFragment e implementar, llegado el caso, los métodos heredados.
1. Integración del fragmento
La integración de un fragmento con una actividad puede realizarse de forma declarativa o de forma
programática. Si no posee layout, el fragmento sólo puede agregarse de forma programática.
a. Modo declarativo
Recuerde, el modo declarativo permite describir el layout directamente en el código XML.
Para incluir un fragmento en el layout de una actividad, basta con utilizar la etiqueta fragment y
especificar en su atributo android:name el nombre de la clase del fragmento que se quiere
instanciar. Una vez instanciado y habiendo invocado al método onCreateView, la vista que se
recupera se insertará en el layout de la actividad en el lugar de la etiqueta fragment específica.
Como
configuran mediante
los
atributosandroid:layout_width y android:layout_height. También es posible asignar un
identificador mediante el atributo android:id o una cadena de caracteres mediante
el atributoandroid:tag. Si no se le asigna ninguno de estos atributos, el sistema utilizará el
identificador interno de la vista del fragmento.
otro widget,
cualquier
con
las
dimensiones
se
En lo que queda de capítulo, aparecen varios métodos que hacen referencia al identificador
único de la vista contenedora. En modo declarativo, este identificador corresponde
simplemente con el valor del atributo android:id especificado en la etiqueta fragment.
Sintaxis
<fragment android:name="nombre completo de la clase"
android:id="@[+][paquete:]id/nombre_recurso"
android:tag="recurso_texto"
android:layout_width="dimensión"
android:layout_height="dimensión"
... />
Ejemplo
<fragment
android:name="es.midominio.android.miaplicacion.MiFragmento"
android:id="@+id/mifragmento"
android:layout_width="match_parent"
android:layout_height="match_parent" />
b. Modo programático
En modo programático, un fragmento debe ubicarse en un componente (widget) ViewGroup de la
actividad padre. El gestor de fragmentos permite a la actividad padre realizar las operaciones relativas
a los fragmentos: carga, reemplazo, etc.
instancia del gestor de
La
el métodogetFragmentManager invocado desde la actividad que lo alberga.
Sintaxis
fragmentos, de
tipo FragmentManager,
la devuelve
public FragmentManager getFragmentManager ()
Ejemplo
FragmentManager fragmentManager = getFragmentManager();
Las operaciones relativas a los fragmentos deben realizarse dentro de transacciones. Una misma
transacción puede contener una o varias operaciones secuenciales. Esta transacción, o serie de
operaciones, se realiza de forma atómica. Es decir, que todas las operaciones contenidas en la
transacción forman un todo indivisible, y se realizarán todas prácticamente al mismo tiempo.
Para crear una transacción, hay que invocar al método beginTransaction del gestor de
fragmentos recuperado anteriormente. Éste devuelve la transacción bajo la forma de un objeto de
tipo FragmentTransaction.
Sintaxis
public abstract FragmentTransaction beginTransaction ()
Ejemplo
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
La transacción puede recibir a continuación una lista de operaciones relativas a los fragmentos, como
por ejemplo agregar o suprimir fragmentos.
Los métodos add del objeto de tipo FragmentTransaction permiten agregar un fragmento en
una vista contenedora. Estos métodos reciben como parámetro un objeto de tipo Fragment y bien el
identificador único de la vista contenedora que contiene el fragmento, o bien la etiqueta asociada al
fragmento, o bien ambas. Estos métodos devuelven el objeto de tipoFragmentTransaction de
cara a poder encadenar las llamadas a estos métodos.
El uso de una etiqueta es el único medio para identificar un fragmento que no posee vistas.
Las vistas de los fragmentos se agregan al contenedor en el orden de llamada al
métodoadd.
Sintaxis
public abstract FragmentTransaction add (int containerViewId,
Fragment fragment)
public abstract FragmentTransaction add (Fragment fragment,
String tag)
public abstract FragmentTransaction add (int containerViewId,
Fragment fragment, String tag)
Ejemplo
MiFragmento fragmento = new MiFragmento();
fragmentTransaction.add(R.id.vista_contenedora, fragmento);
Los métodos replace permiten reemplazar el o los fragmentos agregados a la vista contenedora por
un nuevo fragmento. Estos métodos reciben como parámetro el identificador único de la vista
contenedora, el nuevo fragmento de tipo Fragment, y eventualmente la etiqueta asignada al
fragmento. Este método devuelve el objeto de tipo FragmentTransaction en curso.
Sintaxis
public abstract FragmentTransaction replace (int containerViewId,
Fragment fragment)
public abstract FragmentTransaction replace (int containerViewId,
Fragment fragment, String tag)
Ejemplo
fragmentTransaction.replace(R.id.vista_contenedora, fragmento);
El método remove permite suprimir un fragmento y sus eventuales vistas de la vista contenedora.
Este método recibe como parámetro la instancia del fragmento que se quiere suprimir y devuelve el
objeto de tipo FragmentTransaction en curso.
Sintaxis
public abstract FragmentTransaction remove (Fragment fragment)
Ejemplo
fragmentTransaction.remove(fragmento);
La transacción así preparada debe ejecutarse invocando a su método commit. Si se ha solicitado
agregar esta transacción en la pila de las transacciones de fragmentos que detallamos más adelante,
este método devuelve un valor entero positivo identificando la transacción. En caso contrario, devuelve
un valor entero negativo.
Sintaxis
public abstract int commit ()
Ejemplo
fragmentTransaction.commit();
El gestor de fragmentos permite buscar la instancia de un fragmento particular utilizando bien el
identificador único de la vista contenedora o bien la etiqueta del fragmento. Para ello, el gestor
proporciona respectivamente los métodos findFragmentById y findFragmentByTag. Estos
métodos devuelven la instancia de tipo Fragment o null si ningún fragmento se corresponde con el
identificador.
Sintaxis
public abstract Fragment findFragmentById (int id)
public abstract Fragment findFragmentByTag (String tag)
Ejemplo
fragmentManager.findFragmentById(R.id.vista_contenedora);
2. Fragmentos y representación adaptativa
Combinando todas las nociones que hemos abordado en el libro hasta este punto, resulta bastante
sencillo construir un esquema de implementación de representación adaptativ
Comentarios de: Competencias Principales De La Aplicación Android (0)
No hay comentarios