Android 1

93
Aplicaciones en Android iDatacubo Por: Dany Orrego KitKat

Transcript of Android 1

Page 1: Android 1

Aplicaciones en Android

iDatacuboPor: Dany Orrego

KitKat

Page 2: Android 1

Diseño de aplicaciones Android

Page 3: Android 1

AndroidSistema Operativo móvil que se basa en una versión modificada de Linux. Tiene un modelo de desarrollo sencillo. Algunas compañías tienen desarrollos propios. La principal ventaja de adoptar Android es que ofrece un enfoque unificado para el desarrollo de aplicaciones.

http://www.android.com/kitkat/index.html

Page 4: Android 1

ComScore

Page 5: Android 1
Page 6: Android 1

Algunas Cifras90% del mercado a Septiembre 2013 está dominado por Google Android OSy IOS

OEM (Original Equipment Manufacturer)APPLE y SAMSUNG -> 100% cada año y últimos 2 100% vs 400%.

BrandingFacebook5 Apps Google

Gasto de consumo de tiempoCerca de superar al PC, multiplataforma

Page 7: Android 1

Algunas Cifras

Page 8: Android 1

Fundamentos Android• Las aplicaciones Android están escritas en Lenguaje JAVA*.• El Android SDK compila el código (Con datos y archivos de recursos) en un paquete

(.apk).• Todo el código en un simple .apk es considerado como una aplicación y es el archivo

que los dispositivos en Android usan para instalar la aplicación.• Cuando se instala una aplicación en un dispositivo, cada aplicación vive en su propio

recinto de seguridad (Security Sandbox).• Andorid OS es multiusuario en el cual cada aplicación es un usuario diferente (Por

defecto, el sistema asigna un único ID de usuario Linux).• El Sistema configura todos los permisos para todos los archivos en la aplicación para

el ID de Usuario.• Cada proceso tiene su propia maquina virtual (Isolation).• Por defecto cada aplicación corre en su propio proceso Linux.• Por medio de los servicios del sistema (System Services) se puede compartir

información con otras aplicaciones.• Recursos: No son código fuente. Imágenes, Cadenas, Archivos de Layout, et.

Page 9: Android 1

Principio de Privilegios MínimosCada Aplicación, por defecto, puede acceder únicamente los componentes que requiera para realizar el trabajo y ningún otro (activities, services, content providers etc).

Esto crea un ambiente de seguridad en el cual una aplicación no puede acceder a partes del sistema para los cuales no se tiene autorización.

Una aplicación puede requerir permisos para acceder a:•Datos del dispositivo•Contactos•Mensajes•Almacenamiento (Tarjetas SD)•Camara•Bluetooth•GPS

Los permisos se otorgan al usuario generalmente en tiempo de instalación.

Archivo MANIFEST

Page 10: Android 1

Android MVC y MVVMEl patrón MVVM (Model View ViewModel) es una variación del patrón MVC (Model View Controller). El modelo y la vista básicamente son los mismos que en MVC, donde encontramos la diferencia principal es en Controller vs ViewModel. El ViewModel es un mediador entre el modelo y la vista, es el responsable de exponer los datos a la vista para que ésta los muestre a través de comandos (basados en eventos) que la vista puede utilizar para comunicarse con el ViewModel.

Es muy fácil deducir el alto grado de desacoplamiento que tenemos utilizando el patrón arquitectónico MVVM, lo que nos proporciona dos grandes ventajas: Facilidad para realizar UnitTest y sobre todo, facilita construir aplicaciones sin ninguna responsabilidad en la vista más que mostrar datos e interactuar con el usuario.

Page 11: Android 1

Android

Page 12: Android 1

Frameworks y Lenguajes

HTML, CSS, Javascript

PhoneGapXamarinAppcelerator TitaniumMvvmCross

Page 13: Android 1

Principios de Diseño• Interfaz amigable e intuitiva.• Animaciones cuidadosamente colocadas.• Efectos sonoros oportunos.• Los objetos reales son más divertidos que los

botones y los menús.• Reducir el esfuerzo cognitivo necesario para realizar

una tarea.• Permitir la personalización.• Aprender las preferencias de los usuarios.• Simplicidad, frases cortas, palabras sencillas.• Las imágenes y los iconos son más rápidas que las

palabras.• El Sistema decide por mi, pero me deja definir

finalmente (actuar en vez de preguntar primero).

Page 14: Android 1

Principios de Diseño• Sólo muestre lo que se necesita cuando lo

necesita.• Siempre se debe saber donde estoy

(conocer el camino).• Nunca perder los archivos, datos,

configuraciones, personalizaciones.• Las funcionalidades deben actuar siempre

igual, sin cambios sutiles.• Solo se debe interrumpir si es importante.• Memoria muscular, trucos que funcionan.

Page 15: Android 1

Principios de Diseño• Mensajes no técnicos para errores.• Divide y vencerás. Tareas complejas en pasos más

pequeños.• No todas las acciones son iguales, se debe decidir que

es lo más importante, que sea fácil y rápido de usar.

Page 16: Android 1

Arquitectura de AndroidEl Sistema operativo Android se divide en 5 secciones:

Page 17: Android 1

Componente de Aplicación

Componentes de aplicación son los componentes esenciales de una aplicación Android. Cada componente es un punto diferente a través del cual el sistema puede entrar a una aplicación. No todos los componentes son los puntos de entrada reales para el usuario y algunos dependen unos de otros, pero cada uno existe como una entidad propia y juega un rol específico de cada uno es un elemento exclusivo que ayuda a definir el comportamiento general de la aplicación.

Page 18: Android 1

Componente de AplicaciónHay cuatro tipos diferentes de componentes de la aplicación. Cada tipo tiene un propósito distinto y tiene un ciclo de vida diferente que define cómo se crea y se destruye el componente.Estos son los cuatro tipos de componentes de la aplicación:

•Activities•Services•Content providers•Broadcast receivers

Page 19: Android 1

Componente de Aplicación: Activities

Una actividad representa una única pantalla con un interfaz de usuario. Por ejemplo, una aplicación de correo electrónico puede tener una actividad que muestra una lista de nuevos mensajes de correo electrónico, otra actividad para componer un correo electrónico, así como otra actividad para los correos electrónicos de lectura. Aunque las actividades trabajan juntos para formar una experiencia de usuario coherente en la aplicación de correo electrónico, cada uno es independiente de los demás. Como tal, una aplicación diferente puede iniciar cualquiera de estas actividades (si la aplicación de correo electrónico lo permite). Por ejemplo, una aplicación de cámara puede iniciar la actividad en la aplicación de correo electrónico que compone el correo nuevo, con el fin de que el usuario compartir una imagen.

Una actividad es una subclase de Activity y se puede aprender más sobre esto en la guía para desarrolladores de Actividades.

Page 20: Android 1

Componente de Aplicación: Services

Un servicio es un componente que se ejecuta en segundo plano para realizar operaciones de larga duración o para realizar un trabajo de procesos remotos. Un servicio no proporciona una interfaz de usuario. Por ejemplo, un servicio puede reproducir música en segundo plano mientras el usuario está en otra aplicación, o puede obtener datos mediante la red sin bloquear la interacción del usuario con una actividad. Otro componente, tal como una actividad, puede iniciar un servicio y dejar que se ejecute o se unen a ella con el fin de interactuar con él.Un servicio se implementa como una subclase de Service y se puede aprender más sobre esto en la guía para desarrolladores Servicios.

Page 21: Android 1

Componente de Aplicación: Content Providers

Un Proveedor de Contenido gestiona un conjunto compartido de datos de la aplicación. Puede almacenar los datos en el sistema de archivos , una base de datos SQLite, en la web, o tener acceso a cualquier otro lugar de almacenamiento permanente de la aplicación. A través del Proveedor de contenido, otras aplicaciones pueden consultar o incluso modificar los datos ( si el Proveedor de Contenido lo permite) . Por ejemplo, el sistema Android proporciona un proveedor de contenidos que gestiona la información de contactos del usuario . Como tal, cualquier aplicación con los permisos adecuados puede consultar parte del proveedor de contenidos (como ContactsContract.Data) para leer y escribir información sobre una persona en particular.

Los Proveedores de Contenido también son útiles para la lectura y escritura de los datos que son privados a la aplicación y no se comparten. Por ejemplo, el Notepad utiliza un Proveedor de Contenido para guardar notas.

Un Proveedor de Contenido se implementa como una subclase de ContentProvider y debe implementar un conjunto estándar de APIs que permiten a otras aplicaciones llevar a cabo las transacciones.

Page 22: Android 1

Componente de Aplicación: Broadcast ReceiversUn Broadcast Receiver es un componente que responde a mensajes de difusión para todo el sistema. Muchas emisiones se originan en el sistema-por ejemplo, una emisión de anunciar que la pantalla se ha apagado, la batería está baja, o una imagen fue capturada. Las aplicaciones también pueden iniciar las emisiones, por ejemplo, para permitir que otras aplicaciones sepan que algunos datos se han descargado en el equipo y están disponibles para que los utilicen. Aunque los Broadcast Receivers no tienen una interfaz de usuario, que pueden crear una Status Bar Notification (Barra de Estado de Notificación) para alertar al usuario cuando se produce un evento de difusión.Broadcast Receivers es como una "puerta de entrada» (Gateway) a otros componentes y está destinado a hacer una cantidad muy mínima de trabajo. Por ejemplo, se podría iniciar un servicio para realizar un trabajo basado en el evento.Un Broadcast Receiver se implementa como una subclase de BroadcastReceiver y cada emisión se entrega como un objeto Intent. Para obtener más información, consulte la clase BroadcastReceiver.

Page 23: Android 1

Componente de Aplicación: Broadcast ReceiversImplementacion:

Un Broadcast Receiver es un Componente Android que permite registrar eventos del Sistema o de una Aplicacion. Todos los Receivers registrados para un evento notificaran al Runtime de Android una vez a sucedido el evento.

Por ejemplo, una aplicacion puede registrar el Evento del Sistema ACTION_BOOT_COMPLETED el cual es disparado una vez el Sistema Android completo el proceso de boot o arranque del sistema.

Un Receiver puede ser registrado via el archivo AndroidManifest.xml.

Como alternativa a la realización de un registro estático, se puede registrar un Broadcast Receiver dinámicamente vía el método Context.registerReceiver().

Si el Evento para el cual el Broadcast Receiver sucede o pasa el método onReceive() de el Receiver es llamado por el Sistema Android.

Page 24: Android 1

Android SDK Manager

Page 25: Android 1

Proyecto Android

Page 26: Android 1

Proyecto Android

Page 27: Android 1

Proyecto Android

Page 28: Android 1

Proyecto Android

Page 29: Android 1

Proyecto Android

Page 30: Android 1

Proyecto Android

Page 31: Android 1

AVD: Android Virtual DeviceUn AVD es una instancia de emulador que le permite modelar un dispositivo. Todo AVD consta de un perfil hardware, un mapeo a una imagen de sistema, al igual que almacenamiento emulado, como una tarjeta de memoria SD (Secure Digital). Permite la creacion de tantos AVD como se requiera para poder probar las aplicaciones con diferentes configuraciones.

Page 32: Android 1

AVD: Android Virtual Device

Page 33: Android 1

AVD: Shortcuts

Page 34: Android 1

Anatomia de un Proyectosrc: Codigo Fuente en java.gen: Codigo R.java generado por compilador que hace referencia a todos los recursos encontrados en el proyecto.libs: Librerias.assets: Contiene elementos activos de la aplicacion como HTML, archivos de texto, bases de datos etc.bin: Los archivos creados o compilados. .apk binario.res: Contiene todos los recursos utilizados en la aplicacion. drawable, layout y values.AndroidManifest.xml: Caracteristicas de la aplicacion, filtros y permisos.strings.xml: Se utiliza para almacenar las constantes y cadenas reutilizables o por localizacion.

El codigo que conecta la actividad a la interfaz de usuario (activity_forma.xml) es el metodo setContentView() en el archivo .java.

Page 35: Android 1

Ejecutar la Aplicación

Page 36: Android 1

Ejecutar la Aplicación

Page 37: Android 1

Ejecutar la Aplicación

Page 38: Android 1

ActividadesLa interfaz gráfica de usuario de una aplicación Android se construye utilizando una jerarquía de objetos View (vista) y ViewGroup (grupo de vistas). Normalmente los objetos View son controles de interfaz de usuario como botones o campos de texto y los objetos ViewGroup son contenedores de vistas invisibles que definen cómo se distribuyen las vistas hijas, como una rejilla o una lista vertical.

Android proporciona un vocabulario XML que se corresponde con las subclases de View y ViewGroup de forma que se puede definir una interfaz de usuario en XML usando una jerarquía de elementos de interfaz de usuario.

Page 39: Android 1

Actividades

Borramos los componentes internos y cambiamos el RelativeLayout por LinearLayoutY la orientacion la asignamos en Horizontal

Page 40: Android 1

Actividades (fragment)

Borramos los componentes internos y cambiamos el RelativeLayout por LinearLayoutY la orientacion la asignamos en Horizontal

Page 41: Android 1

Actividades (fragment)

Page 42: Android 1

ActividadesLinearLayout es un grupo de vistas (una subclase de ViewGroup) que distribuye las vistas hijas con una orientación horizontal o vertical, según lo especificado por el atributo android:orientation. Cada hijo de un LinearLayout se muestra en pantalla en el mismo orden en que aparece en el XML.

Los otros dos atributos, android:layout_width y android:layout_height, son requeridos por todas las vistas para poder especificar su tamaño.

Como el LinearLayout es la vista raíz en la interfaz, debería llenar todo el espacio disponible para la aplicación estableciendo su ancho y alto a "match_parent" (coincidir con el padre). Este valor declara que la vista debería expandir su ancho y alto para coincidir en ancho y alto con la vista padre.

Page 43: Android 1

Actividades

Para crear un campo de texto editable por el usuario, añade un elemento <EditText> dentro del<LinearLayout>.

Page 44: Android 1

Actividades

android:id Proporciona un identificador único para la vista que puedes utilizar para referenciar el objeto en el código de la aplicación, por ejemplo, para leer y manipular el objeto. Es necesario usar el símbolo arroba (@) cuando referencias un objeto recurso desde XML. Viene seguido por el tipo de recurso (id en este caso), una barra diagonal, y el nombre del recurso (txtUsuario). El símbolo más (+) antes del tipo de recurso sólo se utiliza cuando se esta definiendo un ID de recurso por primera vez. Cuando se compila la aplicación, las herramientas del SDK utilizarán el nombre del ID para crear un nuevo ID de recurso en el archivo gen/R.java del proyecto haciendo referencia al elemento EditText. Una vez se haya declarado el ID de recurso de esta forma, otras referencias a este ID no necesitarán del signo más. Usar el signo más sólo es necesario cuando especificamos un nuevo ID de recurso y no es necesario para recursos concretos como cadenas de texto y diseños.

Page 45: Android 1

ActividadesObjetos de Recurso

Un objeto recurso no es más que un nombre único que se le da a un número entero asociado a un recurso de la aplicación, como un mapa de bits, un archivo de diseño o una cadena de texto.

Todo recurso tiene un objeto recurso correspondiente definido en el archivo gen/R.java del proyecto. Se puede usar los nombres de objeto de la clase R para referirse a los recursos, como cuando necesitas especificar un valor cadena para el atributo android:hint. También se puede crear ids de recurso arbitrarios que asociar a una vista usando el atributo android:id, el cuál permite referenciar esa vista desde otro código.

Las herramientas del SDK generan el archivo R.java cada vez que se compila la aplicación.

Page 46: Android 1

ActividadesAdicionar Recursos de tipo Cadena

Recursos de cadenas de texto, están ubicados en res/values/strings.xml

Page 47: Android 1

Actividades

El peso es un número que especifica la cantidad del espacio restante que debería consumir cada vista, de forma relativa a la cantidad consumida por las vistas hermanas. Esto funciona un poco como los ingredientes de un cóctel: "2 partes de vodka, 1 parte de licor de café" significa que dos terceras partes de la bebida es vodka. Por ejemplo, si da a una vista un peso de 2 y a otra un peso de 1, la suma es 3, así que la primera vista ocuparía 2/3 del espacio restante y la segunda vista ocuparía el resto. Si se añade una tercera vista y le da un peso de 1, entonces la primera vista (con un peso de 2) ocuparía la mitad del espacio restante, y las otras dos vistas ocuparían cada una 1/4.

Por defecto el valor del peso de todas las vistas es 0, por lo que si especificas cualquier valor de peso mayor que 0 para una sola vista, entonces esa vista ocupará todo el espacio restante una vez se le haya dado a cada vista el espacio que necesitaba. Así que, para hacer que el elemento EditText ocupe todo el espacio restante de la interfaz, dale un valor de 1 al peso y deja el botón sin peso.

Page 48: Android 1

ActividadesonCreate(): Llamado a la actividad cuando se crea por primera vez.onStart(): Llamado cuando la actividad se encuentra visible para el usuario.onResume(): Llamado cuando la actividad empieza a interactuar con el usuario.onPause(): Llamado cuando la actividad actual se detiene y la actividad anterior se reanuda.onStop(): Llamado cuando la actividad ya no es visible para el usuario.onDestroy(): Llamado antes de que el sistema destruya la actividad. onRestart(): Llamado cuando la actividad se ha detenido y se reinicia de nuevo.

Hacer Programa

Page 49: Android 1

Click de un BotonEl valor del atributo android:onClick, ”ejecutarAccion”, es el nombre de un método en la actividad que el sistema llamará cuando el usuario pulse sobre el botón.

El metodo debe ser:

•Ser público.•Tener un valor de retorno void.•Tener un objeto View como único parámetro (este será el elemento View sobre el que se ha pulsado).

Page 50: Android 1

Click de un Botón

Page 51: Android 1

El Objeto ContextEn Android, a menudo se encuentra con la clase Context y sus instancias. Las instancias de una clase Context se utilizan para proporcionar referencias a su aplicación. Por ejemplo:

Sin embargo, puesto que la clase Toast() no se utiliza directamente en la actividad (se utiliza dentro de la clase AlertDialog), necesita devolver una instancia de la clase Context al utilizar el método getBaseContext().

Page 52: Android 1

El Objeto Context

http://jarroba.com/context-de-android/

Page 53: Android 1

ToastLa clase Toast nos permite mostrar un mensaje superpuesto a la ventana por un período de tiempo pero sin congelar la aplicación. Este mensaje no permite interactuar con el usuario (no se pueden ingresar datos, seleccionar botones ni obligar a que se cierre)Eventualmente se lo puede localizar en distintas partes del dispositivo

Page 54: Android 1

Toast

toast.setGravity(Gravity.CENTER|Gravity.LEFT,0,0);

Page 55: Android 1

Personalizar el ToastPara generar un Toast personalizado debemos crear un archivo XML donde creamos visualmente los controles a mostrar, en este ejemplo creamos el siguiente archivo (crear un archivo llamado toast_curso.xml):

Page 56: Android 1

Personalizar el Toast

Page 57: Android 1

Personalizar el Toast

Mediante la clase LayoutInflate procedemos a leer el contenido del archivo XML creado anteriormente y lo enlazamos con el toast mediante el método:toast.setView();

Page 58: Android 1

Cuadro de Dialogo en ProcesoCuadro Por Favor Espere!! Aparece comúnmente cuando una aplicación está realizando una tarea prolongada.

Page 59: Android 1

Cuadro de Dialogo en Proceso

Es un cuadro de dialogo modal, bloqueará la interfaz de usuario hasta que desaparezca.

Page 60: Android 1

IntentUn Intent (intención) es un objeto que proporciona un enlace en tiempo de ejecución entre componentes separados (como dos actividades). El Intent representa la "intención de hacer algo" por parte de la aplicación. Se puede usar intenciones para una amplia variedad de tareas, pero su uso más habitual es el de iniciar otra actividad.Dentro del método ejecutarAccion(), crea un Intent para iniciar una actividad llamada SegundaActivity:

El constructor utilizado tiene dos parámetros:

Un Context (contexto) como primer parámetro (se utiliza this porque la clase Activity es una subclase deContext).

La clase (Class) del componente de la aplicación al que el sistema debería enviar el Intent (en este caso, la actividad que debería iniciarse).

Page 61: Android 1

Intent

AndroidManifest.xml

Page 62: Android 1

Intent Global

Page 63: Android 1

Intent Global

Proyecto Global

Proyecto Original

Page 64: Android 1

Intent: Pasar DatosUna intención no solo permite iniciar otra actividad, sino que también puede pasar un bundle (lote) de datos a esta actividad. Dentro del método ejecutarAccion(), usa findViewById() para obtener el elemento EditText y añade su valor a la intención:

Un Intent puede transportar una colección de varios tipos de datos en forma de pares clave-valor llamados extras. El método putExtra() toma el nombre de la clave como primer parámetro y el valor como segundo parámetro.

Para que la siguiente actividad consulte los datos extra, se debería definir la clave para los datos extra de tu intención usando una constante pública. Añade la definición de EXTRA_MESSAGE en la parte superior de la clase MainActivity:

Page 65: Android 1

Para iniciar una actividad, se llama a startActivity() pasándole tu Intent. El sistema recibe esta llamada e inicia una instancia de la Activity especificada por el Intent.

Con este nuevo código, hemos completado el método ejecutarAccion() que invocará el botón Enviar, y que ahora tiene este aspecto:

Intent: Pasar Datos

Page 66: Android 1

Toda Activity es invocada por un Intent, independientemente de cómo haya llegado a ella el usuario. Se puede obtener el Intent que inicio la actividad llamando a getIntent() y obtener los datos que este contiene.

Intent: Recibir Datos

Page 67: Android 1

ListViewMuestra una lista de items con scroll. Los items en la lista son insertado utilizando un Adapter . Usando un CursorLoader es la forma estándar para consultar un Cursor con una tarea asíncrona para no bloquear el hilo principal de la aplicación.

Cuando el CursorLoader recibe el resultado del Cursor, el LoaderCallbacks recibe un callback en onLOadFinished(), el cual actualizara el Adapter con el nuevo Cursor y el ListView muestra los resultados.

Page 68: Android 1

ListView

Se deben armar dos Vistas una que sirve para contener los datos de resumen y otra con el listado.

Page 69: Android 1

ListViewentrada.xml

listado.xml

Page 70: Android 1

ListViewListaEntrada: Encapsula datos de entrada.ListaAdaptador: Adapta las entradas a la lista.

ListaEntrada: Objetos con Imagen, Titulo o Nombre y Descripción.

A toda ListView hay que pasarle un adaptador con los datos y que herede de “BaseAdapter”.

Page 71: Android 1

Fragmentos

En un dispositivo de pantalla pequena (smarphone), un actividad normalmente ocupa toda la pantalla, mostrando las vistas que conforman la interfaz de usuario de una aplicacion.La actividad es basicamente un contenedor de vistas. Sin embargo, cuando se muestra una actividad en un dispositivo de pantalla grande, como una tablet, esto no es asi. Puesto que la pantalla es mucho mas grande, todas las vistas en una actividad se deben organizar para ocupar todo el espacio incrementado, dando lugar a cambios complejos en la jerarquia de vista. Un mejor enfoque es tener “miniactividades”, cada una de ellas conteniendo su propio conjunto de vistas. Durante el tiempo de ejecucion, una actividad puede contener una o mas de estas miniactividades, dependiendo de la orientacion de la pantalla del dispositivo. En Android 3.0 y posterior, las miniactividades se conocen como fragmentos.

Page 72: Android 1

FragmentosUn fragmento es como una actividad, puede contener distintas vistas y además tiene su propio controlador, el cual define su comportamiento. Este fragmento debe ir incrustado dentro de una Actividad.

Los fragmentos forman la unidad atómica de una interfaz de usuario y pueden ser añadidas dinámicamente a una actividad para lograr la mejor experiencia de usuario posible.

Page 73: Android 1

Fragmentos

Implementacion:•Los fragmentos no extienden de la clase Activity sino de Fragment.•Los fragmentos tienen un Layout en el cual se definen sus vistas.•No existe el método onCreate() en la clase Fragment, sin embargo existe el método onCreateView().•Los fragmentos estáticos se deben definir en el Layout de la actividad que los va a contener, sin embargo no se define en el AndroidManifest.xml.•Se debe de utilizar un objeto de la clase LayoutInflater para poder asignar un Layout al fragmento.•Un Fragment tiene su propio Layout y su propio ciclo de vida.•Un Fragment siempre debe estar en una Activity.•El ciclo de Vida de la Activity contenedora afectará al del Fragment.

Page 74: Android 1

Ciclo de Vida Fragmentos

Page 75: Android 1

Fragmentos

• Un Fragment estático o final es aquel que se declara en el fichero XML de la carpeta Layout directamente. Este Fragment tendrá la cualidad de no ser eliminado o sustituido por nada -De lo contrario tendremos errores.

• Un Fragment dinámico es el que se crea desde código Java y se asocia a un ViewGroup (Se recomienda el uso de FrameLayout). Éste sí que se podrá eliminar o sustituir por otro Fragment u otro contenido.

Page 76: Android 1

FragmentosSMARTPHONE: La actividad tiene, como acostumbra, su Layout asociado llamado “Layout_activity_principal_listado”. Cada elemento de la lista tiene un Layout llamado layout_elemento_listado (ListFragment-ListView). En la descripción la Activity tiene asociado un Layout como siempre, que llamaremos “Layout_activity_detalle”, la cual es la asociación Layout con Activity típica. Y hemos dicho que el Fragment es como si fuera una Activity pero pequeña, con lo que también tiene asociado un Layout que llamamos “Layout_fragment_detalle”.

Page 77: Android 1

FragmentosTABLET: Tenemos el listado, que es algo que siempre va a ser igual (podrán aumentar o disminuir los elementos contenidos en el listado, pero siempre será un listado), por lo que podemos declarar su fragment en el XML, es estático. Y luego tenemos la parte derecha del detalle, dependiendo del seleccionado en el listado mostrará el detalle de un Carro (descripción, nombre y foto) diferente. Con lo que cada detalle de cada carro tendrá su propio Fragment -si los equiparamos a las hojas de un libro, pasar cada Fragment equivaldría a pasar las hojas del libro de carros- por lo que nos interesa que estos Fragments sean dinámicos. Lo que nos dibujará el siguiente Layout con un Fragment estático en XML y un FrameLayout que contendrá a los Fragments dinámicos.

Page 78: Android 1

Fragmentos

Page 79: Android 1

FragmentosLayout Principal para Tablet

Page 80: Android 1

FragmentosPara móvil, se tiene por separado el listado con el Fragment estático.

Page 81: Android 1

FragmentosPara Tablet, se tiene el fragment dinámico para el detalle.

Page 82: Android 1

FragmentosPara Lista: Estructura simple de la vista de cada elemento del listado.

Page 83: Android 1

FragmentosPara Detalle:

Page 84: Android 1

FragmentosPara SmartPhone:

Page 85: Android 1

FragmentosPara Tablet:

Page 86: Android 1

FragmentosDiferenciar el tipo de pantalla: SmartPhone o Tablet.

Carpeta : res/Values values-large: para pantallas grandes; es decir, para Tablets. Crearemos en esta carpeta un nuevo fichero XML llamado "layout.xml".values-sw600dp: para pantallas con un ancho mayor a 600dp (independientemente de la rotación de la pantalla); para Tablets de este tamaño o más. Este valor lo podemos cambiar, pero 600 va a funcionar muy bien para nuestro propósitos. Crearemos en esta carpeta otro nuevo fichero XML también llamado “layout.xml”.values: carpeta de valores para el resto de dispositivos que no cumplan las condiciones anteriores. Lo usaran los Smartphones, o las Tablets pequeñas que no cumplan el tamaño mínimo que hemos puesto. No tocamos ni añadimos nada en esta carpeta.

Page 87: Android 1

FragmentosLayout.xml

Page 88: Android 1

FragmentosLayout.xml

Page 89: Android 1

FragmentosEstructura de Archivos

Page 90: Android 1

FragmentosActivity_Principal.java: Esta es una Activity, pero para tratar con Fragments necesitamos un tipo de Activity especial llamada “FragmentActivity” de la que extenderemos la clase.

Diferenciar la cantidad de elementos que maneja para cada tipo de dispositivo: En el “onCreate” le asociaremos el Layout “layout_activity_principal_listado.xml” –recordemos que su contenido tendrá únicamente un listado, o un listado y un detalle, dependiendo del tamaño de la pantalla. Para saber si estamos trabajando con dos Fragments en la misma Acitivity, es tan sencillo como preguntar si existe el detalle, sino existe estaremos trabajando con un solo Fragment que será sin lugar a dudas el listado.

Comunicar a los Fragments: Programaremos los Fragments de manera completamente modular; es decir, un Fragment no se comunica con otro directamente sino a través de interfaces. Funciona del siguiente modo (para mayor claridad, se debe mirar la imagen inferior que es para el caso del Tablet; para el Smartphone sería igual, pero pasándole el dato de una Activity a la otra, y ésta ya se lo comunicaría al Fragment con el detalle):

Page 91: Android 1

Fragmentos

Page 92: Android 1

Fragmentos1) Se pulsa sobre un elemento del Fragment que contiene al listado. A través de un

método de Callback “onEntradaSelecionada” (esto es programación por eventos) comunica el id de la entrada seleccionada a la Activity que lo engloba (de ahí que implemente a “Fragment_Lista.Callbacks”).

2) La Activity recoge el dato. Si:

Es Tablet: crea un nuevo Fragment con el detalle, le envía el id para que cargue el contenido apropiado y lo coloca en el FrameLayout, remplazando cualquier otro Fragment con el detalle que pueda existir.

Es Smartphone: Crea una nueva Activity al que le envía el id. La nueva Activity cargará el Fragment con el detalle sobre sí misma.

3) Se muestra el Fragment con el detalle al usuario.

Page 93: Android 1

Librerias

import android.util.Log;Log.d(cadena_tag,cadena_msg);