Vous êtes sur la page 1sur 177

Aventuras Android con Android Estudio

Contenido
1. Primeros pasos con Android Estudio
2. La actividad y el interfaz de usuario
3. La construccin de la interfaz de usuario y una calculadora App
4. Controles bsicos y Eventos
5. Contenedores de diseo
6. Ciclo de Vida y Estado
7. Spinners
8. Pickers
9. IU Grficos A Deep Dive
10. ListView y adaptadores
Fragmentos
11. Presentacin de Fragmentos
12. Fragmentos y XML
13. Fragmento Y Actividad Trabajando Juntos
14. Gestin de Fragmentos
15. Dilogos personalizados utilizando DialogFragment
16. Clases de dilogo en el DialogFragment
17. Un Proyecto NumberPicker DialogFragment
18. ViewPager

1. Primeros pasos con Android Estudio


Android representa un gran mercado potencial. Tambin es el ms abierto de los "grandes"
plataformas de telfonos. Todas las herramientas que necesita para crear una aplicacin
Android son gratuitos. Don; t tienen que pagar nada para unirse a un club para crear e incluso
distribuir tu aplicacin Android. Si quieres vender a travs de un mercado conocido como
Google Play o Amazon entonces no es por lo general una pequea cuota anual, pero usted no
tiene que utilizar cualquier mtodo de distribucin particular.
Todo lo que se interpone entre usted y su aplicacin para Android es su imaginacin y
capacidad de programacin. No puedo hacer mucho para mejorar tu imaginacin pero puedo
ayudar con el lado de la programacin de las cosas.
En este ebook le mostrar los fundamentos de la programacin Android. No los consejos y
trucos, pero la forma de pensar acerca de lo que est pasando - es decir, los principios
generales que harn posible que usted pueda dominar cualquier cosa que usted encuentra
que es nuevo en el futuro.
Qu es lo que necesita saber para empezar?
Tienes que ser capaz de programar en un lenguaje orientado a objetos modernos. Java sera
mejor, ya que es el idioma que se utiliza para crear aplicaciones de Android, pero C #, C ++,
VB o algo similar est lo suficientemente cerca en espritu a Java para que usted sea capaz de
hacer frente. Usted puede ser que tambin tenga que buscar cosas sobre los detalles de las
caractersticas particulares de Java, pero la mayora del tiempo, debera ser obvio o evidente
con la ayuda de algunos comentarios.
No es necesario ser un experto programador porque para una gran cantidad de programacin
Android simplemente est utilizando las caractersticas y facilidades previstas - que es una
gran cantidad de programacin Android es slo una cuestin de seguir las reglas.
Sin embargo si la esperanza de crear algo nico y til que usted en algn momento tiene que
aadir algo de su propio - y aqu se requiere creatividad y habilidad. As que es posible que no
necesita ser un experto programador para empezar pero que necesita para convertirse en uno
para el momento de crear su aplicacin sorprendente.
Afortunadamente la prctica es un buen maestro y as aprender a cdigo para Android en
realidad ayudar a aprender a cdigo.

Empezando
Este es un muy buen momento para empezar a trabajar con Android porque Google ha
lanzado Android Estudio que es una herramienta fcil de usar Android IDE - Integrated
Development Environment.
Antes de que esto se tena que utilizar el Eclipse IDE y configuracin del SDK y otras piezas
de software necesario.Esto no fue difcil, pero Android Studio facilita y hace que la

programacin Android fcil. En pocas palabras, es el camino del futuro, as que vale su
inversin en aprenderlo.
Con el lanzamiento de Android Estudio Google ha dejado de trabajar en el complemento de
Eclipse y esto significa que Android Estudio realmente es la nica forma de desarrollar
aplicaciones a partir de ahora.
As que para empezar.
Yo no voy a pasar mucho tiempo a explicar cmo instalar Android Estudio de una manera paso
a paso - el sitio web de Android hace un buen trabajo y es ms probable que sea hasta a la
fecha. Vale la pena, sin embargo slo va en los principios bsicos.
En primer lugar asegrese de que tiene la ltima Java JDK instalado - al menos JDK 6.
Si usted no tiene visita instalado Java: Java Descargar
Una vez que tenga la configuracin de Java hasta Android Studio es fcil:
1. Descargue el paquete de Android Studio desde la pgina de Android Estudio Home .
2. Instalar Android Estudio que tambin instala todos el SDK de Android y las
herramientas que necesitar:
Ventanas:
1. Inicie el archivo EXE descargado, android-studio-bundle<version>.exe .
2. Siga el asistente de instalacin para instalar Android Studio.
Mac OS X:
3. Abra el archivo DMG descargado, android-studio-bundle<version>.dmg .
4. Arrastre y suelte Android Estudio en la carpeta Aplicaciones.
Linux:
5. Descomprimir el archivo ZIP descargado,android-studio-bundle<version>.tgz , en un lugar apropiado para sus aplicaciones.
6. Para lanzar Android de estudio, navegue hasta elandroidstudio/bin/ directorio en un terminal y ejecutar studio.sh .
Es posible que desee agregar android-studio/bin/ a la variable de entorno
PATH, para que pueda empezar a Android Studio desde cualquier directorio.
Acepte los valores predeterminados que el programa de instalacin le ofrece - a menos que
tenga una buena razn para no hacerlo. Se instala no slo Android de estudio, pero el SDK, el

dispositivo virtual y si usted est utilizando una mquina basada en Intel un acelerador de
dispositivo virtual.

En algunos sistemas Windows, el script lanzador no encuentra donde est instalado Java y
usted encontrar que usted no puede ejecutar el recin instalado Android Studio. Parece que
empezar y luego simplemente se desvanece.
Si se produce este problema, es necesario establecer una variable de entorno que indica la
ubicacin correcta del JDK de Java.
Seleccionar
Start menu > Computer > System Properties >
Advanced System Properties.

A continuacin, abra
Advanced tab > Environment Variables,
add new system variable

y JAVA_HOME configuracin que apunta a la carpeta de JDK, por ejemplo C: Program \ Files \
Java \ jdk1.7.0_21.
Hay un segundo problema que se detiene algunas instalaciones de trabajo. As como
JAVA_HOME est establecida en el directorio jdk tambin necesita un set PATH para el
directorio bin. Utilice el mismo mtodo para configurar las variables de entorno, pero
seleccione la variable de la ruta existente y utilizar el botn Editar para agregar una ruta al
directorio bin del JDK, por ejemplo, C: \ Archivos de programa \ Java \ jdk1.7.0_21 \ bin. Nota,
usted tiene que utilizar un separador de punto y coma entre cada una de las rutas de los
directorios especificados como parte de la variable PATH.
Ahora usted debera ser capaz de ejecutar Android Studio. Si no la causa ms probable del
problema es el JDK y as volver a la instalacin es una mejor primera opcin.

Su primer programa
Usted puede optar por iniciar Android Studio despus de la instalacin. Probablemente no va a
ir directo al Android Estudio la primera vez que se inicia, ya que descarga actualizaciones para
s mismo y para el SDK de Android. Slo tienes que ser paciente.
Cuando finalmente se pone en marcha, ver la pantalla de bienvenida:

Si ya ha creado algunos programas que bien podra verlos enumeran en proyectos recientes.
Asumiendo que este es su primer proyecto seleccionar el inicio de una nueva opcin de
proyecto Android Studio.

Puede pasar por alto los detalles del nuevo proyecto por el momento. Todo lo que tienes que
hacer es suministrar un nombre para su aplicacin - HelloWorld en este caso. Acepte el otro
defecto que Android Studio ha rellenado para usted.
Al hacer clic en Siguiente se le da la oportunidad de elegir qu dispositivos que usted est
apuntando. Una vez ms, simplemente aceptar los valores predeterminados:

Pgina 2 de 4
La siguiente pgina le permite seleccionar una plantilla para su proyecto. En este caso, la
actividad en blanco por defecto es lo que necesita. Todas las aplicaciones Android se
compone de al menos sobre la Actividad y esta plantilla genera un proyecto con una sola
Actividad listo para personalizar.

La siguiente pgina le permite asignar nombres personalizados para los distintos componentes
de su proyecto que la plantilla genera. Para un proyecto real que le asigne nombres que eran
significativos, pero en este caso se puede aceptar los valores predeterminados:

Por ltimo, puede hacer clic en el botn Finalizar y espere a Android Studio crea todos los
archivos que necesita. Incluso un proyecto Android sencillo tiene un montn de archivos as
que de nuevo todo lleva su tiempo.

Primera vista
Cuando todo est listo, ver Android Studio por primera vez.
Problemas?
Si recibe algn mensaje de error - ".? Estilos que falta es el tema correcto elegido para este
diseo" como lo ms probable es que usted tiene algunas sobras de una instalacin
anterior.Algunas veces la nica manera de arreglar esto es borrar toda la .android,
AndroidStudio y directorios .gradle usted y puede luego volver a instalar. Si tiene proyectos
existentes entonces no elimine AndroidStudioProjects.
Antes de hacer nada de esto sin embargo, vale la pena probar el archivo, Invalidate Caches
comando / Reiniciar. Esto generalmente funciona para "estilos Missing" y errores similares.
Mientras todo ha trabajado usted debe ser presentado con una vista de su nuevo proyecto
partiendo en el diseador seleccionado.

Aunque no se parece mucho a dominar en la interfaz de usuario de Android Estudio mayor


parte de ella slo se visita de vez en cuando. Las cosas importantes a notar son que se mueve
de izquierda a derecha se tiene:

la ventana de proyecto

La divisin de diseo en su paleta y una ventana Layout

Una ventana de rbol de componentes y una ventana de propiedades en el extremo


derecho.

La mayor parte del tiempo que va a utilizar la ventana del proyecto y la ventana
Propiedades. En el entre los dos ver diferentes editores, dependiendo de qu tipo de archivo
que ha seleccionado.
en este caso, usted tiene por defecto un archivo de diseo - activity_main.xml - seleccionado y
por lo tanto tiene un editor de diseo en el centro de la pantalla.
Ms sobre el diseo un poco ms tarde - en primer lugar, es importante que usted sabe un
poco acerca de la estructura de archivos de un proyecto para que pueda desplazarse a sus
diferentes partes.

Estructura bsica de proyectos


Cuando el proyecto se ha terminado de construir todos los archivos creados se pueden ver
mediante la apertura de la ficha Proyectos. Lo ms importante a notar es que hay un gran
nmero de carpetas y archivos.

Se parece casi increble que la aplicacin para Android ms simple que puede crear involucra
tantos archivos.
No entre en pnico.
La mayora de los archivos que se han creado son generados automticamente y la mayora
de las veces usted no necesita saber nada acerca de ellos y mucho menos abierta o
editarlos.En la apertura de hecho y los archivos generados automticamente edicin
realmente no es una buena idea.
As que vamos a centrarnos en los archivos que son importantes para nosotros.
Para nuestro programa simple que slo hay dos archivos importantes que determina el
comportamiento de la actividad
MainActivity.java

y uno que determina la mayor parte de la apariencia visual


Main_Activity.xml

Puede establecer que la actividad es la que se inicia el sistema pero por defecto es la
actividad que cre y nombr al configurar el proyecto.
En este caso hemos llamado a la actividad MainActivity y su Main_Activity archivo de diseo pero se puede cambiar estos valores predeterminados.
Usted puede ver la ubicacin de estos dos archivos importantes en la ventana del proyecto:

El directorio de java es desde su punto de vista en la mayor parte de la construccin de su


aplicacin se produce as que asegrate de saber donde est. El directorio de res es donde se
guardan todos los recursos - diseos, mapas de bits, etc. que APP necesidades.
As, mientras que las cosas se ven complicadas por el momento las nicas dos archivos de
proyecto que te importan, y su proyecto, son MainActivity.java y activity_main.xml.

Anatoma de una actividad


Una aplicacin para Android se compone de una o ms actividades.
Usted puede pensar en una actividad como siendo algo as como una pgina web completa
con HTML para determinar lo que muestra y JavaScript para determinar lo que hace.
En el caso de una actividad que el diseo se determina por el archivo XML en (res) directorio
de recursos y el comportamiento se determina por el cdigo Java en el directorio de Java.
El XML puede ser pensado como un lenguaje de marcas muy parecido a HTML o XAML.
Define un diseo inicial para la pantalla cuando la aplicacin se ejecuta en primer lugar. Es
posible generar nuevos componentes de diseo en tiempo de ejecucin desde el archivo
Java. De hecho, si de verdad quieres puedes prescindir del archivo XML y generar todo de
Java, pero como usted descubrir el enfoque marcado XML es mucho la mejor manera de
hacer el trabajo - debido a la disponibilidad del diseador.
As que para ser 100% claro:

el archivo java contiene el cdigo que hace que su aplicacin se comportan de


maneras particulares

el archivo de diseo .xml contiene una definicin de la interfaz de usuario intial de su


aplicacin.

Echemos un vistazo a los dos archivos que se han generado para nuestra aplicacin Hello
World inicial comenzando con el diseo XML.

Pgina 3 de 4

Hola Diseador

Primero veamos el archivo de diseo XML.


Doble click en activity_main.xml archivo en la ficha Proyecto y el archivo se abrir (si no est
ya abierto).
Si ya est abierto, tambin puede seleccionar la pestaa aparece justo encima del rea de
edicin. Usted puede seleccionar cualquier archivo que est abierto para la edicin
seleccionando el su ficha.
Puede trabajar con el cdigo XML directamente para definir donde todos los botones y el texto
va y luego usted aprender lo menos cmo editar cuando las cosas van mal o para afinar, pero
- Android Studio proporciona un muy buen editor interactivo y esto es digno de usar.
A medida que se experiment la idea de cambiar entre una vista de diseo y una vista XML se
convertir en una segunda naturaleza. Piense en el editor interactivo como una forma muy
fcil de generar el XML que de lo contrario tomara las edades para hacerlo bien.
Si nos fijamos en la parte inferior izquierda ver dos pestaas - Diseo y texto:

Se puede cambiar entre la edicin del XML como texto y editarlo en el diseador de arrastrar y
soltar, simplemente haciendo clic en la pestaa.
Si ahora hace clic en la pestaa de la ventana mostrar el diseador pero sea paciente la
primera vez que hace esto puede tardar unos instantes.
El diseador se ve un poco demasiado para tomar en la primera vez que lo ve, pero usted se
acostumbrar rpidamente a ella.

A la izquierda es una paleta de todos los componentes - botones, texto, casillas de verificacin
y as sucesivamente - que se puede colocar en la superficie de diseo.
En el medio est la superficie de diseo y el valor predeterminado es el tamao de la pantalla
y el aspecto del Nexus 4. Puede seleccionar otros dispositivos para trabajar.
A la derecha tienes el rbol de componentes que muestra la estructura de su diseo, es decir
cmo los diferentes componentes de interfaz de usuario estn contenidas dentro de otros - es
la misma que la estructura de anidacin del archivo XML. Puede utilizar el rbol de
componentes para seleccionar componentes individuales de interfaz de usuario haciendo clic
en sus nombres. Tambin puede seleccionar los componentes de la superficie de diseo, pero
algunas veces es ms fcil utilizar el rbol de componentes.
Debajo del rbol de componentes que tiene la ventana Propiedades que se puede utilizar para
establecer las propiedades, como la anchura, la altura, el color ... de cualquier componente en
el diseo.
Si usted ha utilizado cualquier diseador de arrastrar y soltar entonces ste ser familiar para
usted. Si ha tenido problemas con el diseo detallado utilizando un lenguaje de marcas ya sea
HTML, XAML o XML, entonces te gusta lo fcil que el diseador hace que la construccin y
prueba de un interfaz de usuario.
En el caso de nuestro programa de ejemplo el nico componente utiliza es una sola TextView
que ya contiene el texto "Hello World". Un TextView es el componente estndar que utilizamos
cuando todo lo que queremos hacer es mostrar un poco de texto esttico.

Usted puede modificar el texto de saludo si quieres. Seleccione el componente TextView ya


sea en la imagen del Nexus 4 o en el rbol de componentes y utilizar la ventana Propiedades
para encontrar su propiedad Text. Cambiar esto a leer "Hola Android Mundial".
Alternativamente, usted puede simplemente hacer doble clic en la Vista de Texto y escriba
"Hello Android Mundial" directamente en el cuadro de dilogo que aparece, - a menudo se
pueden cambiar las propiedades principales de un objeto haciendo doble clic. Si cambia de
esta manera usted tambin tendr que proporcionar una identificacin para el componente de
lo contrario se genera un error. Esto es un error / caracterstica y probablemente ser fijado en
versiones posteriores de Android Studio.
No te preocupes por la forma de la entrada original en el TextView comenzando con una @ y
mirando complicado simplemente escriba la cadena en lo dado. La entrada por defecto hace
referencia a un recurso de cadena predefinida - algo que podemos ignorar por el momento,
junto con la advertencia de que las banderas Android Studio para decirle uso que estamos
siendo travieso y no mediante una cadena de recursos. Es cierto, siempre es mejor definir las
cuerdas que utiliza como recurso en lugar de incorporar directamente en su aplicacin.
Puede utilizar el diseador para crear cualquier interfaz de usuario es que quiere y que
realmente no tienen que involucrarse en el XML que se corresponde con el diseo.
El diseador generar automticamente el cdigo XML necesario para crear el diseo para
usted y modificarlo a medida que cambia el diseo. Si realmente quieres ver el XML entonces
todo lo que tienes que hacer es seleccionar la pestaa de texto en la parte inferior de la
ventana de diseo.
<RelativeLayout xmlns:android=
"http://schemas.android.com

/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft=
"@dimen/activity_horizontal_margin"
android:paddingRight=
"@dimen/activity_horizontal_margin"
android:paddingTop=
"@dimen/activity_vertical_margin"
android:paddingBottom=
"@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView android:text="Hello Android World"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>

Usted debe encontrar que es bastante fcil de entender - leer el <TextView> etiqueta por
ejemplo - pero dejar que el diseador para crear y modificarlo. Las cantidades que empiezan
por @ son todas las referencias a cosas definidas en otras partes de los archivos de recursos.
Vamos a volver al diseador y el XML que genera ms tarde.

El Java
Si hace doble clic en el archivo MainActivity.java, o simplemente seleccione la ficha
MainActivity.java, ver el cdigo que contiene.
Parte del cdigo podra escondido pero se puede inspeccionar si desea haciendo clic en los
botones + para expandirla.
La parte importante del cdigo es:
public class MainActivity
extends ActionBarActivity{
@Override
protected void onCreate(
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

Hay otras dos funciones debajo de la funcin onCreate pero ignoran estos por el momento que implementan caractersticas que realmente no pidas - til pero no cuando acaba de
empezar.
La funcin onCreate es la nica cosa que importa en este momento.
La funcin onCreate se llama cuando se ejecuta su aplicacin y se espera para crear la vista y
hacer lo que sea la actividad se ocupa.
A medida que nuestra actividad en realidad no hacer nada ms que lo nico onCreate tiene
que hacer es llamar primero al mtodo heredado OnCreate decir super.onCreate para hacer
todas las cosas normales y luego usar la funcin setContentView para seleccionar el archivo
XML que determina la disposicin de las actividades de la pantalla.
La lnea:
setContentView(R.layout.activity_main);

es el ms importante de todos y realmente el nico que realmente hace nada. Se obtiene el


objeto recurso que representa la disposicin segn lo definido por el archivo XML creado por
el diseador y la convierte en la ContentView actual es decir, es lo que se muestra en la
pantalla.
Es decir que hace la conexin entre el diseo que hayas definido con el diseador y se
almacena en el archivo XML y la interfaz de usuario que aparece en la pantalla de los
dispositivos.
Tenemos mucho que aprender sobre el objeto de recurso R pero se puede ver que su funcin
principal es la de formar un vnculo entre su cdigo de Java y los recursos que se han creado
como archivos XML por el diseador entre otros.
Como se trata de toda nuestra actividad hace esto es todo el cdigo que necesitamos.
Aunque estoy de acuerdo que es apenas una "actividad" es suficiente para ver el esquema
bsico de una aplicacin para Android y para ver cmo ponerlo en marcha - que es nuestro
prximo trabajo.

Primeros pasos con el emulador


Hay dos formas distintas de funcionamiento de una aplicacin para Android usando Android
Studio.

Puede usar el emulador o en un dispositivo Android real.


Finalmente se tiene que descubrir cmo ejecutar una aplicacin en un dispositivo Android
conectado real porque el emulador slo le permite probar un subconjunto de las cosas y es
lento.
Sin embargo, por el momento el funcionamiento de su primera aplicacin en un emulador es
ms que suficiente para empezar.
Todo lo que tienes que hacer es hacer clic en el icono de pista verde en la barra de
herramientas superior - o bien utiliza el Run, Run "aplicacin" del men.
Al hacer esto, por primera vez se tardar un tiempo para que la aplicacin para ser
compilado. Carreras posteriores son ms rpidas.
Cuando su aplicacin se compila y listo para hacer ver un cuadro de dilogo aparece que le
permite seleccionar un emulador de correr o iniciar uno va. Al instalar Android estudio se
obtiene un emulador por defecto - un Nexus 5 corriendo KitKat - y usted puede simplemente
seleccione emulador de lanzamiento y haga clic en Aceptar para ponerlo en marcha.Si usted
necesita otros dispositivos que puede usar el Administrador de AVD definirlos - un tema que
volver a.

Por lo general, tarda bastante tiempo para la AVD para empezar porque no slo tiene que
inicializar el emulador tambin tiene que arrancar Android al igual que un dispositivo
real. Tambin hay unos momentos donde nada parece estar sucediendo. No entre en pnico,
algo va a pasar con el tiempo. Usted puede monitorear la carga de la emulacin en la ventana
Ejecutar que aparece automticamente en la parte inferior de Android Studio.

Sin embargo, toma mucho tiempo para empezar. Sin embargo, slo tienes que hacer esto una
vez por sesin de depuracin porque la AVD puede ser reutilizado y la aplicacin vuelve a
cargar cada vez que haga algn cambio, y esto es una operacin bastante rpida. La mayora
de los programadores de Android entrar en el hbito de comenzar una AVD, cuando
comienzan a usar Android Studio para que est listo para la prueba cada vez que el programa
es.
Por ltimo, recuerde que debe esperar hasta que el sistema operativo Android es cargado y se
ve la pantalla de inicio familiarizado antes de empezar a preguntarse donde su aplicacin
es. Incluso cuando est cargado, es una buena idea para darle un par de segundos para
Android Studio para notarlo y cargar su aplicacin. Como el emulador es un dispositivo
Android completa, tambin es necesario para desbloquearlo. Mientras que usted ha sido lo
suficientemente paciente debe consultar a su aplicacin.

En nuestro caso esto no es particularmente impresionante - slo las palabras Hola Android
World - pero cuando se piensa en el viaje viajaron en realidad debera impresionar.
A partir de este punto usted puede ahora modificar el cdigo o el diseo y ejecutar la
aplicacin de nuevo para ver los efectos de los cambios. Con suerte usted no debera tener
que cargar el emulador de nuevo. Si algo sale mal y se obtiene un lo entonces simplemente
eliminar el proyecto y crear a partir de cero de nuevo.
Usted todava tiene mucho por descubrir acerca de cmo extender la aplicacin y hacer que
sea til, pero - la aventura ha comenzado.

Resumen

Android Estudio facilita la creacin de aplicaciones de Android mucho ms fcil que


otros enfoques y desde el lanzamiento de la versin 1.0 es la nica forma oficial para
hacer el trabajo.

Una aplicacin tiene al menos una actividad y esto define un diseo de la pantalla y un
comportamiento.Una actividad no tiene que tener una interfaz de usuario, pero en
encajonado s tiene uno.

Para crear una aplicacin simple uso de la plantilla Actividad en blanco sin extras
seleccionados.

El diseo de la pantalla es controlada por un archivo de formato XML,


Main_Activity.xml en nuestro caso almacena en el directorio res.

Android Studio proporciona un diseador de arrastrar y soltar que le permite crear una
interfaz de usuario sin tener que trabajar directamente con theXML.

El comportamiento de la aplicacin es controlada por un archivo Java, MainActivity.java


en nuestro caso almacena en el directorio java. Puede editar el cdigo en el archivo
Java directamente en Android Studio. El Java tiene que cargar y mostrar el trazado
definido en el archivo XML.

Para ejecutar una aplicacin que necesita ya sea una AVD basado emulador o un
dispositivo Android real conectada a la mquina.

Al ejecutar la aplicacin se puede seleccionar qu AVD o dispositivo de hardware que


se utiliza para probarlo.Al empezar slo tiene que utilizar el valor por defecto AVD un
Nexus 5.

1. Usted puede modificar y volver a ejecutar su aplicacin sin tener que reiniciar el AVD o
cualquier hardware real conectada a la mquina.

2. La actividad y el interfaz de usuario


As que ya sabes cmo crear una aplicacin para Android, pero realmente sabes cmo
funciona? En esta segunda parte de nuestro libro electrnico sobre cmo empezar con
Android usando Android Estudio miramos cmo crear una interfaz de usuario y cmo
conectarlo a el Codigo de la Actividad.
Descubrimos en el captulo 1 cmo utilizar Android Estudio de Google Android IDE, para
construir la aplicacin ms sencilla posible.
En el camino descubrimos que una aplicacin para Android se compone de dos partes - una
actividad y una vista.
La actividad es el cdigo Java que hace algo y el View proporciona la interfaz de usuario (UI).
Usted puede pensar en esta dualidad como algo similar a la pgina HTML y el JavaScript que
se ejecuta para que haga algo, o como una forma de XAML y el cdigo subyacente.
La idea clave es que una actividad es el cdigo que funciona con una pantalla de interfaz de
usuario definido por la vista.Esto no es del todo exacto en que una actividad puede cambiar su
punto de vista para que un trozo de cdigo Java puede apoyar una serie de puntos de vista

diferentes. Sin embargo, hay ventajas de utilizar una actividad por visin, ya que, por ejemplo,
esto cmo el Android botn atrs navega su aplicacin - de una actividad a.
Una aplicacin compleja, casi siempre consiste en mltiples actividades que el usuario puede
moverse entre las pginas web como una aplicacin sencilla pero puede manejar bastante
bien con una sola actividad.
No hay una regla fija en cuanto a cuntas actividades de su aplicacin tiene que tener - pero
tiene que tener por lo menos uno.
Si usted se est preguntando si una actividad puede existir sin un juicio, la respuesta es que
se puede, pero no tiene mucho sentido, ya que esto dejara al usuario y no hay forma de
interactuar con la aplicacin. Las actividades son activas cuando su vista se presenta al
usuario.
Realmente es una gran simplificacin de pensar en trminos de una actividad que
corresponde a una sola pantalla con una interfaz de usuario.
Si quieres algo para funcionar sin una interfaz de usuario a continuacin, lo que quieres es un
servicio o un proveedor de contenidos - ms de lo que mucho ms tarde.
Tambin vale la pena dejar claro en esta primera etapa que una actividad tiene un solo hilo - el
hilo de interfaz de usuario - y hay que tener cuidado de no realizar ninguna tarea larga porque
entonces van a bloquear la interfaz de usuario y hacer que su aplicacin parece
congelarse. Es una actividad que slo puede hacer una cosa a la vez que un esto incluye la
interaccin con el usuario.
Observe tambin que la creacin de actividades adicionales no crea nuevos temas. Slo una
actividad est activo en un momento dado - ms de esto ms adelante si tenemos en cuenta
el ciclo de vida Actividad en detalle.
En otras palabras, las actividades no son un sustituto para conocer enhebrar pero si acaba de
empezar puede ignorar estos problemas por un tiempo.
Por el momento, vamos a concentrarnos en la nica interfaz de usuario de pantalla Actividad
porque es el bloque de construccin ms comunes de aplicaciones que se encontrar y es
incluso donde las aplicaciones ms complejas empiezan desde.

El MainActivity
Hay por supuesto una actividad que ha sido designado como el que se lanzar cuando
aplicacin se inicia.

Si utiliza Android Studio para crear una nueva aplicacin Actividad en blanco llamado
SimpleButton y aceptar todos los valores predeterminados y luego la actividad de inicio se
llama MainActivity por defecto.
Puede cambiar qu actividad se inicia la aplicacin por el encadenamiento de una lnea en el
manifiesto de la aplicacin. El Manifiesto es un archivo de proyecto que no hemos discutido
antes, porque si usted est usando Android Studio mayora puede ignorar pero es mejor si
sabes que existe y lo que hace.
El Manifiesto se almacena en la aplicacin / directorio se manifiesta y se llama
AndroidManifest.xml. Es un archivo XML que indica al sistema Android todo lo que necesita
saber acerca de su aplicacin. En particular, se enumeran todas las actividades y cul es la de
utilizar para iniciar las aplicaciones.
Si abre el Manifiesto generado, simplemente haga doble clic en l, ver un poco ms abajo en
el archivo:
<activity
android:name=".MainActivity"
android:label="SimpleButton" >

Esto define la actividad del sistema ha creado para usted y las lneas justo debajo de este:
<intent-filter>
<action android:name=
"android.intent.action.MAIN" />
<category android:name=
"android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

Definirla como la actividad de inicio. Aviso de que la actividad se inicia la aplicacin no tiene
nada que ver con lo que usted le llama es decir, llamndolo MainActivity no es suficiente.
Para el momento en que usted puede confiar en Android Studio para cuidar el Manifiesto para
usted. En la mayora de los casos, slo tendr que editar directamente cuando se necesita
para corregir un error o aadir algo avanzado.

Dentro de la Actividad
La actividad generada tiene una MainActivity clase que contiene todos los mtodos y
propiedades de su actividad.Tambin tiene tres mtodos generados - onCreate,
onCreateOptionsMenu y onOptionsItemSelected. Los dos ltimos se obviamente conectado a
la accin del men Opciones y este es un tema importante, pero uno que puede ser ignorada

por el momento. No todas las actividades tienen que tener un men Opciones y usted podra
incluso eliminarlos.
El mtodo ms importante es definido onCreate.
Se trata de un controlador de eventos y se llama cuando se cree que la aplicacin por primera
vez. Este es el lugar que hacemos todas las inicializaciones y establecer para toda la
aplicacin. Tambin es generalmente el lugar mostramos pantalla de interfaz de usuario
principal de la aplicacin.
Vamos a echar otro vistazo al cdigo generado para onCreate:
@Override
protected void onCreate(
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

El controlador de eventos onCreate se pasa un objeto Bundle llamado


savedInstanceState. Con ello se pretende conservar la informacin de estado entre
invocaciones de que APP y vamos a ver cmo se utiliza ms adelante. En este caso no hay
datos se ha guardado y as savedInstanceState es nulo - pero usted todava tiene que pasarlo
al mtodo heredado onCreate.
La instruccin final llama setContentView que es un mtodo que tiene un nmero de diferentes
formas sobrecargados.
En este caso se pasa un entero que indica qu archivo XML describe el diseo que se utilizar
para la vista. El mtodo setContentView utiliza esto para crear todos los componentes de la
interfaz de usuario que segn se define en el archivo XML.
Vale la pena mirar un poco ms de cerca la forma en que se especifica el archivo de diseo,
porque se trata de un modo general que Android le permite acceder a los recursos.
El objeto R es construido por el sistema para reflejar los recursos que ha depositado en los
directorios de recursos. En este caso R.layout.activity_main devuelve un valor entero que
permite que el mtodo setContentView para encontrar el archivo de diseo activity_main XML.
En general todos los recursos se encuentran a travs del objeto R, piensa en l como un
objeto de biblioteca de recursos.

Ver y ViewGroup

Ok hasta ahora tan bueno, pero es importante darse cuenta de que lo que sucede a
continuacin es que el archivo XML se representa como un conjunto de objetos de vista. Es
decir objetos Java que son todas las subclases del objeto View.
Todo el sistema de interfaz de usuario y los grficos se implementa como una jerarqua de
componentes derivados de la clase View. Si ha utilizado casi cualquier marco GUI - AWT,
Swing, XAML etc - entonces esta idea no ser nuevo para usted.
Por ejemplo, un botn es una clase derivada de vista y para crear un botn todo lo que tienes
que hacer es crear una instancia de la clase botn. Puede, por supuesto crear tantos botones
como desee simplemente creando ms instancias.
Esto deja abierta la pregunta de dnde est el botn aparece en el diseo?
La respuesta a esto es que no son objetos ViewGroup que actan como contenedores para
otros objetos de visualizacin. Puede ajustar la posicin de los objetos de vista del nio o
simplemente permitir que sean controladas por diversas normas de diseo - ms de que ms
tarde.
Usted puede optar por crear toda la interfaz de usuario en cdigo mediante la creacin y el
trabajo con las instancias de objetos de vista y esto es algo demostrado en un captulo
posterior UI Grficos A Deep Dive .
.
Alternativamente, puede utilizar XML para definir objetos de vista y cmo encajar uno dentro
de otro y se basan en el sistema para crear la jerarqua de vistas de objetos para usted.
La manera ms simple sin embargo es utilizar el diseador para crear el archivo XML y luego
permitir que el sistema para crear los objetos para que a partir del archivo XML generado.
Ser capaz de trabajar con la interfaz de usuario en un editor interactivo es una de las grandes
ventajas de usar Android Estudio e incluso si usted sabe cmo editar el archivo de diseo XML
directamente no es una caracterstica que debe renunciar a la ligera. Es casi siempre una
buena idea utilizar el editor de formato en un primer momento y aplicar ningn ajuste, si es
necesario para el archivo XML despus.

Creacin de una interfaz de usuario


Para ver cmo todo esto encaja permite aadir un botn y un texto

Primero quite el texto Hola Mundo que se genera automticamente cuando se crea una nueva
actividad en blanco. Slo tiene que cargar el archivo activity_main.XML abrindolo.
Ver el diseador y puede seleccionar el texto haciendo clic sobre ella y borrar el texto
pulsando delete.

Observe que hay un comando deshacer si elimina algo por error.


A continuacin, seleccione el botn de la seccin Widgets de la paleta haciendo clic en ella:

Si ahora movemos el cursor sobre el rea de diseo usted descubrir que al mover varias
alineaciones se indican junto con la informacin de posicionamiento.

Para colocar el botn, haga clic en un botn y completo con el ttulo predeterminado aparecer
Nuevo botn.

Ahora usted tiene un botn en la interfaz de usuario listo para ir vamos a aadir un Texto
grande Widget exactamente de la misma manera - haga clic en l en la paleta, la posicin en
el diseador y haga clic para establecer la posicin. Tenga en cuenta que Android Studio
proporciona informacin de posicionamiento para ayudarle a alinear los componentes de la
interfaz de usuario.

Eso es todo y s la creacin de una interfaz de usuario completo complejo es simplemente


ms de lo mismo. Elija componentes de la Paleta y la posicin sobre la superficie de diseo.
Si usted se est preguntando lo que el icono de la bombilla se trata entonces es de destacar
en esta primera etapa que Android estudio intenta ayudar en todo lo que puede. La bombilla
de la luz significa que hay algn tema que le gustara tratar. Si hace clic en el icono, ver una
lista de los problemas reales o potenciales. En este caso el problema es que estamos usando
una cadena en el cuadro de texto y de buenas prcticas es que debemos usar un
recurso. Hasta que encontremos ms sobre los recursos puede ignorar este gentil advertencia.
Si ahora ejecuta el programa, haga clic en el icono de la pista verde y en el captulo 1, si usted
no sabe cmo hacer esto, usted podr ver su nueva interfaz de usuario.

Por supuesto que no hace nada, incluso si usted puede hacer clic en el botn. El botn haga
click pero no hay un cdigo conectada al evento click del botn de decir lo que debera
suceder - algo que trataremos en breve.

Propiedades
Nuestra prxima tarea es cambiar el ttulo en el botn.
Usted debe saber que los objetos tienen propiedades y mtodos.
Cosas como texto del ttulo, color de fondo y as sucesivamente para los widgets de interfaz de
usuario se representan como propiedades.
Puede cambiar las propiedades en clave o en tiempo de diseo se puede utilizar la ventana
Propiedades en la parte derecha de la pantalla. Si selecciona el botn y desplcese hacia
abajo en la ventana de propiedades es muy probable que encontrar la propiedad text del
botn. Este contiene actualmente el valor "Nuevo botn". Si cambia esto a "Click Me" y volver
a ejecutar la aplicacin, ver que el ttulo ha cambiado.
Puede establecer las propiedades iniciales de cualquiera de los widgets que usted ha puesto
en la interfaz de usuario. Hay un gran nmero de propiedades y tenemos que pasar algn

tiempo mirando a algunos de ellos. Sin embargo, por el momento lo importante es que usted
ver lo fcil que es cambiar una propiedad mediante la ventana de Propiedades.
Como se puede adivinar, la propiedad que ha cambiado como resultado un cambio en el
archivo XML que define la disposicin. El principio general es que el diseador crea el archivo
XML que se podra haber creado a mano, sin ninguna ayuda del diseador. En este sentido, el
diseador no aade nada al proceso, aparte de ser mucho ms fcil.
Como consejo, si hace doble clic en un widget a continuacin se le presentar un cuadro de
dilogo que le permite examinar y modificar las propiedades del texto y Identificacin del
widget en cuestin.

Tenga cuidado porque hay una "caracterstica" en Android Studio versin 1 que da lugar a un
componente que no tiene un identificador que se asigna un identificador nulo si se hace doble
clic y luego no introduce una cadena de identificacin.Si esto sucede, usted recibir un
mensaje de error cuando se ejecuta el programa y la nica forma de corregir el problema es
editar el archivo XML y quitar el <android: id> completamente. Es de suponer que un da esta
ser fijo.

Eventos
Ahora queremos hacer algo cuando se hace clic en el botn.
Android es compatible con un sistema orientado a eventos completa. As que lo que tenemos
que hacer ahora es definir un mtodo que se llama cuando se hace clic en el botn.
Si usted est familiarizado con otros idiomas que podran encontrar la manera de trabajar con
Java extraos sucesos y enrevesados. Es y vamos a tener que volver a descubrir la historia
completa de cmo los eventos se implementan despus.

Hay un nmero de diferentes formas de especificar un controlador de eventos pero la ms


sencilla es utilizar el diseador para generar el XML necesario para el sistema de transmisin
en circuito del controlador de eventos para el evento. Este no es un mtodo que se puede
utilizar todo el tiempo, slo funciona para el evento click, pero le ayudar a comenzar.
Utilizando los controladores de eventos diseador enfoque mtodo Click se mtodos
simplemente pblico de la actividad actual con la firma:
method( View v)

Usted puede llamar al mtodo todo lo que quieras, pero en la mayora de los casos, le ayuda a
especificar exactamente lo que el caso se maneja es. En este caso queremos manejar evento
onClick del botn - que se produce cuando el usuario hace clic en el botn con un ratn o ms
probablemente grifos en el botn utilizando un dispositivo sensible al tacto.
Cargue el archivo MainActivity.java en el editor de cdigo y aadir el siguiente mtodo:
public void buttonOnClick(View v) {
// do something when the button is clicked
}

Esto necesita ser aadido directamente siguiendo el mtodo onCreate o en cualquier lugar
que lo convierte en un mtodo de la clase MainActivity.
Cuando entras en este mtodo en el cdigo es casi seguro que notar una que Vista se
muestra en rojo y cuando se pasa sobre la palabra, ver un mensaje de error: No se puede
resolver Symbol View. Esto es porque cualquier clase utiliza que no se define dentro del
mismo archivo, y esto significa que la mayora de ellos, necesita una declaracin de
importacin. Las importaciones estn agrupados en la parte superior del programa y lo que
hay que aadir es la lnea:
import android.view.View;

Siempre se puede aadir una sentencia import manualmente pero Android Estudio tiene un
mecanismo general para la fijacin de simples omisiones y errores. Todo lo que tienes que
hacer es la posicin del cursor en la palabra que se muestra en rojo y presione Alt +
Enter. Esto soluciona el problema, ya sea, en cuyo caso la palabra cambia de rojo a su color
normal o que le ofrece una lista de alternativas que fijan el problema para que usted pueda
elegir.

La cosa ms importante a saber es que cuando ves una palabra en rojo - entonces no es un
problema que debe arreglar de forma manual o con la ayuda de Android Studio.
Cuando se utiliza una clase en su programa tiene que ser importado.
Con todo este cdigo fuera del camino si ahora cambia de nuevo al diseador y seleccionar el
botn. Desplcese hacia abajo en la ventana de la propiedad hasta que vea la propiedad
onClick. Si ahora hace clic en la flecha hacia abajo para ver la lista desplegable de opciones
posibles bajo control, debera verte mtodo buttonOnClick:

Alternativamente, usted puede simplemente escriba el nombre del controlador de eventos


como el valor de las propiedades.Observe que no escribe en los parmetros slo el nombre
del mtodo.
Eso es todo lo que hay que hacer - definir el controlador de eventos con la firma correcta y
establezca la propiedad onClick apropiado en la ventana de propiedades.
Cuando se trata de otro tipo de evento que usted tiene que hacer el trabajo en el cdigo - el
mtodo XML / diseador slo funciona para onClick.

Conexin de la Actividad de la interfaz de usuario


Ahora tenemos un controlador de eventos enganchado hasta el evento click botn que
normalmente queremos hacer algo que afecta a la interfaz de usuario como resultado.
Supongamos que cuando se hace clic en el botn que queremos cambiar el texto que aparece
en el widget de texto grande a "usted me hizo clic!".
Podemos hacer esto cambiando la propiedad text del widget de texto grande al nuevo texto. El
nico problema es cmo encontramos y referencia el widget de texto grande en el cdigo?
Este es un problema bastante comn cuando se utiliza un lenguaje de marcado para definir
una interfaz de usuario. El lenguaje de marcado define los widgets u otros objetos de interfaz
de usuario y el cdigo tiene que tener una manera de hacer la conexin a aquellos objetos de
interfaz de usuario.Por ejemplo en JavaScript que haga uso del mtodo getElementById para
recuperar un objeto DOM correspondiente a un elemento HTML en particular.
En Android hacemos algo similar.
En primer lugar, asegrese de seguir la idea de que todo el XML generado por el diseador
consigue convertido en un conjunto de objetos de Java, uno para cada widget y nete
colocado en la superficie de diseo. Estos objetos tienen el mismo rango de propiedades
como se vio en la ventana y mtodos Propiedades para hacer otras cosas.
Todo lo que necesitas hacer si encontrar una manera de hacer referencia a uno de ellos.
En el caso del objeto View que caus el evento esto es muy fcil, ya que se pasa al
controlador de eventos como el nico argumento de la llamada. As que si el controlador de
eventos es:
public void buttonOnClick(View v) {

y el controlador de eventos slo se engancha hasta el botn entonces usted puede estar 100%
seguro de que v es el objeto de botn cuando se produce el evento.
Si desea cambiar el ttulo del botn usted podra utilizar su mtodo setText para cambiar su
valor.
Nota: si usted no est acostumbrado a Java entonces vale la pena sealar que en general
todos los marcos de Java siguen la regla de que si un objeto tiene una propiedad llamada
myProperty, visible como tal en la ventana de la propiedad luego de cdigo configurarlo
usando setMyProperty y recuperarla usando getMyProperty.

As que todo lo que tiene que escribir, en principio, es:


v.setText("I've Been Clicked!");

pero esto no funciona porque v se declara como un objeto de vista general que no tiene un
mtodo setText - no todos Ver objetos tienen texto para ajustar.
Para llamar al mtodo setText de Button tenemos que desechar V de su tipo correcto - un
botn.
Nota: casting es donde usted le dice al sistema del tipo de objeto que se est trabajando. Si
ClassB es una subclase de classA entonces usted puede tratar a un objeto ClassB como
classA - despus de todo lo que tiene todos los mtodos y propiedades que classA hace por
herencia. Sin embargo, si usted desea hacer uso de una propiedad o un mtodo que slo
ClassB tiene entonces usted necesita para lanzar la referencia al objeto ClassB para hacer su
tipo claro.
Por ejemplo. asumiendo ClassB hereda de classA:
classA myObject = new classB();

crea una instancia de ClassB pero miObjeto se declara de tipo classA. Esto est bien pero
slo se puede acceder a los mtodos y propiedades del objeto classA. Pero si intentas
myObject.classBMethod();

a continuacin, se producir un error si classBMethod slo existe en ClassB. Para utilizar el


mtodo ClassB tienes que echar miObjeto a su tipo real:
(classB) myObject

Puede almacenar una referencia al elenco de una nueva variable:


classB myClassBObject = (classB) myObject;

y luego llamar al mtodo


myClassBObject.classBMethod();

o simplemente puede hacer el molde sobre la marcha a costa de un par extra de parntesis:
((classB) myObject).classBMethod();

Sin embargo, si usted utiliza simplemente aadir el elenco a Button usted descubrir que las
banderas Android Studio un error al mostrar Button en rojo. Ustedes han visto una vez antes la

primera vez que utiliz la clase View. En este caso tiene dos usos de un nuevo botn de clase
sin importarlo.

Si nos fijamos en el mensaje indicio que sugiere pulsando Alt + Enter, que siempre es un buen
consejo, ya que produce una lista de posibles soluciones para el problema. En este caso hay
que aadir la definicin de clase al inicio del programa.
import android.widget.Button;

Usted puede hacer esto de forma manual, es decir, usted puede escribirlo, o simplemente
presione Alt + Enter para aceptar la sugerencia.
Si pasa el ratn sobre el nombre de la clase Button corregido tambin ver una bombilla. Si
hace clic en este que ofrecer a partir la declaracin y la asignacin por ser mejor
estilo.Android estudio est lleno de consejos y ofertas para hacer que el cdigo mejor a cada
paso - usted no tiene que aceptarlas.
Por el momento vamos a seguir con la lnea nica.
Button button=(Button) v;

Ahora tenemos el objeto de botn podemos llamar a su mtodo setText:


button.setText("I've Been Clicked!");

El controlador de eventos completa es:


public void buttonOnClick(View v) {
Button button=(Button) v;
button.setText("I've Been Clicked!");
}

Ahora bien, si se ejecuta el programa, ver el cambio el ttulo del botn cuando se hace clic en
el botn.
Observe que este mtodo slo funciona si se conoce el tipo de objeto que caus el evento y
llama al controlador de eventos. Si su controlador de eventos slo se conecta a un solo widget
de entonces usted sabe el tipo del objeto que caus el evento.

Ahora supongamos que queremos hacer algo para uno de los otros widgets en la vista. En
este caso tenemos que encontrar el objeto que representa el widget sin la ayuda de la
argumentacin del controlador de eventos.
Por ejemplo, cmo encontrar el TextView que colocamos debajo del botn?
En el controlador de eventos del botn es el objeto que caus el evento suceda por lo que ya
se encuentra pero cmo encontrar otro widget en el diseo?
Este es un patrn muy estndar en el trabajo con objetos de vista de la actividad. Primero
usted hace uso del objeto R encontrar Identificacin del widget. En este caso la TextView se
ha dado el TextView Identificacin por defecto, as que podemos utilizar:
R.id.textView:

y este devuelve un entero nico que identifica el widget.


A continuacin, utilizamos las Actividades
findViewById(int)

mtodo que tiene el ID de nmero entero y devuelve el objeto Java correspondiente a


Identificacin.
Por supuesto, esto se devuelve como un objeto View porque findViewById no conoce el tipo de
objeto que devuelve ms precisin. As que tenemos que echar a hacer uso del objeto
TextView.
Reuniendo todo esto da:
TextView myTextView=(TextView)
findViewById(R.id.textView);

Una vez ms Android Studio quejarse TextView y si pulsa Alt + Enter se agregar la
importacin de clases al inicio del programa para usted:
import android.widget.TextView;

Ahora que tiene el objeto TextView se puede utilizar el mtodo setText para cambiar lo que se
muestra:
myTextView.setText("You Clicked My Button!");

El controlador de eventos completa es:

public void buttonOnClick(View v) {


Button button=(Button) v;
button.setText("I've Been Clicked!");
TextView myTextView=(TextView)
findViewById(R.id.textView);
myTextView.setText("You Clicked My Button!");
}

Si ahora ejecuta el programa, ver que se le informa de dos veces el hecho de que este botn
muy importante ha hecho click en:

Usted puede pensar que todo esto es un material muy pequeo y nada como una aplicacin
real, pero as es como construir una interfaz de usuario funciona en Android.
Ahora ya sabe cmo disear una sola aplicacin la pantalla utilizando los widgets disponibles
en la caja de herramientas de diseo y la forma de conectarlos para manejar sus eventos de
clic, encontrar el objeto Java que los representa y cmo llamar a mtodos que las modifican.

Aparte de los detalles finos de cmo cada uno de los widgets de obras - botones de opcin,
casillas de verificacin y as sucesivamente usted ahora tiene el esquema general de cmo
construir una sola aplicacin pantalla.

Resumen

Una actividad es la unidad de la aplicacin para Android y que corresponde


aproximadamente a una pantalla completa de la interfaz de usuario ms el cdigo para
que funcione.

En la mayora de los casos va a crear una actividad para cada pantalla de interfaz de
usuario que desea presentar a su usuario.

Slo una Actividad de que aplicacin se est ejecutando en un momento dado.

Una actividad es un solo subproceso y se ejecuta en el hilo de interfaz de usuario.

Se puede establecer que la actividad se inicia la aplicacin en el Manifiesto - Android


Estudio establece este a MainActivity por defecto.

La actividad tiene eventos correspondientes a las diferentes etapas del ciclo de vida en
ella. El evento onCreate se llama cuando la aplicacin inicia por primera vez y es aqu
donde se realiza toda la inicializacin.

Tambin puede restaurar el estado aplicaciones de ejecuciones anteriores en este


punto.

La Actividad continuacin, carga una vista o ViewGroup objeto para crear la interfaz de
usuario.

Puede crear objetos Vista / ViewGroup de tres maneras posibles: en el cdigo, usando
XML o utilizar el diseador para generar el cdigo XML.

El diseador es mucho, la forma ms fcil de crear una interfaz de usuario.

Al abrir el archivo XML que puede utilizar el diseador para colocar los widgets
correspondientes para ver objetos en la superficie de diseo.

Puede utilizar la ventana de propiedades para establecer las propiedades de cada


widget.

El archivo XML que crea el diseador es utilizado por la actividad para establecer su
interfaz de usuario mediante la creacin de objetos Java que corresponden a cada uno
de los objetos View colocados mediante el diseador.

Cuando hace referencia a una clase que no est definido en el archivo, es decir, la
mayora de ellos, entonces usted necesita para aadir una sentencia import al principio
del cdigo.

Si utiliza Alt + Enter cuando el cursor se encuentra dentro de cualquier palabra que se
muestra en rojo a continuacin Android estudio ayudar a solucionar el problema.

Puede conectar los controladores de eventos onClick definidos dentro de la actividad


actual de los widgets de la ventana de propiedades.

Un controlador de eventos onClick es slo una funcin pblica con la firma


MyEventHandler (Ver v)

El parmetro Ver objeto se enva al objeto vista que provoc el evento. Esto se puede
utilizar para acceder a las propiedades / mtodos del objeto View que el usuario con el
que tratamos.

Para acceder a otros Objetos de visin sigue el patrn estndar de:

1.
1. Encuentra el id entero a travs del string id, situado en el diseador, del objeto
de recurso widget de usar R.id.stringId.
2. Utilice la Identificacin del nmero entero para recuperar el objeto Java
correspondiente al widget usando findViewById (int Id)
3. Trabajar con mtodos / propiedades del objeto para modificarlo.

3. Aventuras Android - la construccin de la interfaz de


usuario

Si usted ha estado leyendo las aventuras de Android, en este punto a entender cmo la
actividad y el Vista se unen para crear una aplicacin sencilla, pero la interfaz de usuario de
Android es ms complicada que la mayora debido a su necesidad de hacer frente a una serie
de muy diferente pantalla tamaos y orientaciones. En este captulo, ahora se actualiza a

Android Studio Version 1.0, nos fijamos en el problema de la disposicin y el trabajo con el
marco de interfaz de usuario. En la forma en que construimos una aplicacin de calculadora.
Cuando la construccin de una aplicacin para Android que te va a pasar mucho ms tiempo
de lo que puedas imaginar en el perfeccionamiento de la interfaz de usuario - la interfaz de
usuario. Por eso es importante que usted domina los conceptos bsicos para que pueda pasar
al cdigo que hace las cosas ms interesantes.
La curva de aprendizaje con cualquier marco de interfaz de usuario es ms o menos lo mismo.
Primero tienes que saber lo que constituye una aplicacin que puede ejecutar es decir, cuando
es el cdigo?
En el caso de Android se trata de una actividad.
Usted tiene que averiguar cmo se representan los componentes de interfaz de usuario, cmo
puede crearlas y cmo conectar la interfaz de usuario con el cdigo.
En el caso de Android este es un asunto de una jerarqua de objetos de vista y conectar con el
cdigo es una cuestin de encontrar los objetos que representan cada componente de interfaz
de usuario y la adicin de controladores de eventos.
Una vez que tenga los elementos bsicos que tienen que empezar a explorar los componentes
que se le ha suministrado para construir una interfaz de usuario.
En general, esto puede variar en el extremadamente simple - el botn por ejemplo - para
aplicaciones casi completos en s mismos - el Listview por ejemplo. Se necesitara mucho
tiempo para dominar todos ellos, pero lo que la mayora de los programadores hacer es
asegurarse de que pueden utilizar los componentes bsicos y luego averiguar acerca de los
componentes ms sofisticados ms grandes cuando sea necesario.
La buena noticia es que una vez que sabes cmo uno de los componentes, incluso el ms
simple, funciona entonces la mayor parte de ella generalizada a mayores cosas ms
complicadas.
Tambin tenemos que preocuparse de cmo el diseo de la interfaz de usuario - como el
tamao y la posicin y conjuntos de componentes.
Android es particularmente sofisticado en este sentido porque al ser un sistema operativo
mvil que tiene que lidiar con una amplia gama de tamaos de pantalla e incluso cambios de
orientacin, mientras que una aplicacin se est ejecutando.

Esto no es un simple temas y vamos a tener que considerar con ms detalle ms adelante,
pero por el momento slo vamos a echar un vistazo a los aspectos ms fciles de diseo de la
pantalla.

Explorando El Diseador
Como ya se ha explicado, hay tres formas de crear una interfaz de usuario.
1. Puede crear todos los objetos de vista en cdigo
2. Puede crear un archivo XML, adems el sistema convertirlo en objetos en tiempo de
ejecucin
o
3. puede utilizar el Diseador para crear interactivamente el archivo XML.
En muchos sentidos, 2 y 3 son el mismo enfoque es slo un cambio en cmo se crea el
archivo XML.
Si est usando Android Estudio continuacin, utilizando el Diseador es la forma ms simple y
ms productivo trabajar as que vamos a concentrarnos en este mtodo de crear una interfaz
de usuario.
Una sencilla interfaz de usuario
Iniciar Android Studio y crear un nuevo proyecto simple actividad blanco llamado UItest - esto
va a ser nuestro patio interfaz de usuario para el resto del captulo. Acepte todos los valores
predeterminados y esperar mientras se crea el proyecto.
Si abres la funcin activity_main.xml archivo en la carpeta app / res / layout entonces el
Diseador se abrir y usted ver la prestacin familiar del diseo por defecto.
Ahora es el momento de mirar a la paleta con ms detalle.
Los tres principales secciones de la paleta de mantener los componentes ms importantes de
la interfaz de usuario.
1. Los diseos son contenedores para otros componentes que proporcionan diferentes
reglas de diseo. Layouts son algo que se utiliza una vez por Actividad por lo que
probablemente no deberan estar en la parte superior de la lista.

2. La seccin Widgets contiene los ms frecuentemente utilizados componentes Botones, TextViews, casillas de verificacin y as sucesivamente. Este es el conjunto
de componentes que necesita para aprender a usar primero.
3. La tercera seccin - campos de texto son un conjunto de componentes de entrada de
texto que todo el trabajo en ms o menos la misma manera.

El Botn - En Profundidad
Dnde ms deberamos empezar - el Botn es casi el "Hola Mundo" de la construccin de la
interfaz de usuario.
Si usted sabe cmo trabajar con un botn usted est bien en su camino a la comprensin de
todos los componentes posibles.
La buena noticia es que ya hemos conocido y utilizado el botn en el Captulo 2 y descubri
cmo trabajar con l en el cdigo.
Sin embargo todava hay mucho que descubrir.

Generalmente hay tres cosas que hay que descubrir sobre el uso de cualquiera de los
componentes.
1. Cmo hacer que un principio parezca que lo desee. Se trata de una cuestin de
descubrir y configuracin de propiedades mediante el Diseador.
2. Cmo modificar la forma en que un componente se ve en tiempo de ejecucin. Esta es
una cuestin de encontrar la manera de trabajar con propiedades en cdigo.
y finalmente
3. Cmo conectar los eventos generados por el componente con el cdigo.
Configuracin de las propiedades suena fcil pero hay diferentes tipos de propiedades y estos
tienen diferentes formas adecuadas de que le permite interactuar con ellos.
Lo primero que tenemos que saber es cmo posicionar un componente.

Posicionamiento relativo
Antes de continuar con el proyecto de seleccionar y eliminar el defecto "hola mundo" texto que hace que probar cosas ms fcil tener una superficie de diseo limpio.
Luego haga clic en el botn de la paleta y observe la forma en que la informacin de diseo
cambia a medida que se mueve el botn de vuelta de la superficie de diseo.
Al mover el botn a su alrededor aparecen varios mensajes a AlignParent y una medicin del
relleno aplicado al establecer la propiedad margen.

Se trata de cmo los componentes se colocan con el RelativeLayout defecto - ms de lo que


ms adelante en este captulo. Vale la pena decir que la RelativeLayout es el ms sofisticado
de los Layouts y no el que desea utilizar para diseos simples. En la mayora de los casos no
son mejores, ms simple y ms fcil de controlar que el Layouts RelativeLayout.

Sin embargo, es el diseo se obtiene de forma predeterminada y en muchos casos es ms


eficiente que las alternativas.
En este diseo los componentes estn posicionados en relacin con otros componentes. Al
iniciar el nico otro componente es el propio diseo y por lo que son esencialmente posiciona
en relacin a su - es decir, toda la pantalla.
El RelativeLayout slo admite nueve posiciones diferentes para un componente:

Arriba - izquierda, centro y derecha

Centro - izquierda, centro y derecha

Abajo - izquierda, centro y derecha

Todos los componentes estn colocados en una de estas nueve localidades sino proporcionar
un posicionamiento ms fino se puede especificar un desplazamiento en trminos de un
margen que se puede ver como las flechas verdes.
En otras palabras, usted est colocando los componentes en decir la parte superior izquierda
de la pantalla, pero luego estableciendo un margen que puede mover el componente a la
posicin exacta que usted quiere. Esta combinacin de una de las nueve posiciones fijas en el
diseo, adems de los mrgenes de variacin continua de trabajo en conjunto para que pueda
colocar un componente en cualquier parte de la superficie de diseo.
Si juegas con el posicionamiento en el Diseador obtendr rpidamente la idea.
Como puede imaginar, hay propiedades que le permiten establecer la ubicacin y mrgenes
para cada posicin de manera manual.
Todas las propiedades de diseo comienzan con el diseo: nombre que el nombre da el
posicionamiento efectuado.
Por ejemplo, si nos fijamos en la ventana Propiedades, ver:
layout:alignParent

que podra ser superior, izquierda, abajo o hacia la derecha.


y
layout:centerInParent

que puede ser horizontal, vertical o ambos

Se puede ver que una combinacin de stos, ms


layout:margin

le da todas las posibilidades de posicionamiento que hemos visto en el Diseador.


Tenga en cuenta que no todos los ajustes de estas propiedades tienen sentido - por ejemplo,
diciendo que desea que el componente en la parte superior y centrado vertical no tiene
sentido.
Tambin vale la pena entender que, en lo que le permite ajustar la posicin de un componente
simplemente arrastrndolo a la ubicacin que desee Diseador est trabajando cmo
configurar correctamente mltiples propiedades. Usted puede hacer esto manualmente para
obtener el mismo efecto, pero el diseador simplemente desde donde se ha colocado un
componente.
Es por esto que es ms fcil dejar que el diseador establece las propiedades para usted.

As que el posicionamiento en una disposicin relativa es con respecto al recipiente - esto es


slo la primera opcin.
Sin embargo, las cosas se ponen un poco ms complicado, tan pronto como tengamos ms
de un botn, o en general cualquier componente, en el diseo. Si hace clic para colocar un
segundo botn y luego mover la ubicacin alrededor de la pantalla otra vez te dars cuenta de
que ahora alineaciones se muestran por primera Button, as como los padres.
En una disposicin relativa puede establecer la posicin de un componente relativa al
contenedor principal oa cualquiera de los otros componentes en el contenedor.
El Diseador posiciona el dispositivo que est utilizando en relacin con el componente ms
cercano o el contenedor principal.

Lo que esto significa es que si coloca un botn segundos con respecto al primer botn
despus el segundo se mueve si cambia la posicin de la primera - probarlo para ver cmo
funciona esto.
Lo que es menos obvio, pero lgico, es cualquiera de los componentes en posicin relativa se
movern si el aspecto del componente que se posicionan en contra de movimiento.Por
ejemplo, si un componente est posicionado en relacin con el lado derecho de otro
componente luego hacer el componente ms amplio mueve el componente que est
posicionado relativamente a ella.
Como puede imaginar hay un conjunto de propiedades que se pueden utilizar para colocar un
componente en relacin con otra distribucin: alignComponent tiene pares de sub-propiedades
que conectan dos componentes. Por ejemplo la parte superior: la parte superior da una
posicin relativa de la parte superior de uno de los componentes con la parte superior de otro,
de manera similar a la izquierda: la derecha coloca el lado derecho de un componente en el
lado izquierdo de otro. En cada caso, usted tambin tiene que proporcionar el texto Id del
componente que debe ser alineada a.
Todo esto suena muy complicado y podra dejarte pensando que todo es innecesario.
Sin embargo esto significa que usted puede construir conjuntos de componentes alinearon
todo a uno que est alineado con el recipiente de manera que todos se mueven juntos como
un grupo. Esto significa que puede colocar un componente con un desplazamiento de otro sin
importar el tamao de la primera componente es. Tambin puede configurar los componentes
para alinearse con el lado izquierdo y derecho de la pantalla y permitir la rotacin de vertical a
horizontal.
No obstante todo esto, dijo que es muy fcil de conseguir en un completo desastre con la
disposicin relativa en el Diseador. Si los componentes van a faltar, entonces es probable que
se encuentran en la parte superior de uno al otro. La forma ms fcil de solucionar este
problema fuera es ir a la ventana Propiedades y restablecer manualmente una de las
propiedades de posicionamiento.
Es bueno notar lo siguiente:

Utilice posicionamiento relativo a otro componente si tiene sentido lgico. Esto es, si
usted tiene un componente de entrada de texto, entonces tiene sentido para colocar su
botn de aceptar en relacin a su lado derecho.

Si coloca todo lo relativo a los padres contenedor entonces usted tiene efectivamente
una disposicin absoluta.

Si los cambios de tamao de la pantalla, entonces es posible que los componentes se


solapan entre s, si no hay suficiente espacio. Siempre haga sus diseos tienen un
montn de espacio innecesario.

Una buena estrategia cuando se trabaja con un grupo de componentes es escoger uno
de que la posicin con respecto al recipiente a continuacin, coloque todos los dems
componentes relativos a ella para asegurarse de que puede mover el grupo y
mantener las alineaciones.

Recuerde que algunos componentes pueden cambiar su tamao, as como la


ubicacin y esto puede modificar la posicin de los componentes posicionado con
respecto a ellos.

Tambin vale la pena sealar que hay otros componentes de diseo y no se limitan a la
componet RelativeLayout.
El componente RelativeLayout se utiliza por defecto pero se puede cambiar esto para
cualquiera de los otros componentes de diseo - Lineal, Tabla, Cuadrcula y marco.Tambin
hay otros componentes de contenedores que pueden ser utilizados en lugar de estos
componentes de diseo estndar.
Ms de esto ms tarde.
Una cosa vale la pena conocer en esta primera etapa es que los componentes tienen
propiedades de diseo que son proporcionados por su recipiente para que el conjunto de
propiedades que hemos contemplado, en relacin con el componente RelativeLayout son
nicos a la misma. Esto es, si usted utilizar otro Layout entonces usted tiene que aprender sus
propiedades de diseo desde cero.
De nuevo, esto es otro tema que tenemos que volver.
Para la mayora de aplicaciones el componente RelativeLayout es una buena opcin para una
combinacin de botones, texto, casillas de verificacin y as sucesivamente.

Dimensionamiento
En comparacin con el tamao de un componente de posicionamiento es casi trivial.
Todos los componentes tienen una altura y una propiedad de ancho y estos corresponden a la
altura y anchura dibujado cuando el componente est en realidad representa en la pantalla.
Usted puede haber notado que hay lo que parecen ser controladores de tamao de los
componentes que se colocan en el Diseador. Sin embargo, si intenta arrastrar estos para
cambiar el tamao de decir un botn te dars cuenta de que muchas veces no sucede gran
cosa.
La razn es que la mayora de los componentes cambian de tamao para acomodar a su
contenido. Este comportamiento de tamao automtico est establecido por la disposicin:
ancho y el diseo: altura propiedades. Usted puede modificar esta escribiendo en un tamao
por ejemplo exacto 100dp en el cuadro siguiente valor tot propiedad.
Tambin observa que se puede establecer un mximo y un mnimo para la mayora de los
componentes.

Configuracin de un mximo resultar que el contenido que se trunca si no


encaja. Configuracin de un mnimo es a menudo la mejor plan porque entonces el
componente aumentar de tamao cuando sea necesario.

Gravedad
Ahora llegamos a una propiedad que no es tan importante, pero necesita ser discutido porque
suena importante.
La gravedad es bsicamente slo otro nombre para la alineacin. Si usted tiene un botn y
establecer su propiedad gravedad al inicio y luego el texto que contiene se alinear a la parte
superior del interior del botn. Hay un montn de posibilidades de alineacin se puede
establecer la gravedad para pero la mayora son bastante obvias. La parte confusa es que
muchos componentes tienen una propiedad de alineacin de texto que puede ser utilizado
para anular el ajuste de la gravedad.
La gravedad es ms importante cuando se utiliza con un componente de diseo diferente - la
disposicin lineal cuando la propiedad layout_gravity establece cmo el componente debe
alinearse dentro de la disposicin lineal - ms de esto ms tarde.

El rbol de componentes
Si se mira a la esquina superior derecha de Android Estudio en el modo de diseo, ver una
ventana llamada rbol de componentes.
Esto es casi explica por s mismo y casi no necesita mucho ms que llamar su atencin.
Sin embargo nota que se puede ver la estructura de rbol de la distribucin a partir de
contenedor Disposicin. En el caso de un proyecto predeterminado se puede ver que el diseo
predeterminado es RelativeLayout y se puede ver la totalidad de los otros componentes
correctamente anidados dentro de sus contenedores primarios.

Observe que puede seleccionar y eliminar elementos de diseo directamente en el rbol. Esto
es til cuando se tiene un esquema complejo que ha ido tan mal que tienen dificultades para
seleccionar los componentes de forma fiable.
Una operacin interesante que vale la pena conocer, incluso si no se utiliza muy a menudo es
Morphing. Si selecciona un elemento en el rbol, haga clic derecho y seleccione Morphing se
le presentar con una lista de posibles alternativas. As, por ejemplo, usted puede cambiar un
botn para un botn de activacin una as sucesivamente.

Un ejemplo simple botn


Como el primer lugar de una simple demostracin nos dej un botn en el Diseador. Alinearlo
con el padre en la esquina superior izquierda - esto debera ser fcil, aparte de la tendencia a
ajustarse a los bordes superior e izquierdo.

Si le resulta difcil obtener una posicin aproximada y luego introduzca los mrgenes exactos
entonces siempre recuerde que usted puede ir a la ventana de propiedades y entrar
directamente:

El gran problema con este enfoque es que si selecciona el componente y lo mueve ni un poco
lo ms probable es que se ajustar a la orilla y usted tendr que introducir los valores de la
propiedad de nuevo.

Luego se coloca un widget de texto grande en el Diseador. En este caso la alineacin que
queremos es que el texto est en la misma lnea que el texto en el botn. Esta es una
alineacin de lnea de base, pero si tienes Diseador ampliada para que pueda ver el rea
completa de la pantalla lo ms probable es lo nico que podr hacer es alinear a la parte
superior o inferior del botn:

Para lograr la alineacin de lnea de base que tienes que usar cerca del 100% de zoom. Utilice
las herramientas de zoom en la parte superior derecha del diseador.

En muchos casos, si no se puede conseguir la alineacin que desee a continuacin, aumentar


el zoom al mximo es a menudo la forma de lograr lo que estamos tratando de hacer.En este
caso se puede mover el widget de texto a cerca de la ubicacin correcta y que se ajustarn a
la alineacin de la lnea de base:

Usted puede ver el cambio en el factor de zoom desde el tamao de la barra de ttulo y el
mensaje. No es fcil definir el diseo de interfaz de usuario cuando no se puede ver toda la
pantalla.
Entonces, qu debe hacer?

Usted podra comprar un monitor ms grande para que pueda trabajar de forma interactiva en
el 100% de zoom todo el tiempo.
Usted podra desacoplar la ventana de diseo que que tiene el rea completa de la pantalla
para trabajar con ellos.
Por ltimo se puede utilizar el hecho de que usted sabe lo que est haciendo para establecer
el diseo: lnea de base alignComponent: lnea de base para el objeto Button en la ventana de
propiedades.
en la prctica, el zoom dentro y fuera suele ser la opcin ms fcil.

Orientacin Y Resolucin
Uno de los mayores desafos en la creacin de aplicaciones para Android est permitiendo
para la gama de tamaos de pantalla y orientaciones. Android Estudio le permite ver su diseo
en una amplia gama de dispositivos, orientaciones y resoluciones. Esto hace que sea mucho
ms fcil.
Podemos probar nuestra disposicin en modo horizontal con slo seleccionar la opcin
paisaje:

Tambin puede ver lo que su interfaz de usuario se ve como en la gama completa de tamaos
de pantalla compatibles seleccionando Vista previa de todos los tamaos de pantalla:

Para diseos simples, esto es probablemente suficiente, pero Android tiene ms en la manga
para ayudarle a trabajar con diferentes pantallas de tamao. En particular, se puede hacer uso
de "fragmentos" y usted puede crear un diseo distinto para cada orientacin de la pantalla y
la resolucin.
Por ejemplo, si crea un nuevo paisaje archivo de diseo llamado activity_main.xml es decir,
exactamente el mismo que el archivo de diseo retrato ya ha creado, pero en la carpeta layouttierra. Ahora puede editar el diseo del paisaje y este ser usado automticamente cuando el
usuario gira el dispositivo en modo horizontal.
Lo que pasa es que cuando se inicia su aplicacin el sistema recoge el mejor archivo de
diseo disponibles para la pantalla de acuerdo a lo que se ha almacenado en las carpetas de
recursos es decir, el diseo para el retrato y el diseo-tierra para el paisaje ..
Cuando se gira el dispositivo se reiniciar el sistema de su aplicacin y carga el mejor
diseo. Si slo tiene un diseo retrato entonces se utiliza para todas las orientaciones, pero si
usted tiene un archivo de diseo de paisaje, entonces se usar para el modo de paisaje.
Por ejemplo: si le aadimos un diseo de paisaje, utilice Crear Variacin del paisaje, a la
disposicin de los botones y el texto dado anteriormente entonces inicialmente la disposicin
retrato se utiliza como plantilla para el diseo de paisaje.
Pero lo que se quiere colocar el texto en el botn en el modo de paisaje:

Ahora bien, si se ejecuta la aplicacin utilizando el simulador va inicialmente ver la pantalla


retrato. Si gira el simulador para el modo horizontal - usar Ctrl-F11 - a continuacin,
dependiendo de la velocidad de su mquina, ver una pausa donde la disposicin retrato es
visible y luego se cambiar a la disposicin del paisaje.
Si no parece funcionar darle tiempo porque puede ser muy lento - recuerde que necesita un
reinicio aplicacin completa.
Si tambin ver la aplicacin en una amplia gama de dispositivos que puede girar con el paisaje
y ver su diseo horizontal personalizado.

En general, el mejor plan es crear un diseo retrato completo y generar un diseo de paisaje lo
ms tarde posible en el desarrollo por lo que no tiene que repetir retoques de interfaz de
usuario.
Observe tambin que la conmutacin automtica de diseos hace que un problema
potencial. Cuando se cambia el diseo de su aplicacin se reinicia y esto significa que puede
perder su estado actual - es como si su aplicacin slo se ha iniciado por el usuario. Tenemos
que mirar en la aplicacin del ciclo de vida y cmo preservar el estado para resolver este
problema - ver ms adelante.

Tambin puede utilizar el mismo enfoque para apoyar diferentes resoluciones de pantalla. La
idea es la misma - varios archivos xml diseo estn disponibles uno para cada resolucin y el
sistema selecciona automticamente cul usar.
Esto es un poco ms complicado de lo que se trata de orientacin, ya que podra as tener que
proporcionar diferentes imgenes de resolucin para que el diseo se ve bien - ms sobre
esto despus de que hemos mirado los recursos y la gestin de recursos.
Esto es slo nuestro primer vistazo a un aspecto particular del desarrollo de aplicaciones para
Android que hace ms complicado que el desarrollo para un tamao de pantalla fija - que
resulta no ser tan difcil como podra parecer a primera vista.

Una primera aplicacin


Como un ejemplo de la construccin de una aplicacin sencilla utilizando el diseo y
Diseador Construyamos una calculadora.
Algunas de las tcnicas utilizadas en esta aplicacin son un poco ms all de lo que hemos
cubierto hasta ahora, pero usted debera ser capaz de seguir y es el momento de mostrar lo
que algo ms que una sola aplicacin botn se parece.
Esta es una muy simple calculadora - tiene slo nueve botones numricos y una
pantalla. Toma los valores en cada uno de los botones y los aade a un total acumulado. No
hay botones de operador, sumar, restar o claro - pero se puede agregarlas.
Iniciar un nuevo proyecto Actividades blanco llamado ICalc o lo que quieras llamarlo. Acepte
todos los valores predeterminados.
El principio de funcionamiento es que vamos a establecer una red de diez botones. Ajuste
cada botn para 0 a 9 como una etiqueta de texto. A continuacin, vamos a asignar el mismo
manejador onClick a cada uno de los botones. Todo lo que va a hacer es recuperar la
proyeccin ttulo de texto en el botn, convertirlo a un nmero entero, aadirlo a la suma de
capital y luego almacenar de nuevo en el TextView despus de convertir de nuevo a una
cadena.
El Cdigo
As que el cdigo es bastante fcil.
Necesitamos un campo privado para mantener el total de ejecucin en:
private int total = 0;

Lo siguiente que necesitamos una funcin onButtonClick que se va a utilizar para controlar el
evento onClick para todos los botones. Vase el captulo 2 si usted no sabe acerca de la
gestin de eventos.
El botn que el usuario ha hecho clic se pasa como un objeto de vista como el nico
argumento de la funcin y podemos usar esto para obtener su ttulo de texto:
public void onButtonClick(View v) {
Button button = (Button) v;
String bText = button.getText().toString();

Ahora que tenemos el botn de ttulo por ejemplo, 0, 1, 2 y as sucesivamente podemos


convertirlo en un entero y aadirlo al total acumulado:
int value = Integer.parseInt(bText);
total += value;

Por ltimo tenemos la TextView usando su Identificacin (vase el captulo 2) y ajustar su texto
al total convierte en una cadena:
TextView myTextView = (TextView)
findViewById(R.id.textView);
myTextView.setText(Integer.toString(total));
}

El controlador de eventos completa es:


private int total = 0;
public void onButtonClick(View v) {
Button button = (Button) v;
String bText = button.getText().toString();
int value = Integer.parseInt(bText);
total += value;
TextView myTextView = (TextView)
findViewById(R.id.textView);
myTextView.setText(Integer.toString(total));
}

Pon este cdigo dentro de la clase MainActivity como uno de sus mtodos.
Al entrar en este cdigo podrs ver muchas de las clases y mtodos en rojo. Esto se debe a
que es necesario que se destinen a ser utilizadas por el proyecto. Usted puede hacer esto
manualmente, aadiendo las declaraciones de importacin necesarias en el inicio del
archivo. Es mucho ms fcil para colocar el cursor en cada uno de los smbolos en alt rojo y

pulse + enter y seleccione Importar clase si es necesario.Esto debe ser cada vez ms una
segunda naturaleza por ahora.
El Layout
Ahora dirigimos nuestra atencin a la disposicin. Abra el archivo de diseo, elimine el texto
predeterminado y coloque un solo botn en la superficie de diseo.
Haga doble clic en l, se trata de un acceso directo a las propiedades de texto e id, y entre 7
como su propiedad Text.Coloque el botn en la parte superior derecha de la pantalla con un
poco de espacio.
Luego vaya a la ventana Propiedades y encontrar la propiedad onClick. Pngalo a
onButtonClick:

Para crear la red de diez botones seleccione el primer botn y copiarlo en el


portapapeles. Siguiente pega el botn de copiado a la superficie de diseo y cada posicin de
tiempo dentro de la red con respecto a los botones que ya estn presentes. Ahora usted tiene
la rejilla de botones que todos dicen 1. Haga doble clic en cada uno a su vez y cambie el texto
a 8,9, 4,5,6, 1,2,3 y 0.

Mediante el uso de la copia y pegar truco ahora tiene diez botones configurados con la misma
controlador de eventos onClick y al que tena que hacer era editar la propiedad Text.Trate de
asegurarse de que cada botn se agrega es relativo a uno de los otros botones. Usted puede
comprobar que usted ha hecho esto con xito arrastrando uno de los botones y ver si todos
siguen! Si uno dos no se trate de poner ellos en relacin con uno de los otros botones. Si
usted encuentra cualquier zoom difcil posicionamiento en.
Si te metes en un lo a todos borrar y empezar de nuevo.
Para hacer esta mirada ms como un teclado, seleccione la tecla 0 y el tamao de forma que
ocupa un ancho doble:

Por ltimo aadir un Texto grande Ver en la parte superior.Puede colocarlo en relacin con la
tecla fila y the7 superior y luego dimensionar de forma que se extiende por todo el conjunto de
botones.

Ahora usted debera ser capaz de mover todo el bloque cuando se mueve slo el botn 7 para
una nueva ubicacin.Esto no siempre funciona porque uno o ms de los botones estn
situados con respecto al recipiente.!
Es bueno saber que usted puede deshacer una accin mediante el uso de Ctrl-z. Si encuentra
Diseador demasiado difcil trabajar con crear este diseo, y puede ser difcil, es posible que
prefiera para establecer las propiedades de diseo utilizando la ventana de propiedades.
Por ltimo, ejecute el programa de la forma habitual y que bebe ser por favor para descubrir
su primera aplicacin no calcular realmente las cosas!

Intente girar el emulador para ver cmo se ve en modo horizontal.


No est mal, pero como prometi ya que la aplicacin se reinicia a perder cualquier clculo
que estaba realizando ya que la aplicacin se reinicia cuando cambia la orientacin.

Si puedes probarlo en un dispositivo Android verdadera hacerlo - es ms fcil de averiguar lo


que realmente siente.Tambin hacer echar un vistazo a lo que el diseo se ve como en una
serie de pantallas y orientaciones.
Esto no es mucho de una calculadora, pero podra hacerlo en una realmente buena.

alinear a la derecha del texto en la pantalla

aadir un botn + y - e implementar la accin

permite al usuario entrar en nmero de varios dgitos

aadir una tecla del punto decimal y todo un flotador de varios dgitos

aadir un * / claves

aadir una tecla de borrado

etctera ...
Hay mejores formas de implementar el diseo y vamos a volver al programa de calculadora en
captulos posteriores.

Resumen

Puede crear el archivo de diseo XML a mano, pero utilizando el diseador es ms


fcil.

Todava es til saber cmo funciona el archivo XML para que pueda editarlo cuando
Diseador le permite bajar de alguna manera.

El Diseador modifica la forma en componentes miran en el diseo cambiando las


propiedades de un componente.

Cmo colocar un componente depende del diseo que est utilizando.

El RelativeLayout permite grabar componentes de posicin relativa entre s o al


contenedor.

El diseador puede cambiar varias propiedades para colocar el componente donde


usted quiera.

Utilice el rbol de componentes para seleccionar los componentes que son difciles de
seleccionar en el Diseador.

Puede utilizar la ventana de propiedades para seleccionar y establecer cualquier


propiedad directamente.

Si usted encuentra el posicionamiento o dimensionamiento difcil en el Diseador


procura acercar la imagen.

Puede usar Android Studio para ver lo que su aplicacin se ve como en diversos
tamaos de pantalla y orientaciones.

Puede copiar y pegar los componentes en el Diseador de construir rpidamente


diseos de interfaz de usuario repetidas.

Un nico controlador de eventos se puede unir a muchos componentes.

4. Aventuras Android - Controles bsicos y Eventos


Trabajar con Android Studio hace que la construccin de la interfaz de usuario fcil con un
editor interactivo, pero usted todava tiene que encontrar la manera de manejar las cosas no
es tan bueno. En este captulo de nuestro libro electrnico en Android el camino fcil nos
fijamos en los componentes de interfaz bsicos y manejo de eventos en general - es decir,
ms all de onClick.

Hemos pasado revista a los principios generales de la construccin de una interfaz de usuario,
pero ahora tenemos que pasar algn tiempo mirando a los componentes ms bsicos que se
pueden utilizar para crear una aplicacin.
Tambin tenemos que encontrar la manera de trabajar con cualquier evento y no slo
onClick. A pesar de que la mayora de los controles se pueden utilizar con gran xito utilizando
slo el evento onClick - hay otros tipos de eventos que no se pueden manejar simplemente
estableciendo una propiedad onEvent en la ventana de Propiedades. En este captulo
analizamos en profundidad en el manejo de eventos Android.
Como antes se har hincapi en el uso de Android Studio y el editor de diseo para obtener la
mayor parte del trabajo realizado como sea posible.
Vamos a empezar con el problema de cmo escribir un controlador de eventos.

El Android Handler general Evento


Si ha utilizado otros idiomas aparte del Java se podra esperar controladores de eventos a ser
simplemente funciones que se pasan a controles para registrarlos como detectores de eventos
- es decir, funciones que son llamadas cuando se produce un evento. Puede ser que incluso
ha usado un IDE que agrega controladores de eventos de forma automtica para usted, pero
Android Estudio actualmente no hacer esto - hay que aadir cdigo para manejar y evento. Sin
embargo, s ayuda con la generacin automtica de este cdigo.

Eventos en Java son un poco ms complicado porque no se puede pasar una funcin como un
argumento como puedas en JavaScript, C # y muchos otros idiomas - se puede en la ltima
versin de Java pero ser en algn momento antes de los marcos de la interfaz de usuario y
catchup Android si alguna vez hacer. En Java funciones slo puede existir como mtodos de
objetos por lo que si quieres pasar una funcin que tiene que pasar un objeto que tiene la
funcin como mtodo.
Como resultado de lo que debe pasar a registrar un detector de eventos es ms complicado
en Java que en muchos otros idiomas. La forma en que funciona todo fue inventado en la
dcada de los marcos de Java de interfaz de usuario, tales como GWT y ms tarde
perfeccion en Swing. Android utiliza el mismo enfoque.
Como ya se ha mencionado que no se puede pasar de una funcin que tiene que pasar un
objeto que contiene una funcin que puede controlar el evento. Es evidente que la funcin de
gestin de eventos tiene que ser capaz de manejar el evento y por lo tanto se define en
funcin del tipo de evento.
Por ejemplo un evento onClick necesita un controlador que devuelve void y acepta un objeto
View, que es el objeto del evento se produjo en.
Para asegurarse de que un detector de eventos tiene el tipo adecuado de manejo de eventos
eventos de funcin se definen usando una interfaz.
Si usted recuerda una interfaz es como una clase sino que simplemente define las funciones
que una clase tiene que soportar. Si una clase hereda o implementa una interfaz, entonces
usted tiene que escribir cdigo para cada funcin definida en la interfaz.
Por ejemplo, el OnClickListener es una interfaz que define una sola funcin
void onClick(View v)

cualquier clase que implementa OnClickListener tiene que tener una funcin onClick de este
tipo.
Para crear un controlador de eventos para el evento onClick que tienes que hacer las
siguientes cosas:
1. Crear una nueva clase que implementa la interfaz OnClickListener
2. Definir el controlador de eventos onClick encargo dentro de la clase
3. Crear una instancia de la nueva clase dentro de la actividad

4. Utilice el mtodo setOnClickListener del botn para agregar el objeto detector creado
en el paso 3 para el evento.
Este es el patrn general de que hay que seguir en la aplicacin de cualquier controlador de
eventos - slo el nombre del objeto que tiene que crear, el mtodo que hay que definir. Usted
tambin tiene que descubrir qu informacin se pasa como estndar para el controlador de
eventos.
Suena complicado - as es y hay maneras de simplificar, pero primero vamos a ver cmo se
hace exactamente como se describe.
Esta no es la mejor manera de hacer el trabajo, pero es la forma en que todo funciona,
en principio, y es importante entender lo que est pasando.
Esto es tanto un ejercicio para principiantes Java, ya que es una explicacin de la gestin de
eventos. Si su Java es buena no dude en saltar hacia delante.
Para implementar un controlador de eventos para el evento onClick primero tenemos que
aadir una nueva clase al proyecto. Haga clic derecho sobre la carpeta bajo la carpeta de Java
y seleccione Nuevo, Java Class y llamarlo MyOnClickListener.
Nota: Para los usuarios de otros idiomas, vale la pena sealar que Java tiene una convencin
casi irrompible que cada clase se almacena en su propio archivo del mismo nombre.
Siguiente editar MyOnClickListener leer:
import android.view.View;
public class MyOnClickListener
implements View.OnClickListener {
public void onClick(View v){
//process event
}
}

Note que ahora hemos creado una clase con un mtodo nico que es nuestro controlador de
eventos. En un caso real que iba a escribir un montn de cdigo en lugar de la simple
observacin de que hizo algo que ocurri el evento.
Ese es el primer paso completado. A continuacin Mover a la Actividad y primero recuperar el
objeto Button:
Button button=
(Button)findViewById(R.id.button);

A continuacin, creamos una instancia de nuestro detector de eventos:


MyOnClickListener Listener=
new MyOnClickListener();

y, finalmente, utilizamos mtodo setOnClickEventListener del botn para conectar su evento


onClick a nuestro nuevo objeto detector:
button.setOnClickListener(Listener);

Eso pone todo junto:


@Override
protected void onCreate(
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=
(Button)findViewById(R.id.button);
MyOnClickListener Listener=
new MyOnClickListener();
button.setOnClickListener(Listener);
}

Ahora bien, si se ejecuta el programa, usted encontrar que la funcin onClick en la instancia
MyOnClickListener se llama cuando se hace clic en el botn.
El mismo mtodo general funciona para cualquier evento.
Usted simplemente tiene que descubrir el nombre de la interfaz de detector de eventos, crear
una clase que lo implementa, cree una instancia de la clase y registrar el detector con el
componente que genera el evento.
Esto no es muy prctico, ya que va a necesitar para crear una nueva clase para cada evento
que desea manejar y adems estas clases se va a contener un mtodo y deberan ejecutarse
slo una vez.
Tiene que haber una manera mejor!
Ahora que usted ha visto los fundamentos de eventos de Java direccin Podemos ejemplo las
dos formas que suele hacerse en la prctica.

Dos maneras de manejar un evento

Para evitar los gastos generales que puede utilizar uno de dos mtodos posibles:

utilizar una clase annima

implementar la interfaz en la actividad.

Clase Anonymous
Java tiene clases annimas por slo la situacin que estamos tratando de resolver. Te permite
crear efectivamente un objeto, es decir, una instancia de una clase, sin tener que crear
explcitamente una clase. La nica pega es que no se puede crear una segunda instancia de
la clase - esta es una manera de atajo de crear una instancia de un objeto.
En el caso de un controlador de eventos se puede tomar una interfaz e implementarlo como
clase y crear una instancia de una sola vez. Esto es slo taquigrafa azcar, sintctico si te
gusta por lo que hicimos en la seccin anterior.
Por ejemplo:
MyInterface instance=new MyInterface{

functions which are needed to


implement MyInterface
}

Esto crea una instancia de la aplicacin de MyInterface que est contenida dentro de las
llaves. No hay necesidad de definir una clase para obtener una instancia - pero note que slo
se puede obtener una instancia.
As que para nuestro manejador de eventos onClick usando una clase annima hace las
cosas mucho ms fcil, ya que no necesitamos un archivo separado para mantener la nueva
clase y, de hecho, ni siquiera necesitara la nueva clase simplemente:
View.OnClickListener Listener=
new View.OnClickListener(){
@Override
public void onClick(View view) {
//Implement event handling
}
}

y la instancia de nuestra oyente completa con nuestro controlador de eventos onClick de


encargo est listo para ser utilizado como antes:
button.setOnClickListener(Listener);

Por supuesto, usted puede ahorrar una variable y slo tiene que utilizar la clase annima en el
setOnClickListener como en:
button.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
//Implement event handling
}
});

Nosotros no siempre tenemos que utilizar la variable de escucha, pero el costo es que
tenemos que tener cuidado de no olvide cerrar la llamada a la funcin con un parntesis.
La buena noticia es que Android estudio le ayudar a crear la clase annima. Si usted
comienza a escribir en OnClickListener que le proporcionar opciones para completar el
nombre y usted puede seleccionar OnClickListener - que luego generar funciones ficticias para
todos los mtodos definidos en la interfaz. Todo lo que tienes que hacer es proporcionar el
cdigo en el cuerpo de cada una de las funciones que hace lo que quiere.
Implementar la interfaz en la actividad
La forma alternativa de hacer las cosas es simplemente usar la clase MainActivity para
implementar la interfaz de detector de eventos. Esto parece un poco extrao cuando lo primero
que ves, pero es la aproximacin ms cercana a la forma en otros idiomas hacen el trabajo.
Por ejemplo, para controlar el evento onClick tenemos que aadir los "instrumentos" para la
interfaz de la Actividad:
public class MainActivity extends Activity
implements View.OnClickListener {

Ahora todo lo que tiene que ocurrir es que la clase de actividad tiene que implementar el
manejador de eventos onClick:
@Override
public void onClick(View view) {
//Handle Event
}

Todo lo que queda es aadir el detector de eventos utilizando setOnClickEventListener pero


cul es la instancia?

Si recuerdan lo que sucede es que el sistema crea una instancia de la clase MainActivity para
obtener su aplicacin en ejecucin y la instancia actual de una clase es siempre "esto".As que
tenemos que aadir al mtodo onCreate:
button.setOnClickListener(this);

En muchos sentidos, esta ltima forma de hacer las cosas es la ms sencilla.


Tiene el inconveniente de que hay que aadir un "instrumentos" para cada evento que se va a
manejar, pero esto podra ser una ventaja ya que le permite ver qu eventos se estn
utilizando.
Observe tambin que el uso de este mtodo se ajusta a todos los controladores de eventos
utilizando
somecontrol.setOnSomeEvent(this);

Esto tambin implica que usted va a utilizar el mismo controlador de eventos para un evento,
independientemente de que el control ha generado el evento. Es decir que va a escribir una
sola funcin onClick y esto se utilizar para todos los controles que se utilizan setOnClickEvent
(este) en.
Si desea utilizar varios controladores de eventos - uno para cada control entonces usted
necesita utilizar el enfoque de clase annima.
Qu enfoque de controladores de eventos debe usted utilizar?
En la prctica el enfoque de clase annima parece ser la mejor porque, aunque es un poco
ms complicado que es completamente general. Uso de la Actividad para implementar la
interfaz falla cuando se necesitan diferentes controladores de eventos vinculados a cada
control.
En este sentido vale la pena el esfuerzo extra y es la utilizada en el resto de este libro. Si
desea utilizar el mtodo XML introducido anteriormente para el evento onClick o implementar
la interfaz en el enfoque de la actividad entonces esto debe causar ningn problema.

Los controles de entrada bsicos


Ahora que hemos descubierto cmo funcionan los eventos es el momento de echar un vistazo
a los controles de entrada ms usados.
Los controles de entrada bsicas son:

Botones

Los campos de texto

Las casillas de verificacin

Botones de radio

Botones Toggle

Si ha programado el uso de otros marcos de muchos de estos IU sern conocidos por usted y
es probable que pueda saltar a slo los que le interesan.
Comenzando desde el principio sin embargo Vamos a revisar el Botn pero en un poco ms
de detalle

Botones
Hay dos tipos bsicos de botn - Botn y ImageButton - pero el Android Estudio Caja de
herramientas tiene tres botones, el pequeo botn y ImageButton.
Pequeo Button es slo un control Button estndar, pero con un estilo aplicado para hacer el
tipo de letra ms pequeo y por lo tanto ms adecuado para un pequeo botn. El
ImageButton es lo mismo que el botn, pero tiene una propiedad src que puede ajustarse a
una imagen que se muestra como el icono del botn y no mostrar ningn texto.
Las principales propiedades que se trabaja en el caso de un botn es son cosas como fondo que se pueden ajustar a un color o un grfico. Puede pasar mucho tiempo cambiando la
manera botones se ven, sino en el principal la nica propiedad importante de un botn es su
manejador onclick.
Un botn en la interfaz de usuario a hacer clic.
Si usted pone un ejemplo de un botn, el pequeo botn y ImageButton en la superficie de
diseo se puede utilizar la ventana de propiedades para personalizarlos.
Ajuste el fondo del botn de color gris oscuro, haga clic en los puntos suspensivos a la
derecha de la propiedad y luego seleccionar la pestaa Sistema en el navegador de recursos
que aparece. Desplcese hacia abajo y ver un conjunto de colores predefinidos que se
pueden utilizar. Encuentra darker_grey y seleccionarlo.

Para el pequeo botn de establecer la propiedad del fondo de un dibujable de la misma


manera - es decir, desplcese hacia abajo en el navegador de recursos hasta que vea
"drawables" y luego seleccione ic_menu_add.
Vamos a discutir el uso de los recursos y drawables en un captulo posterior. Por ahora
simplemente asumen que son estilos y elementos grficos que se pueden seleccionar.

Repetir la tarea para el ImageButton pero establecer la propiedad src para ic_menu_add.
El resultado es los tres botones que se muestran en la siguiente imagen:

Puede pasar mucho tiempo explorando maneras de hacer uso de las propiedades de un botn
para disearlo apenas como usted quiere que se vea.

Para adjuntar un controlador de eventos click en los tres botones que puede simplemente
definir una funcin:
public void doButtonClick(View e){
//process event
}

en la actividad y establecer la propiedad onClick en cada botn para doButtonClick.


Usted puede encontrar ejemplos del uso de los botones de esta manera en los captulos
anteriores.
Ahora que sabemos cmo manejar eventos utilizando clases annimas vale la pena hacer el
mismo trabajo de esta manera.
Como queremos asignar el mismo controlador de eventos para los tres botones tenemos que
crear una instancia de OnClickListener. Todo lo que tienes que escribir es:
View.OnClickListener onClick=new O

y seleccione OnClickListener y dej Android Estudio generar:


View.OnClickListener myonClickListener=
new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}

Observe que no genera un punto y coma final para no olvide aadirlo. Tambin es necesario
rellenar los datos del controlador de eventos onClick - slo hay tanta Android Studio puede
hacer por medio de la escritura de su programa.

Por ltimo es necesario configurar la instancia en cada uno de los botones:


Button button =
(Button)findViewById(R.id.button);
Button button2 =
(Button)findViewById(R.id.button2);
ImageButton imgbutton =
(ImageButton)findViewById(R.id.imageButton);
button.setOnClickListener(myonClickListener);
button2.setOnClickListener(myonClickListener);
imgbutton.setOnClickListener(
myonClickListener);

Ahora al hacer clic en cualquiera de los botones de la myonClickListener se llama.


Tambin vale la pena sealar que mientras que un botn no tiene otra funcin en la vida ms
que para ser pulsado todos los otros controles tambin puede responder a un evento
onClick. Es decir, se puede utilizar cualquier cosa como un botn si quieres.

Propiedades de expertos
Si usted ha mirado en cualquier ejemplo del uso de botones en la documentacin, o si nos
fijamos en algo mayor cdigo de Android, usted puede descubrir algunos "trucos" que parece
que no puede realizar usando Android Studio - esto no es realmente el caso .
Por ejemplo, supongamos que desea establecer un icono dentro de un botn de texto
estndar para que muestre a la izquierda del texto que contiene el botn. Esto parece ser
imposible si se restringe a s mismo a las propiedades que se presentan en la ventana de
propiedades.
Si las operaciones de bsqueda de los detalles de las propiedades que Button hereda
encontrar

drawableLeft

drawableRight

drawableStart

drawableEnd

drawableBottom
y

drawableTop

que no estn en la lista de la ventana de propiedades. Estos le permiten mostrar un dibujable,


es decir, un grfico, en el lugar especificado en relacin con el texto.
De manera que cambiar drawableLeft al recurso icono queremos mostrar hara el trabajo, pero
cmo podemos configurarlo?
La solucin es que no hay un icono a la derecha de la parte superior de la ventana de
propiedades que se puede hacer clic para ver "Propiedades de expertos", es decir todas las
propiedades que admite el control.

Si selecciona el botn y haga clic en Propiedades de expertos ver entre las nuevas
propiedades que figuran - drawableLeft.Haga clic en el botn de puntos suspensivos junto a l
y seleccione un dibujable de su opcin para mostrar el icono a la izquierda del texto:

En la mayora de los casos, slo tendr que trabajar con las propiedades que se muestran en
la ventana de propiedades, pero s es necesario saber cmo acceder al resto. Tambin vale la
pena teniendo en cuenta que algunas de las propiedades de expertos no se mostrarn
correctamente por el diseador a fin de utilizar con cuidado.

Los campos de texto


TextFields son la manera de conseguir que el usuario introduzca un texto para que se procese
y como se puede adivinar que forman una parte importante de la mayora de las interfaces de
usuario.
Hay un montn de campos de texto proporcionado en la caja de herramientas, pero todos
funcionan de la misma manera que slo difieren en el tipo de entrada que esperan que el
usuario escriba. En el curso de aplicaciones en desarrollo se encontrar con la mayora de
ellos, tarde o temprano, pero que realmente slo necesita saber cmo utilizar uno de ellos
para entender cmo funcionan.
Si ha utilizado otro marco UI entonces habrs encontrado con algn tipo de campo de texto
antes, pero el control de Android es un poco diferente, ya que en general, ofrece al usuario un
teclado virtual personalizado - un editor de mtodos de entrada IME.

Usted puede construir sus propias IME pero por el momento le permite utilizar slo los
proporcionados por el sistema.
Si desea que el simulador de Android para hacer uso de la IME que un dispositivo Android
verdadera usara entonces usted necesita para anular la seleccin del teclado de hardware
opcin actual cuando se crea la AVD (dispositivo virtual de Android). Si el simulador hace uso
del teclado de la mquina host que no se ve el IME en absoluto.
Lo primero que debemos aclarar es que a pesar de que parece que hay una gran cantidad de
diferentes tipos de controles de campo de texto en la caja de herramientas que son ejemplos
del control EditarTexto con su propiedad InputType establecido en un valor particular. Cuando
usted pone una en la superficie de diseo, ver que es de tipo EditarTexto y si se desplaza
hacia abajo a su propiedad InputType puede cambiar el tipo de entrada del campo de texto se
encargar.
Cuando se utiliza un InputType particular, el usuario se presenta con un teclado virtual que es
apto para escribir un valor - por ejemplo, si se especifica un valor numrico a continuacin, el
teclado slo muestra los nmeros.
Usted tambin consigue una tecla de accin en la parte inferior derecha del teclado que el
usuario puede pulsar para completar la egSend accin para un mensaje SMS decir.
Para seleccionar el botn de accin para un teclado especial, utilice un botn Enviar para una
entrada de texto general, entonces usted tendr que utilizar la vista Propiedades de Expertos y
seleccione un valor para la propiedad imeOptions.

Para ajustarlo a actionSend ejemplo obliga a un botn Enviar para que se muestre:

Hay muchas otras propiedades que se pueden utilizar para personalizar un campo de texto,
pero hay una tarea estndar pena explicar en detalle - escribir un controlador para el evento
onEditorAction.

El EditorAction Evento
Volviendo al control EditarTexto vamos a aadir un controlador para el botn Enviar. Esto
proporciona otra oportunidad para un ejemplo del proceso general de la adicin de un
controlador de eventos.
En primer lugar un EditarTexto de un correo electrnico en la superficie de diseo y el uso de
las propiedades de expertos como se describe en la ltima seccin para aadir un botn
Enviar para el IME que aparece cuando el usuario introduce texto - encontrar imeOptions y
seleccione actionSend.
Antes de que pueda manejar cualquier nuevo evento que tiene que descubrir el nombre de la
interfaz de detector de eventos y el mtodo de Seton para ese evento.
Para el evento EditorAction la documentacin revela que la interfaz de escucha se llama
OnEditorActionListener y el mtodo Seton es setOnEditorActionListerner.

As, utilizando esta informacin podemos proceder como antes y una clase annima para
implementar el controlador de eventos. En este caso tambin podramos hacer el trabajo
dentro de la setOnEditorActionListener como el controlador de eventos slo se necesitar por
ste de control:
EditText email = (EditText) findViewById(
R.id.editText);
email.setOnEditorActionListener(
new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v,
int actionId,
KeyEvent event){
return false;
}
});

Al igual que antes usted no tiene que escribir todo esto en. Android Estudio generar por usted
si escribe nueva ONED .. y selecciona la opcin correcta.
Ahora todo lo que queda es escribir el controlador de eventos - onEditorAction.
Usted puede buscar los detalles del controlador de eventos en la documentacin, pero el trozo
generado para la funcin de controlador es a menudo suficiente para hacerle saber lo que los
parmetros son:
@Override
public boolean onEditorAction(
TextView textView,
int i,
KeyEvent keyEvent)

En este caso TextView es el control que el evento est asociado con, i es el identificador de
accin y KeyEvent es nulo a menos que se utiliz la tecla enter.
Si la accin se ha consumido entonces la rutina debe devolver true cuando no hay otros
controladores tendrn la oportunidad de procesarlo. En Java en general los eventos pueden
ser transmitidos a otros controles que contienen el origen del evento.
Para un ejemplo sencillo vamos a aadir un TextView y transferir el texto que el usuario ha
introducido cuando seleccionan el botn de enviar - imagino que este es el envo de un correo
electrnico o sms o algo ms emocionante.
Todo lo que tenemos que hacer es conseguir emitir el parmetro v a un EditarTexto y
encontrar el TextView que hemos aadido a la interfaz de usuario. A continuacin ponemos a
prueba para ver si el usuario selecciona el botn de envo o algn otro botn y si tenan que
transferir el texto:
public boolean onEditorAction(TextView v,
int actionId,
KeyEvent event) {
EditText email=(EditText) v;

TextView tv=(TextView) findViewById(


R.id.textView);
if(actionId== EditorInfo.IME_ACTION_SEND){
tv.setText(email.getText());
}
return true;
}

Observe el uso de la clase esttica EditorInfo para obtener el identificador de entero


correspondiente a la accin de envo.La clase EditorInfo tiene un montn de constantes y
mtodos tiles.

Las casillas de verificacin


Una casilla de verificacin es un elemento bastante obvio UI.Se muestra una etiqueta pequea
y controlada por la propiedad de texto y una garrapata o ninguna garrapata. El usuario puede
activar o desactivar tantas casillas como se desee.
En la mayora de los casos, no se molestan en tratar con el estado de una casilla de
verificacin hasta que el usuario pulsa algn otro control - por lo general un gran botn
marcado Done o similar. A continuacin, puede descubrir el estado de la casilla de verificacin
por el simple uso del mtodo isChecked que devuelve verdadero o falso.

Por ejemplo, si usted tiene una opcion con checkBox Identificacin entonces usted puede
descubrir su estado cuando un botn en algn lugar de la vista se hace clic en el uso de:
public void onClick(View v){
CheckBox box= (CheckBox) findViewById(
R.id.checkBox);
boolean checked = box.isChecked();
}

La casilla de verificacin tambin apoya el evento onClick y esto puede ser usado para
procesar los cambios en su estado y se puede configurar el controlador de eventos onClick
usando la ventana Propiedades como en el caso de un botn.

As que para manejar el cambio checkBox de Estado todo lo que tienes que hacer es
configurar su controlador de eventos onClick a:
public void onClick(View v){
CheckBox box=(CheckBox) v;
boolean checked = box.isChecked();
}

Si necesita modificar un valor CheckBox luego usar el setChecked o los mtodos de


alternancia.

Los interruptores y botones de alternancia


Los interruptores y botones de alternancia son slo CheckBoxes en otro formato. La tienda de
uno de los dos estados y que cambia de estado cuando el usuario hace clic en ellos - al igual
que un CheckBox.

Puede comprobar el estado de un botn interruptor / palanca utilizando el mtodo isChecked y


usted puede utilizar su evento onClick para monitorear cuando sus cambios de estado. La
nica diferencia real es que se puede utilizar el Texton y textOff para establecer lo que se
muestra cuando el interruptor / conmutador est encendido o apagado.
Vale la pena teniendo en cuenta que el interruptor es nuevo en Android 4 y no funciona en
versiones anteriores.

Botones de radio
El ltimo miembro de los "simples" controles de entrada es el RadioButton. Esto funciona
exactamente igual que un CheckBox en que puede estar en uno de dos estados, pero la gran
diferencia es que un conjunto de componentes RadioButton trabaja en un grupo y slo uno de
ellos puede ser seleccionado a la vez.
La razn de la "botn de radio" plazo es que en los primeros das de la electrnica radios de
coche tena botones mecnicos de ajuste dispuestos en una lnea que permita que el
conductor seleccione rpidamente en uno emisora pulsando un botn. Cuando puls un botn
nuevo el botn actual apareci de manera que un solo botn se pulsa en un momento dado asegurndose de que slo se escuch una estacin a la vez.
La nica complicacin en el uso de componentes RadioButton es asegurarse de que los
agrupan correctamente. Para ello tenemos que hacer uso de un contenedor RadioGroup que
se utiliza para contener todos los botones que funcionan juntos.

Utilizando Android Studio puede crear un grupo de componentes RadioButton colocando


primero un recipiente RadioGroup en la superficie de diseo y luego colocar tantos
RadioButtons dentro del contenedor como necesite.
Ver el RadioGroup destacada en naranja cuando se pasa el cursor sobre l listo para soltar
un RadioButton en ella. Si un grupo de componentes RadioButton no funcionan como se
espera lo ms probable es que usted no tiene todos los botones dentro del RadioGroup.

Todos los componentes RadioButton en un RadioGroup trabajar automticamente de modo


que slo un botn se puede seleccionar a la vez - usted no tiene que hacer ningn trabajo
adicional para implementar este comportamiento.
Para saber qu botn se ha seleccionado puede utilizar el mtodo isChecked como en el caso
de la CheckBox - de hecho, se puede trabajar con un conjunto de componentes RadioButton
exactamente de la misma manera que un conjunto de casillas las nicas diferencias son el uso
de la RadioGroup y un solo botn se pueden seleccionar en cualquier momento.
Usted puede utilizar el evento onClick para detectar cuando cualquier botn se ha modificado
y el setChecked o los mtodos de ajuste puedan modificar el estado de un botn.

Resumen

En Java no se puede pasar de una funcin para configurar un controlador de eventos


que tiene que pasar un objeto.

Cada tipo de evento tiene su propia interfaz que es utilizar para crear un objeto que
tiene los mtodos necesarios para el evento.

La manera ms directa de crear un controlador de eventos es crear una nueva clase


que implementa la interfaz y luego crear una instancia de la clase para controlar el
evento.

Para evitar los problemas de tener que crear una nueva clase para cada controlador de
eventos Java introdujo la clase annima. Puede utilizar una clase annima para
implementar una interfaz de eventos y crear una instancia del mismo en un
movimiento.

Alternativamente, puede utilizar la actividad para implementar la interfaz.

Los controles bsicos que componen la mayor parte de la sencilla interfaz de usuario
de Android son
Botones
Los campos de texto
Las casillas de verificacin
Botones de radio
Botones Toggle

Cada control se personaliza utilizando sus propiedades y controladores de eventos

Algunas propiedades estn ocultos a usted por Android Estudio menos que seleccione
el botn de Expertos.

5.

Aventuras Android - Trabajar con formatos

La interfaz de usuario Android se basa en las subclases de vista. Un grupo particular de


objetos derivados de Vista son los diseos. Un diseo es un contenedor para otros Ver
derivados de objetos. Cuando se le pide al diseo para hacer s mismo, hace que toda la vista
objetos que contiene dispuesto en el interior del rea de la pantalla que ocupa.
Al usar Android Estudio que tiene sentido utilizar el editor de formato. Tambin vale la pena
acostumbrarse al XML que genera porque a veces este es el ms rpido, y en ocasiones la
nica, manera de hacer los cambios que desee.
El diseo por defecto utilizado por Android Studio es el RelativeLayout y hemos mirado a
usarla en captulos anteriores - pero no es el nico diseo que puede utilizar con el Diseador.
Hay cinco Layouts soportados actualmente:

FrameLayout

LinearLayout

RelativeLayout

TableLayout

GridLayout

De stos RelativeLayout y LinearLayout son los ms utilizados, con FrameLayout viene un


distante tercer lugar.Los dos ltimos, TableLayout y GridLayout, son adecuados para tipos
especiales de interfaz de usuario y no son tan fciles de usar o como bien soportado en
Android Studio. Por esta razn, este captulo presenta los tres diseos que usted puede
conseguir la mayora del trabajo de IU bsico hecho con.
Antes de analizar estas alternativas y cmo trabajar con ellos vale la pena llegar a enfrentarse
con las ideas bsicas de Layouts y los principios que son comunes a la mayora de los
diseos.

Propiedades de la maquetacin
Mayormente se tiende a pensar en las propiedades que son relevantes para un control como
pertenecientes al control, pero un diseo puede hacer su trabajo de muchas maneras y podra
necesitar el control para tener un montn de propiedades muy especficas para determinar la
forma en que se coloca.
En otras palabras, las propiedades que un control necesita para trabajar con un diseo
dependen del diseo elegido y esto hace que las cosas difciles de organizar. La forma ms
sencilla pero inviable de implementar esto sera insistir en que todos los controles
implementado todos los bienes utilizados por cada Layout - incluso los que no se utilizan
actualmente.
La solucin al problema es que cada Diseo define una clase anidada derivado de
LayoutParams, que tiene todas las propiedades que necesita el control de definir. El control
crea una instancia de la clase LayoutParams apropiada y as vara los parmetros que tiene
acceso a la funcin del contenedor de diseo que se encuentra en.
As, en el Diseador y en la ventana Propiedades de un control tiene dos tipos de
propiedades:

Las propiedades que pertenecen al objeto

Propiedades que son requeridos por el objeto Layout.

Se puede decir que las propiedades de diseo, ya que son del nombre layout_ forma en el
archivo XML. Se los puede ver en la ventana Propiedades en el diseador, pero se muestra
como el diseo: nombre.

Tambin vale la pena conocer en esta primera etapa que el Diseador menudo presenta un
conjunto simplificado de diseo: propiedades que luego asigna a un conjunto ms amplio y
ms confuso de layout_ propiedades en el XML.

Anchura y Altura
El conjunto exacto de propiedades de diseo que se ve depende del diseo que utilice. Sin
embargo, hay dos que apoyan todos los diseos:

layout_width

layout_height

Estos visualizacin en la ventana Propiedades como

diseo: Ancho

diseo: altura

Se podra pensar que la anchura y la altura de un control eran propiedades que deberan
pertenecer a un control, pero aqu las cosas son ms sutiles.
Un control no necesariamente tiene un tamao fijo.
Se puede, por ejemplo, pedir al diseo para darle el mayor espacio posible, en cuyo caso la
Disposicin establece el tamao del control. Esta es la razn por la que los controles tienen
layout_width y layout_height y no slo anchura y altura.
Puede establecer estas propiedades para cualquiera de los tres valores posibles:

un tamao fijo, por ejemplo 24px

wrap_content - establece el tamao de modo que slo se adapta el contenido del


control sin recortes

match_parent - le permite el control a ser tan grande como el Layout padre puede
permitir

Si utiliza el ratn para arrastrar el marco de un control en el diseador entonces lo que sucede
depende del control y el Diseo.
En la mayora de los casos el valor predeterminado establecido por el Diseador se
wrap_content y ignorar cualquier intento que haga para dimensionar interactivamente un

control. De hecho, en la mayora de los casos tratando de cambiar el tamao de forma


interactiva un control no cambia el diseo: ancho o el diseo: altura propiedades. Sin embargo,
dependiendo de la disposicin en uso podra aparecer para cambiar el tamao del control
debido a la configuracin de otras propiedades de diseo - ms de esto cuando tratamos con
particulares tipos de diseo.
El punto es que el diseo: la anchura y el diseo: la altura no son necesariamente las
nicas propiedades que controlan el tamao final que aparece de un control.
Una cosa es bastante seguro - si usted desea establecer un tamao fijo para un control luego
tienes que escribir los valores en la ventana de Propiedades.

Unidades
Si usted va a entrar en un tamao fijo o una ubicacin, entonces tenemos que saber cmo
hacerlo. Android es compatible con seis unidades.
Dos estn relacionados a los pxeles:
px - pxeles
Esta es la unidad que es ms tentador usar la primera vez que empezar a crear una
aplicacin, ya que por lo general tiene un dispositivo de prueba en mente con un tamao de
pantalla en particular y resolucin. Esto no es una buena idea si usted quiere que su
aplicacin se vea ms o menos lo mismo que los cambios de resolucin de pantalla.
dp - pxeles independientes de la densidad
Esta es la unidad ms utilizada, ya que se ajusta a la resolucin de la pantalla. Si el dispositivo
tiene una pantalla con 160 pxeles por pulgada entonces 1DP es el mismo que 1px. Si el
nmero de pxeles por pulgada entonces el cambio dp a cambios de relacin px en la misma
proporcin. Por ejemplo, a 320 pxeles por pulgada 1DP es el mismo que 2px.El punto es que
mediante el uso de pxeles independientes de la densidad puede mantener los controles del
mismo tamao que los cambios de resolucin.
Observe que esto no compensar el tamao de la pantalla. Si se mantiene el nmero de
pxeles fijos y el doble de la resolucin luego las mitades de tamao de la pantalla. Un control
en la pantalla especificada en px entonces mostrar a la mitad de su tamao original. Un control
especificado en dp exhibira en su tamao original pero ocupan el doble de la inmobiliaria
pantalla.
El punto es que el uso de dp le protege frente a las pantallas de cambiar su resolucin,
no su tamao fsico.

Si especifica tamaos en dp entonces su disposicin tendr el mismo aspecto en una tableta


de 7 pulgadas, no importa lo que la resolucin que tiene.
Adems de las medidas basadas en pxeles tambin hay tres unidades del mundo real:
mm - milmetros
en - pulgadas
pt - puntos de 1/72 de pulgada
Los tres trabajan en trminos del tamao de la pantalla y el nmero de pxeles utiliza un
control est relacionado con la resolucin de pantalla. Si la pantalla tiene 160 pxeles por
pulgada entonces 1/160 en = 1 px y as sucesivamente.Tenga en cuenta que una vez ms
estas unidades le protegen contra cambios de resolucin, pero no cambios en el tamao de la
pantalla real. Su botn puede ser de 1 pulgada de ancho en todos los dispositivos, pero la
cantidad de la pantalla se usa hasta depende del tamao de la pantalla del dispositivo tiene.
El peligro en el uso de unidades del mundo real es que usted puede ser que tambin
especificar un nmero fraccionario de pxeles y terminar con una pantalla mirando
desordenado.
La unidad final que tambin se relaciona con pxeles, pero est ligado a la preferencia tamao
de la fuente del usuario:
sp - escala pxeles independientes
Esto funciona como la unidad dp en que se escala con la resolucin del dispositivo sino que
tambin se escala por la preferencia de tamao de la fuente a los usuarios por defecto.Si el
usuario define una fuente mayor preferencia tamao todos los valores de SP se escalan hasta
igualar.
Cul debe utilizar?
Simple - uso dp a menos que tenga una buena razn para no hacerlo, porque esto por lo
menos significa que si has probado tu interfaz de usuario en un dispositivo del tamao de x
que debera funcionar razonablemente en todos los dispositivos de tamao x, no importa lo
que la resolucin.
Por defecto Android Studio a trabajar en dp cuando se introduce un valor sin una unidad o
cuando interactivamente el tamao o mover un control.

Un control es slo una caja

En lo que se refiere a un diseo de un control es slo un rectngulo.


Su tamao est dado por layout_width y layout_height y estos se puede ajustar mediante el
control o, ms frecuentemente, por la Disposicin.
Una vez que el diseo conoce el tamao del control se puede colocar de acuerdo a las
normas que ha establecido el uso de las propiedades de la distribucin.
Si quieres saber la posicin de que un control se le ha asignado, puede utilizar sus
propiedades getTop y getLeft.Esto le da la posicin de la esquina superior izquierda del
rectngulo del control. Usted puede calcular dnde las otras esquinas estn utilizando
getWidth y getHeight, pero para hacer las cosas ms fciles tambin hay getRight y
getBottom.
Tenga en cuenta que la posicin de la esquina superior izquierda del rectngulo es siempre
relativa a la Disposicin es en - es decir, la posicin no es una posicin de la pantalla absoluta.
Tambin vale la pena saber que los controles tambin son compatibles con el relleno y
algunos mrgenes de apoyo Distribucin.
El relleno es un espacio muerto en el interior del control que acta como un espacio entre el
borde del control y su contenido.
Mrgenes y no todos los mrgenes de apoyo Diseos, estn muertos-espacio fuera de un
control que se puede utilizar para agregar espacio entre los controles.

Tenga en cuenta que el relleno es una propiedad del control y el margen es una propiedad de
diseo. Puede ajustar cada margen o material de relleno a la izquierda, derecha, arriba o
abajo de forma individual o para un solo valor para todos ellos.
En teora de relleno se utiliza para poner el espacio que rodea el contenido de un control, pero
tambin se puede utilizar simplemente para hacer que el control ms grande cuando sus
dimensiones se establecen para envolver su contenido.Por ejemplo. el botn de la izquierda
tiene cero relleno y el de la derecha tiene un acolchado de 30DP todo.

Del mismo modo mrgenes se utilizan para poner espacio alrededor de un control, pero que
pueden ser utilizados para posicionar un control con relacin a otro o a su contenedor - esto es
cmo funciona el RelativeLayout. Por ejemplo, se puede ver que el botn inferior se posiciona
en el RelativeLayout ajustando sus mrgenes.

Gravedad
La gravedad es a menudo considerado como misterioso, en parte por su nombre y en parte
porque a menudo hay dos propiedades de gravedad.
Bsicamente gravedad slo establece donde en un diseo dinmico algo est posicionado.
Configuracin simple gravedad son:

superior

fondo

izquierda

derecho

centro

center_vertical

center_horizontal

El significado de todo esto es obvio - el objeto slo se mueve a la posicin especificada. Sin
embargo, las cosas se complican un poco si, por ejemplo, intenta establecer un objeto para
mostrar a la izquierda cuando el tamao de su contenedor ha sido adaptada para ajustarse, es
decir, lo que ya es lo ms a la izquierda y la derecha, ya que puede ser .
Tambin puede configurar mltiples opciones de gravedad.Por ejemplo, puede establecer
izquierda y derecha al mismo tiempo, y esto slo se centra el objeto horizontalmente.
Lo que hace que la gravedad an ms complicado es que hay ajustes que cambian el tamao
del objeto afectado:

llenar

fill_vertical

fill_horizontal

En cada caso el objeto crece para llenar la dimensin especificada.


Tambin hay dos gravedades de recorte:

clip_vertical

clip_horizontal

estos trabajos con la parte superior, inferior, izquierda y derecha para recortar un objeto para
encajar el contenedor.Por ejemplo, si establece la gravedad para arriba y clip_vertical
entonces el objeto se colocar en la parte superior del contenedor y su borde inferior se
recortar.
La mayora de las veces usted slo tiene que utilizar los ajustes de gravedad como centro o
superior. Si intenta utilizar combinaciones complicadas entonces las cosas no suelen funcionar
como se podra esperar.
La complicacin final, que de hecho resulta ser bastante sencilla, es que los controles tienen
una propiedad de la gravedad y Distribucin de proporcionar una propiedad layout_gravity.
La diferencia es muy simple. La propiedad gravedad establece lo que sucede con el contenido
de un control y la layout_gravity establece cmo se posiciona el control que el contenedor
Layout.
Por ejemplo, si tiene un botn y establecer su propiedad gravedad al principio luego se
traslad el texto en el botn para alinearse con la parte superior.
Si, por el contrario, se establece layout_gravity de Button al principio todo el botn se mueve
hacia la parte superior del contenedor Layout.
Tenga en cuenta que no todos los diseos proporcionan una propiedad layout_gravity a sus
controles secundarios.

El FrameLayout

El FrameLayout es el ms simple de todos los diseos.


Realmente no hace mucho para posicionar los controles que contiene. Su uso est destinado
a albergar un solo control, es decir, lo que realmente se limita a actuar como un marco
alrededor de un control.
Si se coloca un FrameLayout en el diseo entonces usted descubrir que en el Diseador
parece estar formado por nueve reas:

Estas reas corresponden a los nueve lugares que se pueden crear mediante el
establecimiento de diseo: la gravedad de pares simples de valores - la parte superior
izquierda, superior central, arriba a la derecha y as sucesivamente.
Si se le cae un control en uno de los rectngulos entonces su diseo: la propiedad gravedad
se ajustar para realizar l exhibicin en el rea correcta de la FrameLayout. Usted puede usar
esto para posicionar varios controles en el mismo FrameLayout, notar que si el tamao total
cambia los diferentes controles bien pueden solaparse.

Si dos controles se superponen en un FrameLayout luego se dibujan en el orden en que se


agregaron. En otras palabras, el ltimo aadido se dibuja en la parte superior de los otros.
Este aspecto de la FrameLayout hace til si desea mostrar los mltiples controles y cambiar
entre los cuales uno es visible.En pocas palabras todos los controles en el FrameLayout y
seleccionar uno que sea visible mediante su propiedad visible.
Ms comnmente un FrameLayout se utiliza simplemente como un marcador de posicin para
un componente de una disposicin que no est especificado hasta algn tiempo despus. Por
ejemplo, si usted hace uso de un Fragmento, consulte Presentacin de Fragmentos Android ,
para crear parte de una interfaz de usuario o leer en una lista de cosas para mostrar, a
continuacin, a menudo se necesita un recipiente para el nuevo componente que est
presente en su diseo esttico. Un FrameLayout hace el trabajo muy eficiente.
Use un FrameLayout cuando se necesita el diseo ms simple que contendr uno o un
pequeo nmero de componentes sin necesidad de mucho en la forma de colocacin o el
tamao.

LinearLayout
El siguiente diseo tenemos que considerar es el LinearLayout.
Esto es un diseo simple que puede ser utilizado para hacer una gran parte del trabajo bsico
de la organizacin de una interfaz de usuario.
En Android Estudio LinearLayout aparece dos veces en la paleta - una vez como una vertical y
una vez como un LinearLayout horizontal. La diferencia, sin embargo, es slo el valor de la
propiedad a la orientacin horizontal o vertical.
Puede utilizar un LinearLayout como el diseo base y sustituir el nombre predeterminado
RelativeLayout que Android Studio proporciona o se puede colocar un LinearLayout dentro del
RelativeLayout.
Reemplazando un diseo con otro no es tan fcil como parece porque perders todos los
controles ya posicionados cuando se elimina el primer diseo. Si edita el archivo XML para
utilizar un diseo diferente, entonces no podra perder el control, pero las cosas se complican
si el nuevo diseo no admite el mismo conjunto de propiedades de diseo - que suele ser el
caso.
Android Estudio realmente no quiere que usted utilice cualquier diseo que no sea el
RelativeLayout como el contenedor inicial y por lo que no le permite eliminarlo en un intento de
reemplazarlo. Si usted realmente desea utilizar otra cosa entonces no tienes ms remedio que
editar el archivo XML directamente.
El LinearLayout horizontal acta como contenedor fila y una verticales actos LinearLayout
como un contenedor de columna.Puede utilizar LinearLayouts anidados para construir algo

que se parece a una mesa - pero si esto se pone muy complicado que es mejor usar un
TableLayout.
Si se coloca un LinearLayout en el RelativeLayout entonces se puede posicionar como
cualquier otro control. Si a continuacin, colocar otros controles dentro de ella entonces van a
apilar horizontalmente para formar una fila o verticalmente para formar una columna.
Esto suena fcil, pero hay un montn de maneras de utilizar un LinearLayout.
Por ejemplo, si pones una horizontal y una vertical en el LinearLayout RelativeLayout entonces
cmo se comportan depende de lo que se propuso su layout_width y layout_height a. Si lo
ajusta a wrap_content entonces los dos Layouts actan como un panel horizontal y vertical de
los controles, es decir, puede mover todos los controles como un bloque.

Las cosas se ponen ms interesantes cuando se anidan uno LinearLayout dentro de otro para
crear una tabla.
Por ejemplo, puede crear un teclado estilo calculadora anidando tres LinearLayouts
horizontales dentro de una sola LinearLayout vertical. Es decir, coloque un LinearLayout
vertical en la pantalla y luego coloque tres LinearLayouts horizontales dentro de ella. Dentro
de cada LinearLayout horizontal colocar tres botones. Si tiene dificultades para hacer este uso
de la ventana rbol de componentes para asegurarse de que los componentes estn anidados
correctamente.

Esto es ms fcil disponer de utilizar el RelativeLayout. El botn de final se acaba de colocar


en el LinearLayout vertical y forma una fila de todos los suyos.
No hay mucho ms que decir sobre el uso de LinearLayout aparte de una vez de empezar a
usarlo y luego tiende a ser el que usted piensa de utilizar con demasiada frecuencia. Es muy
atractivo el uso de un LinearLayout como un dispositivo de agrupamiento cada vez que
necesite una fila o columna de los controles.

Layout_weight
Hay un ltimo misterio de la LinearLayout para discutir, layout_weight.
Esta es una propiedad de diseo que slo el LinearLayout apoya.
Si asigna un layout_weight a cualquiera de los controles en un LinearLayout entonces los
controles se ajustan en tamao para llenar cualquier espacio no utilizado en proporcin a su
peso.
La parte realmente importante de esta descripcin es "el espacio no utilizado". Lo que pasa es
que Android calcula primero el diseo ignorando cualquier asignacin de peso.Esto significa
que los controles se establecen en los tamaos especificados. A continuacin, el sistema
determina qu espacio no se utiliza en el LinearLayout que contiene. Este se distribuye entre
los controles que tienen valores distintos de cero de layout_weight en proporcin a su peso.
Por ejemplo, supongamos que tenemos un LinearLayout horizontal con tres botones todo listo
para wrap_content. La pantalla se ha hecho girar para proporcionar una gran cantidad de
espacio no utilizado para el ejemplo:

Se puede ver que hay una gran cantidad de espacio no utilizado a la derecha. Si ahora nos
fijamos el diseo de la primera Button: peso a 1, que se asignar a todos que el espacio no
utilizado:

Si ahora configurar la disposicin del segundo de Button: peso a 1, entonces el espacio no


utilizado ser compartida entre los dos primeros botones por igual:

Se puede adivinar lo que sucedera si ahora ponemos el diseo de la tercera Button: peso a 1
- el espacio sera compartida por igual y los tres botones sera del mismo tamao. Si, sin
embargo, el primer botn se le dio un peso de 2 a continuacin, el espacio no utilizado sera
compartida en la relacin 2: 1: 1 y as sucesivamente.
Ms interesante an, qu crees que pasara si ha asignado un ancho fijo para el tercer
botn?
La respuesta es simple.
Si el diseo de la tercera Button: peso es cero, entonces se ajusta a la anchura especificada y
los otros dos botones obtener el espacio no utilizado - por ejemplo estableciendo el tercer
botn de 350dp da:

Sin embargo, si el tercer botn tiene un diseo: establece entonces es probable que cambiar
su anchura, ya que obtiene una parte del espacio no utilizado al igual que los otros botones de
peso.

En otras palabras, cuando se establece una disposicin distinta de cero: peso un control
puede cambiar su tamao, incluso aunque haya establecido un tamao especfico para ello.
Esto nos lleva a la idea de "tamao medido" y "tamao real".En el caso del tercer botn de su
tamao medido es 350dp pero si su trazado: peso no es cero, entonces su tamao real en la
pantalla ser diferente - que utilizar parte del espacio no utilizado.
Cuando se trabaja con componentes de cdigo de las propiedades getWidth y getHeight le
darn el ancho real y la altura del control. Las propiedades getMeasuredWidth y
getMeasuredHeight le dar el ancho y la altura medido antes se ha realizado ningn ajuste por
el Diseo.
Por ltimo, vale la pena sealar que si usted quiere estar seguro de que los tres botones son
del mismo tamao que tiene que establecer sus anchos para 0DP y peso a 1 (o el mismo
valor).
Por qu es necesario?
Al configurar el ancho a cero todo el espacio no se utiliza y el sistema ser dividido en partes
iguales entre cada uno.
Tambin puede ajustar su anchura hasta cierto valor mnimo constante y luego dejar que el
mecanismo de accin con cargo a peso el espacio no utilizado.

RelativeLayout
El RelativeLayout es el favorecido por Android Studio.
Es un componente de diseo complejo y sofisticado y usted puede pensar que usted debe
preferir ms simples componentes de diseo, si es posible. Por ejemplo, usted a menudo
puede utilizar un nmero de LinearLayouts para hacer el trabajo de un solo RelativeLayout.
La regla ms comnmente citado es que usted debe tratar de disear la interfaz de usuario
usando el menor nmero de diseos. En particular profundo anidacin, de disposiciones, es
decir, un diseo dentro de otro, las cosas lentas abajo porque el sistema tiene que cavar
profundamente en cada capa de diseo y esto puede tomar un montn de trabajo.
La regla es:
Prefiero un diseo sofisticado superficial a un profundo nido de Diseos simples.
Y RelativeLayout es el ms sofisticado de todos.

Generalmente, usted puede reemplazar un conjunto de LinearLayouts anidadas con un


RelativeLayout.
Para un diseo tan capaz, RelativeLayout hay pocos propiedades de diseo. Estos se dividen
en dos grupos:

propiedades relacionadas con el posicionamiento de la control con respecto al


contenedor padre

propiedades relacionadas con el posicionamiento relativo a otro control.

Al menos uno de los controles en el diseo tiene que ser posicionado en relacin al
contenedor principal para indicar la posicin del resto de la Disposicin. Sin embargo,
cualquier nmero de controles puede ser posicionado en relacin con el contenedor principal.
Los parmetros RelativeLayout son presentados y organizados por la ventana Propiedades de
forma ligeramente diferente a la forma en que son representados como constantes en el XML
o en cdigo. Esta descripcin se aplica a la forma en Android Estudio les presenta. Consulte la
documentacin para el XML o constantes programticas.
La alineacin del borde
El principio es que se puede especificar la alineacin de cualquier par de bordes, uno en el
padre y uno de cada nio.Esto mover el control secundario para que sus lneas de borde con
el borde de los padres, por ejemplo, el borde superior al borde superior. Si especifica dos
pares de bordes entonces usted puede cambiar el tamao del control, as como la colocacin
de la misma. Por ejemplo, la parte superior a arriba y abajo a abajo hace que el control de nio
de la misma altura que la de los padres.
Disposicin Padres
Las propiedades de diseo de los padres son: alignParent arriba, izquierda, abajo, derecha
Estos alinear el borde correspondiente del control con la de la RelativeLayout padres.
Por ejemplo: el establecimiento de alignParent a izquierda mueve el lado izquierdo del control
para el lado izquierdo de la matriz.

Esto funciona sin ningn tipo de cambio de tamao del control.

Si selecciona dos alineaciones opuestas, superior e inferior o izquierda y derecha, a


continuacin, tanto los bordes se mueven y el control cambia de tamao.
Para ajustar alignParent a izquierda y derecha produce ejemplo:

As como la alineacin de los bordes tambin se puede alinear con el centro de la matriz. La
propiedad centerInParent puede ajustarse a cualquiera de los dos, horizontal, vertical y
simplemente centros de control tal como se especifica.
Disposicin de los componentes
La propiedad alignComponent puede ajustarse a cualquiera de las ocho posibles pares de
arriba, abajo, izquierda y derecha.
El primero indica el borde del control secundario que se alinea con el borde del control
primario especificado por el segundo.Por ejemplo superior: parte inferior fija borde superior del
nio para que coincida con el borde inferior del control de los padres. Para cada posible par de
alineaciones se tiene que especificar el id del control de los padres. Android Studio ayuda a
hacer esto mediante la presentacin de una lista desplegable de controles posibles que se
podran utilizar para el posicionamiento hacia abajo.
Al igual que en el caso de la alineacin con el diseo de los padres puede especificar la
alineacin de dos bordes por ejemplo izquierda y derecha y esto cambia el tamao del control
de nio a ser el mismo que el control de los padres.
Tambin hay una opcin de alineacin de lnea de base que se alinea la lnea de base de
texto en el control de los padres y el nio.
Tenga en cuenta que los mapas de Android Estudio de las propiedades que se configuran
utilizando el Diseador de un conjunto ms complicado de propiedades XML que usted
necesita saber acerca de si va a cambiar el diseo en clave o editar manualmente el cdigo
XML. Por ejemplo, si usted coloca Button2 manera que su borde inferior est alineada con el
borde superior de Button1 esta muestra en la ventana de la propiedad como parte inferior: la
parte superior, pero en el XML usted encontrar
android:layout_above="@+id/button"

En la mayora de los casos es ms fcil dejar Diseador generar las propiedades subyacentes
o utilizar la ventana Propiedades para establecer ellos, pero es importante saber que hay un
nivel ms bajo conjunto de propiedades. Para buscarlas en los RelativeLayout.LayoutParams
encontrar documentacin.
Compensaciones de margen
Hasta el momento lo nico que podemos hacer es alinear pares de bordes.
Cmo se especifica posiciones exactas relativas a otro control o el padre?
La respuesta es utilizar el patrn comn de establecer los mrgenes del control. Si alinea los
bordes superiores, pero establece un margen superior de 10DP en el nio y luego la parte
superior del control secundario ser 10DP ms bajo que el control de los padres.

As que la alineacin del borde se utiliza para especificar la direccin relativa de un control a
otro y de los mrgenes establecidos dan exactamente lo offset.
RelativeLayout Y El Diseador
Con todo esto entendido ahora se puede ver cmo el diseador le permite generar un
RelativeLayout. Al mover un control en torno a la superficie de diseo del otro mando o la
disposicin de los padres ms cercano est seleccionado como el padre de utilizar para el
posicionamiento, los bordes ms cercanos se utilizan para la alineacin y que el margen se
establece en la distancia entre el padre y el nio.
Esto funciona bien, pero a veces puede ser difcil conseguir el Diseador de escoger el control
o el diseo como se mueve un control alrededor. Siempre se puede utilizar la ventana
Propiedades para establecer manualmente este si resulta demasiado difcil establecer de
forma interactiva.

Observe tambin que si arrastra y el borde de un control cerca de la alineacin con el borde
de otro control, entonces el resultado ser justo que el borde est alineado y el control cambia
de tamao. Por ejemplo, si arrastra el lado derecho de un control con el tamao correcto de la
presentacin y en el ancho de los cambios de control. Este comportamiento puede confundir a
los principiantes con el diseador, ya que parece ser posible cambiar el tamao de los
controles arrastrando un borde, pero la mayora del tiempo el control vuelve a su tamao
original cuando se suelta. Por supuesto que slo cambia de tamao cuando el borde que est
arrastrando las lneas con un borde correspondiente en otro control.
si se entiende la forma en que la RelativeLayout funciona entonces mediante el Diseador es
mucho ms fcil y de hecho usando RelativeLayout para crear una interfaz de usuario
compleja es ms fcil

Qu son los de inicio y fin?


Si nos fijamos en la ventana Propiedades, ver algunos parmetros Disposicin adicional con
inicio y final como parte de su nombre. Si nos fijamos un poco ms de cerca estos se refieren
a empezar y terminar bordes.
En API 17 se agreg una nueva funcin para permitir el diseo para tener en cuenta el sentido
de la disposicin. En el uso normal con Layout_Direction establecer a izquierda a derecha,
entonces el borde de inicio es el mismo que el borde izquierdo y el borde final es el mismo que
el borde derecho. Si Layout_Direction es de derecha a izquierda y luego empezar que es
correcto y al final se deja. Por ejemplo, puede establecer startpadding para controlar el relleno
a la izquierda oa la derecha dependiendo de la direccin de diseo establecido.
Tenga en cuenta que esto slo funciona para la API de 17 en adelante y Diseador no parece
mostrar que, a pesar de que establece las propiedades de inicio y fin a los mismos valores que
las propiedades de izquierda y derecha equivalentes.

Resumen

Se pueden utilizar diferentes contenedores de diseo para crear interfaces de


usuario. Cada diseo tiene sus propias instalaciones de cmo se colocan y
dimensionados controles secundarios.

Los ms importantes son LinearLayout, RelativeLayout y FrameLayout.

Cada diseo tiene su propio conjunto de propiedades de diseo para controlar el


posicionamiento y el tamao de un control. Controles secundarios tienen una instancia
de la clase propiedades de diseo de decir la Disposicin cmo posicionar y tamao
ellos.

Propiedades de diseo se prefijan siempre con layout_ en el XML y escritos como el


diseo: en la ventana Propiedades.

Todos los diseos de apoyar el diseo: la anchura y el diseo: la altura.

Puede especificar la posicin usando un nmero de diferentes unidades, pero en la


mayora de los casos de uso de densidad dp pxeles independientes ya que esto
funciona de la misma manera en las pantallas del mismo tamao, pero diferentes
resoluciones.

En lo que se refiere al diseo de un control es slo un wdith rectngulo de altura


colocado usando la parte superior ya la izquierda.

Todos los controles tienen propiedades de relleno que especifican espacio adicional en
torno al contenido del control.

Algunos diseos proporcionan diseo: propiedades de los mrgenes que marcan el


espacio extra alrededor de la parte exterior del control.

Gravedad simplemente establece la sencilla colocacin de un objeto - por ejemplo,


arriba, abajo, derecha, izquierda. Cada control tiene una propiedad de la gravedad,
que establece la posicin de su contenido - por ejemplo, el texto de un botn. Algunos
Disposicin a tener un posicionamiento: la propiedad gravedad que establece cmo se
posicionar un control.

El FrameLayout es el ms simple de todos los Layouts y slo tiene el diseo: la


gravedad para el posicionamiento. En la mayora de casos se mantiene un nico
control y se utiliza con mayor frecuencia como un marcador de posicin.

El LinearLayout puede utilizarse para organizar los controles como una fila o una
columna.

Diseos complejos pueden ser creados por los nidos de LinearLayouts dentro entre s
para producir una columna o una fila o filas o columnas. Esto ha resultado en la
LinearLayout siendo los ms utilizados.

As como la gravedad, la LinearLayout tambin es compatible con la especificacin del


peso de un control.Despus de que el tamao medido de cada control est
determinado por el diseo, el espacio no utilizado restante se asigna a los controles en
las mismas proporciones que sus pesos asignados.

El RelativeLayout es el ms complejo de los diseos y se puede utilizar para crear casi


cualquier interfaz de usuario.

El principio general es tratar de seleccionar un diseo que resulta en la anidacin ms


pequea de los envases de diseo. En general, es mejor utilizar una sola
RelativeLayout lugar de LinearLayouts profundamente anidadas.

El RelativeLayout puede parecer complicado o difcil de usar en el Diseador por la


forma en propiedades se establecen y desarmar al mover los controles alrededor. Si
usted entiende los principios, entonces es mucho ms fcil de usar. Al mover un
control del borde ms cercano en otro control o la RelativeLayout contienen se
establecen para ser alineados y una propiedad margen se establece en la distancia
entre ellos.

Usted puede cambiar el tamao de los controles utilizando el Diseador pero slo
arrastrando en un borde y alinendola con la misma ventaja sobre otro control. Es
decir, usted puede hacer los controles del mismo tamao pero no se puede establecer
un control a un tamao arbitrario.

El Diseador simplifica las propiedades de diseo que se muestran en la ventana de


propiedades y los asigna a un conjunto ms amplio de propiedades en el archivo XML
generado.

Inicio y propiedades finales se han introducido para manejar una especificacin de


direccin de diseo.Para un diseo de izquierda a derecha start = izquierda y al final =
derecha. Para un diseo de derecha a izquierda start = derecha y al final = izquierda.

6.

Aventuras Android - Ciclo de Vida y Estado

Una de las cosas que usted tiene que acostumbrarse a la hora de programar para una
plataforma mvil es que su aplicacin se puede apagar y reiniciar sin mucho aviso.Tienes que
aprender a lidiar con esta existencia de arranque y parada y de que, por una aplicacin para
Android, es una vida dura tratando de mantenerse con vida.

Aventuras Android con Android Estudio


Contenido
1. Primeros pasos con Android Estudio
2. La actividad y el interfaz de usuario
3. La construccin de la interfaz de usuario y una calculadora App
4. Controles bsicos y Eventos
5. Contenedores de diseo
6. Ciclo de Vida y Estado
7. Spinners
8. Pickers
9. IU Grficos A Deep Dive

10. ListView y adaptadores


Fragmentos
11. Presentacin de Fragmentos
12. Fragmentos y XML
13. Fragmento Y Actividad Trabajando Juntos
14. Gestin de Fragmentos
15. Dilogos personalizados utilizando DialogFragment
16. Clases de dilogo en el DialogFragment
17. Un Proyecto NumberPicker DialogFragment
18. ViewPager
Tambin si usted est interesado en la creacin de plantilla personalizada ver:
Proyectos a Medida En Android Estudio

Vida y Estado
La mayora de los programadores estn acostumbrados a la idea de que su aplicacin se
iniciar por el usuario, utiliza y luego termina. Si la aplicacin se reinicia entonces es por lo
general hasta al usuario cargar cualquier contexto que necesitan - documentos, etc. A veces
una aplicacin tiene para retener automticamente la informacin del estado de una ejecucin
a. Por ejemplo, un juego puede no perder de vista que un usuario haba llegado a - que el
nivel y la puntuacin - pero esto es casi tan complicado como las cosas se ponen.

Para una aplicacin que se ejecuta en un dispositivo mvil las cosas son muy diferentes. La
propia naturaleza del dispositivo significa que cualquier aplicacin puede ser interrumpido en
cualquier momento por una llamada telefnica entrante o al usuario hacer una llamada
telefnica. Hasta cierto punto, esta necesidad de aplicacin "interrumpible" ha sido tomado por
los sistemas operativos de telfonos mviles como un principio ms general. Android, por
ejemplo, para evitar que su aplicacin que se ejecuta slo porque necesita la memoria o
quiere salvar la vida de la batera. Incluso se termina y se reinicia la aplicacin si se requiere
una reconfiguracin medios.
Por ejemplo, como descubrimos en el captulo anterior, si el usuario cambia la orientacin del
dispositivo, entonces su aplicacin est terminada y se reiniciar. Esto no es un reinicio desde
cero porque el sistema guarda y restaura alguna informacin de estado automticamente, pero
exactamente cmo funciona todo esto es algo que tenemos que averiguar.
La conclusin es que cuando se programa bajo Android - y la mayora de otros sistemas
operativos mviles - usted tiene que preocuparse por el ciclo de vida de su aplicacin y hay
que tomar medidas para garantizar que se preserva su estado por lo que puede parecer al
usuario que nada ha sucedido - a pesar de que la aplicacin efectiva ha sido golpeado en la
cabeza y eliminados antes de ser arrastrado de nuevo a continuar desde donde estaba.

El ciclo de vida de un App


Los diferentes estados que una aplicacin para Android puede ser en y las transiciones entre
ellos puede parecer complicado al principio - eso es porque lo son. Si usted todava est
pensando en trminos de una aplicacin de escritorio que se inicia, se ejecuta y est
terminado por el usuario este nivel de complejidad puede parecer innecesario - y quiz lo
sea. Sin embargo estas son las reglas que tenemos que jugar por.
La clase de actividad tiene un conjunto de controladores de eventos reemplazables para cada
uno de los estados. stos trabajan en parejas - horquillado los tres tipos de estado de
aplicacin.
En el nivel ms exterior hay
onCreate y OnDestroy - Soporte de toda la vida de la aplicacin. Este par se llama cuando la
aplicacin se carga en memoria o descarga de la memoria. Estos dos soporte de toda la vida
til de una actividad. Cuando se carga primero la onCreate se activa y cuando la aplicacin
est dispuesto de OnDestroy se activa. Usted tiene claramente a utilizar estos dos para la
instalacin y destruir y los recursos que son necesarios para toda la vida til de la aplicacin aunque en la prctica las cosas puede ser ms sutil. El sistema puede detener la aplicacin
sin llamar a la OnDestroy y puede reiniciar la aplicacin de activar un evento onCreate.

onStart y OnStop - soporte de cualquier perodo que la aplicacin es visible. Podra ser que
la aplicacin est detrs de decir un cuadro de dilogo modal. La aplicacin es visible, pero no
la interaccin con el usuario. Este par de eventos puede ser disparado varias veces durante
todo el tiempo de vida de la aplicacin. Aplicaciones simples se ignoran en su mayora los
eventos OnStart y OnStop porque la aplicacin est todava en la memoria y no pierde ningn
recurso o estado. El uso principal de onStart y OnStop es dar a la aplicacin una oportunidad
para monitorear cualquier cambio que pudiera afectar a la misma, mientras que no interacta
con el usuario. Para confundir el asunto an ms tambin hay en el evento onRestart que se
produce antes del evento onStart pero slo si sta no es la primera vez que la aplicacin ha
disparado el onStart - es decir se trata de un verdadero reinicio.
onResume y onPause - Soporte del perodo que la aplicacin est en primer plano y la
interaccin con el usuario.De nuevo este par de eventos puede ocurrir varias veces durante
toda la vida til. El evento onResume se produce cuando la aplicacin est en el primer plano
y hacer su trabajo habitual. El evento se produce onPause whent que el usuario cambia de
distancia a otra aplicacin, por ejemplo.

El enfoque sencillo
En este punto, usted tiene todo el derecho a confundirse.
Tantos cambios de estado y qu hacer en cada uno?
Las cosas principales que preocuparse es el reinicio completo de su aplicacin que
desencadena una OnDestroy y un onCreate. Este es el nico que destruye el estado actual de
la aplicacin - los otros son simplemente oportunidades para su aplicacin para reducir la
carga en el sistema o para guardar algunos datos de usuario por si acaso. A medida que el
OnDestroy suele ser slo una oportunidad para limpiar los recursos para evitar fugas, esto
significa que la mayora de aplicaciones simples en realidad slo tienen que entregar el evento
onCreate.
Sin embargo, es tentador pensar que este arranque y la parada es justo como una aplicacin
de escritorio que se termina y luego el usuario decide utilizar de nuevo cuando est bien FOF
la aplicacin se ejecute fuera como si se estuviese ejecutando por primera vez. En el caso de
una aplicacin para Android que esto no es lo que el usuario espera en absoluto. Su
aplicacin puede ser resuelto por el sistema sin que el usuario lo sepa nada al
respecto. Cuando el usuario intenta acceder a su aplicacin de nuevo que por lo general
esperan que continuar desde donde lo dejaron.
Puede ser un reinicio completo en lo que a ti respecta, pero el usuario acaba de cambiar a otra
aplicacin durante unos minutos y espera encontrar la suya como lo dejaron.

Ntese tambin que a menudo estos eventos se producen en secuencias. Por ejemplo, una
aplicacin que acaba de recibir el evento onPause es probable que vaya a recibir el evento
OnDestroy porque el sistema lo eliminar para liberar memoria decir. Es un error tratar de
pensar demasiado en las secuencias de acontecimientos y pedir que uno debe hacer
cualquier inicializacin en particular o limpiar.
Basta con pensar en el estado en que su aplicacin se est moviendo en y colocar el cdigo
necesario en ese controlador de eventos.

Explorador del ciclo de vida


No hay mejor manera de sentirse cmodo con el ciclo de vida y sus acontecimientos de
escribir un programa de demostracin corta que muestra cuando se producen.
Iniciar una nueva aplicacin de la actividad en blanco Android, aceptando todos los valores
predeterminados, y lo llaman ciclo de vida y luego aceptar todos los valores predeterminados
para empezar a trabajar rpidamente.
En el editor de diseo quitar la cadena "Hola Mundo" y colocar una TextView en la superficie
de diseo. Siguiente cambiar su tamao de forma que ocupe la mayor parte de la zona - que
puede ser difcil de conseguir que se ajusta al tamao y eliminar su entrada de texto
predeterminado.

El cdigo es bastante fcil el nico truco es recordar a llamar a cada uno de los controlador de
eventos sistema previsto es que ha anulado. Si usted no hace esto la aplicacin simplemente
termina cuando lo ejecuta.
El controlador de eventos OnCreate todava tiene que construir la interfaz de usuario, pero
ahora tenemos una referencia al objeto Java que representa el TextView:
private TextView textView; @Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)
findViewById(R.id.textView);
textView.append("Create\n");
} @Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)
findViewById(R.id.textView);
textView.append("Create\n");
}

El resto del programa simplemente anula cada uno de los controladores de eventos, a su vez,
llama al controlador de eventos originales y luego agrega un mensaje de texto al TextView:
@Override
protected void onStart() {
super.onStart();
textView.append("Start\n");
}
@Override
protected void onPause() {
super.onPause();
textView.append("Pause\n");
}
@Override
protected void onResume() {
super.onResume();
textView.append("Resume\n");
}

@Override
protected void onStop() {
super.onStop();
textView.append("Stop\n");
}
@Override
protected void onRestart() {
super.onRestart();
textView.append("Restart\n");
}
@Override
protected void onDestroy() {
super.onDestroy();
textView.append("Destroy\n");
}

Una especie muy simple y aburrida de programa - si usted no desea escribir en o copiar y
pegar entonces usted lo puede encontrar en el CodeBin .

Probndolo
Si ahora ejecutamos este programa se puede utilizar para saber cundo los eventos del ciclo
de vida suceden.
Puede que se sorprenda al saber que la primera vez que ejecuta el programa se obtiene

Si se piensa en ello por un momento esto no es razonable que se carga la aplicacin, se hace
visible y asumiendo el primer plano.

Si intenta otras cosas como presionar la tecla Inicio y seleccionar otra aplicacin entonces
vers otras secuencias de eventos - pero por supuesto slo cuando se reanudar la aplicacin
del ciclo de vida.
Por ejemplo, pulsando la tecla de inicio, a continuacin, muestra el administrador de tareas
pulsando largo la tecla de inicio y volver a seleccionar los resultados de aplicaciones en:
Pause, Stop ya que la aplicacin se retira del primer plano y luego en Reiniciar, Inicio,
curriculum vitae como se carga la aplicacin, se convierte en visible y luego vuelve a sonar el
primer plano e interacta con el usuario.
Usted puede intentar otras acciones fuera, pero hay una cosa que debes probar - cambiar la
orientacin. Si est utilizando el emulador a continuacin, pulse Ctrl-F11. Cuando la
orientacin de la pantalla cambia ver que la TextView se ha despejado y Crear, se han
aadido en Inicio, Reanudar.
Esto se debe a que cuando se cambia la orientacin de la aplicacin est totalmente detenida
y luego completamente reiniciado, es decir, es como si la aplicacin se est ejecutando desde
cero por primera vez.
Esta declaracin es casi cierto - pero no del todo.

Estado de retencin - El Bundle


Cuando cambie la orientacin de su aplicacin se detiene y reinicia. Cuando esto sucede, la
TextView se restablece a su estado predeterminado cuando se carga la aplicacin. Sin
embargo, esta no es la historia completa. El sistema hace retener el estado de los elementos
de interfaz de usuario que pueden ser modificados por el usuario y los restaura
automticamente cuando se inicia la aplicacin.
Esto es lo que el parmetro savedInstanceState en el controlador de eventos onCreate se
trata:
protected void onCreate(
Bundle savedInstanceState) {

Un paquete es un conjunto de pares de valores clave y cuando la aplicacin se detiene por el


sistema que utiliza para guardar los valores almacenados en los elementos de interfaz de
usuario que pueden ser modificados por el usuario.Almacena id pares / valor y cuando se
reinicia la aplicacin del paquete se utiliza para inicializar los valores de los elementos de la
interfaz correspondientes.

Observe que si el usuario deja su aplicacin mediante la eliminacin de lo que dice en la lista
de aplicaciones recientes entonces el savedInstanceState se destruye y la aplicacin
realmente empezar de nuevo.
En otras palabras savedInstanceState slo restaura la interfaz de usuario cuando la aplicacin
se ha detenido por el sistema.
Tambin vale la pena notar que la restauracin trabajar para un diseo alternativo cargado
debido a un cambio de configuracin. Por ejemplo, se restaurar el estado a una versin del
paisaje de un diseo, as como la versin original retrato.
En este punto, probablemente te preguntes por qu el objeto TextView no fue restaurada por el
sistema cuando se hizo girar entonces dispositivo?
La respuesta simple es que un objeto TextView no est diseado para la interaccin del
usuario - que se supone que slo se utilizar para mostrar las etiquetas de texto esttico y por
lo que el sistema no guardar una restaurarlo.
Usted puede ver guardar la automtica y restauracin en la accin si se agrega un campo de
entrada EditarTexto en la superficie de diseo del explorador del ciclo de vida. Ahora si
introduce algn texto en el campo EditarTexto que se mantendr si se gira el dispositivo. Sin
embargo, si mantiene pulsada la tecla de inicio, eliminar la aplicacin y vuelva a iniciarlo de
nuevo, ver que el campo EditarTexto est en blanco de nuevo.

El texto en el campo EditarTexto en la parte inferior de la pantalla se conserva durante una


rotacin de la pantalla.

Guardando Datos adicionales UI


Hay un montn de maneras de salvar el estado de una aplicacin a medida que se inicia y se
detiene por el sistema.Una de las ms simples es ue el objeto Bundle que utiliza el sistema.
El sistema se activa el evento onSaveInstanceState cuando est a punto de agregar datos al
paquete y gurdelo. Si desea guardar algunos datos adicionales todo lo que tienes que hacer
es reemplazar el controlador de eventos por defecto.
Por ejemplo, supongamos que desea guardar y restaurar los datos en el TextView en el
explorador del ciclo de vida.Primero tienes que guardar los datos:
@Override
protected void onSaveInstanceState(

Bundle savedInstanceState){
savedInstanceState.putCharSequence(
"myText",textView.getText());
super.onSaveInstanceState(savedInstanceState);
}

Tenga en cuenta que guardamos el contenido de texto del objeto TextView como el valor y
utilice la tecla "myText". En la mayora de los casos, sera mejor crear una cadena constante
para la clave.
Ahora para recuperar los datos y colquelo en el TextView tenemos que cambiar el controlador
de eventos onCreate:
@Override
protected void onCreate(
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)
findViewById(R.id.textView);
if (savedInstanceState != null) {
textView.setText(
savedInstanceState.getCharSequence("myText"));textView.setText(
savedInstanceState.getCharSequence("myText")); }
textView.append("Create\n");
}}
textView.append("Create\n");
}

Esto comienza en la forma habitual pero ahora comprueba si savedInstanceState tiene ningn
dato. Si es as recuperamos el texto almacenado usando la tecla "myText".
Tambin puede reemplazar la funcin onRestoreInstanceState de la misma forma si desea
mantener el controlador de eventos onCreate buscando simple.
Hay establecer y obtener mtodos para una amplia gama de tipos de datos estndar y con
frecuencia todo lo que necesita hacer para asegurarse de que su aplicacin mantiene su
estado entre reinicios del sistema es utilizar el objeto savedInstanceState Bundle. Tenga en
cuenta que usted puede ahorrar datos arbitrarios y no slo los datos para el diseo.
Como un ejercicio que ahora puede volver a ICalc introducido en el captulo anterior y hacer su
exhibicin y valor actual persisten a travs de una rotacin de pantalla.

Gestin del Estado Avanzada

Para completarlo, vale la pena sealar que hay muchos ms enfoques para mantener el
estado. Ms tarde, usted tendr que descubrir la forma de almacenar gran cantidad de datos
de los usuarios a nivel local para la persistencia a largo plazo y esto es a menudo suficiente
para implementar la administracin del estado a travs de un cambio de configuracin.
Tambin puede optar por quedarse con un objeto de su eleccin mediante el
onRetainNonConfigurationInstance ().Todo lo que tienes que hacer es anular esta funcin para
que devuelva el objeto que desea conservar. El sistema almacenar entonces este objeto para
usted y lo devolver a usted cuando usted lo solicita mediante
getLastNonConfigurationInstance () que devuelve el objeto que se guard por ltima por el
sistema.
El objeto puede ser tan complejo como quiera, pero no tratar de salvar a un objeto del sistema
como una actividad o una vista. Esto slo se traduce en prdidas de memoria.
El ltimo en asegurarse de que las cosas sucedan como quiera que para manejar la
configuracin cambia a ti mismo.
Usted puede hacer esto haciendo un cambio en el manifiesto.Si usted hace esto, entonces le
corresponde a usted para hacer los cambios necesarios cuando el onConfigurationChanged
incluso se produce. Por ejemplo, podra optar a animar botones y otros objetos de interfaz de
usuario en nuevas posiciones o simplemente ignorar la necesidad de volver a configurar por
completo.

7.

Aventuras Android - Spinners y recolectores

Pgina 1 de 3
Trabajar con Android Studio hace que la construccin de la interfaz de usuario fcil con un
editor interactivo, pero usted todava tiene que encontrar la manera de manejar las cosas no
es tan bueno. En los prximos dos captulos de nuestro libro electrnico en Android el camino
ms fcil, nos fijamos en los hilanderos y recolectores, el siguiente paso despus de los
botones y controles de texto.

Aventuras Android con Android Estudio


Contenido
1. Primeros pasos con Android Estudio
2. La actividad y el interfaz de usuario
3. La construccin de la interfaz de usuario y una calculadora App
4. Controles bsicos y Eventos
5. Contenedores de diseo
6. Ciclo de Vida y Estado
7. Spinners

8. Pickers
9. IU Grficos A Deep Dive
10. ListView y adaptadores
Fragmentos
11. Presentacin de Fragmentos
12. Fragmentos y XML
13. Fragmento Y Actividad Trabajando Juntos
14. Gestin de Fragmentos
15. Dilogos personalizados utilizando DialogFragment
16. Clases de dilogo en el DialogFragment
17. Un Proyecto NumberPicker DialogFragment
18. ViewPager
Tambin si usted est interesado en la creacin de plantilla personalizada ver:
Proyectos a Medida En Android Estudio

Spinners son lo que se conoce como listas desplegables o algo similar en otros interfaces de
usuario. Permiten al usuario elegir entre una lista de posibles temas.

Recogedores son similares a spinners en que permiten al usuario elegir un elemento, pero en
este caso los elementos se definen ms estrechamente - una fecha, una hora o un
nmero. De los recolectores de la fecha y hora recolectores son bastante conocidos, pero para
un conjunto impar de razones el nmero selector de largo se ha descuidado.
Vamos a empezar con la Spinner.

El Spinner Y El ArrayAdapter
El spinner presenta un conjunto de alternativas para el usuario y les permite seleccionar
uno. Poner un Spinner en que el proyecto es tan fcil como usar la caja de herramientas en el
diseador pero no se puede salir sin algn Java para hacer que todo funcione. En particular,
es necesario definir la lista de elementos que el Spinner mostrar cuando el usuario lo
activa. La primera vez que coloca un Spinner en la superficie de diseo que muestra texto
ficticio. Nuestra primera tarea es reemplazar el texto de relleno con una lista real de
alternativas.

La clase ms simple de cosas para mostrar al usuario una lista de elementos de texto y que
bien podra pensar que la manera ms directa de hacer esto es utilizar una matriz de cadenas
- y es lo contrario. En el caso de UI widgets que muestran listas de cosas para Android tiene
un mecanismo mucho ms general para hacer frente a los diferentes tipos de cosas que usted
puede mostrar. Widgets que muestran listas de cosas en general, trabajar con un ejemplo de
un "adaptador". Un adaptador bsicamente toma una lista de los objetos y las convierte en
algo que se puede mostrar en el widget. En general se puede crear adaptadores
personalizados que hacer cosas inteligentes con listas de objetos de su propia para que
muestren adecuadamente. En la mayora de casos, sin embargo puede llegar a funcionar con
slo usar los adaptadores integradas proporcionadas.
En el caso de la spinner la eleccin ms habitual de adaptador es el ArrayAdapter. Esto tiene
una gran variedad de objetos de ningn tipo y los hace adecuados para la exhibicin llamando
a su mtodo toString (). Mientras el mtodo toString () produce lo que quieres ver en el
Spinner entonces todo debera funcionar. En el caso de una matriz de cadenas de llamar al
mtodo toString () en cada elemento de la matriz que podra parecer una exageracin, pero es
el precio que debemos pagar para construir mecanismos que pueden hacer frente a las
situaciones ms complicadas.

As que el plan de accin es crear una matriz de cadenas con los artculos que queremos
mostrar, usar esto para inicializar un objeto ArrayAdapter y luego coloque la ArrayAdapter al
Spinner.
La creacin de la matriz es fcil:
String[] country = {"Canada", "Mexico", "USA"};

El constructor ArrayAdapter puede parecer que ser complicado. Parece an ms complicado


porque ArrayAdapter utiliza los genricos para que pueda especificar el tipo de cada elemento
de la matriz. Si usted no ha utilizado los genricos antes, todo lo que necesita saber es que en
lugar de crear un adaptador serie especial para cada tipo de matriz, un IntArrayAdapter, un
StringArrayAdapter y as sucesivamente, usted simplemente tiene que especificar el tipo como
<int> o <String> cuando se utiliza el tipo ArrayAdapter.
Por ejemplo, para crear un ArrayAdapter para una matriz de cadenas que utilizara:
ArrayAdapter<String> stringArrayAdapter=
new ArrayAdapter<String>(
constructor parameters );

El patrn es el mismo para todos los constructores y para diferentes tipos de matriz.
Hay un buen nmero de constructores ArrayAdapter, pero todos necesitan un poco de
informacin bsica. Necesita saber el contexto actual, por lo general esto, el diseo que se
utilizar para mostrar la lista y el conjunto de elementos de datos.
La nica dificultad es el diseo que se utilizar para mostrar la lista. Esto suena como un
montn de potencial de trabajo duro hasta que descubre que el sistema ofrece algunas
disposiciones estndares bsicos que usted puede utilizar. En nuestro caso el diseo es:
android.R.layout.simple_spinner_dropdown_item

Observe que este es un nmero entero que determina el recurso diseo de usar.
Poniendo todo esto junto da:
ArrayAdapter<String> stringArrayAdapter=
new ArrayAdapter<String>(
this,
android.R.layout.simple_spinner_dropdown_item,
country);

Y si usted se est preguntando qu pas es, se le ha olvidado que definimos un llamado pas
Array cadena anterior.

El paso final es para especificar el ArrayAdapter para utilizar en la Spinner. Primero tenemos
que recuperar el Spinner y entonces podemos usar su methiod setAdapter:
Spinner spinner=
(Spinner)findViewById(R.id.spinner);
spinner.setAdapter(stringArrayAdapter);

Si se agrega todo el cdigo al controlador de eventos onCreate el resultado es:


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] country={"Canada", "Mexico", "USA"};
ArrayAdapter<String> stringArrayAdapter=
new ArrayAdapter<String>(
this,
android.R.layout.simple_spinner_dropdown_item,
country);
Spinner spinner =
(Spinner) findViewById(R.id.spinner);
spinner.setAdapter(stringArrayAdapter);
}

Si ejecuta el programa ver:

Manejo de la seleccin
La siguiente pregunta es cmo se descubre que el usuario ha realizado una seleccin?

La respuesta simple es que tenemos de la conexin de los eventos del hilandero. Como
siempre hay tres posibles maneras de hacer esto

crear una subclase de AdapterView.OnItemSelectedListener y luego una instancia

implementar la interfaz AdapterView.OnItemSelectedListener como parte de la


actividad

utilizar una clase annima

De los tres la clase annima parece la ms fcil porque Android Estudio generar los mtodos
de interfaz para usted.Si usted comienza a escribir la siguiente lnea y utilizar el
autocompletado:
AdapterView.OnItemSelectedListener onSpinner=
new AdapterView.OnItemSelectedListener(){

entonces Android Estudio generar:


AdapterView.OnItemSelectedListener onSpinner =
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(
AdapterView<?> parent,
View view,
int position,
long id) {
}
@Override
public void onNothingSelected(
AdapterView<?> parent) {
}
}

Tambin agrega una importacin para AdapterView. Usted todava tiene que aadir un punto y
coma al final, sin embargo.
Si usted no utiliza la funcin de autocompletar entonces usted podra tener que escribir todo
en - incluyendo la importacin.
Se puede ver a la vez que hay que aplicar dos controladores de eventos:

onItemSelected - activa cuando el usuario selecciona un elemento

onNothingSelected - desencadenado cuando el Spinner no tiene partidas o el usuario


anula la seleccin de todos los artculos

Tambin podra preguntarse cul es el <?> Se encuentran en el cdigo generado?


Ambos eventos son genricos y trabajan con una gama de diferentes tipos. El <?> Es un
comodn tipo que esencialmente permite a cualquier tipo que se utilizar. Por ejemplo List <?>
Es una lista de cualquier tipo. Por supuesto, el tipo real no se conoce hasta el tiempo de
ejecucin y por lo que cada elemento de la lista es tratado como un tipo de objeto y su hasta
usted para echarlo a algo ms especfico.

onItemSelected
Veamos el controlador de eventos onItemSelected con ms detalle:
public void onItemSelected(
AdapterView<?> parent,
View view,
int position,
long id) {
}

Qu es este AdapterView que ha aparecido de repente?


Todos los componentes visibles de la interfaz de usuario corresponden a ver los objetos de un
tipo u otro. Un AdapterView es el objeto View que corresponde a uno de los elementos que se
muestran en la Spinner que el ArrayAdapter est representada en. Puede utilizar el
AdapterView pasado al controlador de eventos decir modificar el aspecto del elemento que se
muestra.
El parmetro de vista es simplemente el hijo de la AdapterView que fue hecho clic - un artculo
puede estar compuesto por ms de un Ver artculo.
Por ltimo, el parmetro de posicin int y la larga Identificacin proporcionan la posicin de la
vista que se hizo clic en el adaptador y la fila Identificacin del elemento seleccionado. Usted
puede llenar un Spinner desde una base de datos - en este caso la fila Identificacin da el
nmero de fila de base de datos - que no es necesariamente la misma que su posicin en el
Spinner. Para un simple ArrayAdapter la posicin y el ID son las mismas.
En la mayora de los casos, el nico parmetro que ser interesa es la posicin int que le da la
opcin al usuario seleccionado.
Por ejemplo, colocar un TextField en la superficie de diseo y cambiar el controlador de
eventos onItemSelected para que diga:

@Override
public void onItemSelected(
AdapterView<?> parent,
View view,
int position,
long id) {
TextView myTextView =
(TextView) findViewById(R.id.textView);
myTextView.setText(Integer.toString(position));
}

Todo lo que est sucediendo es que el parmetro de posicin se muestra en la Vista de Texto.
Finalmente conectar el objeto de eventhandling al Spinner tenemos que aadir que el uso de
su setOnItemSelectListener
spinner.setOnItemSelectedListener(onSpinner);

Poniendo todo esto junto da la nueva onCreate:


@Override
protected void onCreate(
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AdapterView.OnItemSelectedListener onSpinner =
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(
AdapterView<?> parent,
View view,
int position,
long id) {
TextView myTextView =
(TextView)findViewById(R.id.textView);
myTextView.setText(Integer.toString(position));
}
@Override
public void onNothingSelected(
AdapterView<?> parent) {
}
};
setContentView(R.layout.activity_main);
String[] country = {"Canada", "Mexico", "USA"};

ArrayAdapter<String> stringArrayAdapter=
new ArrayAdapter<String>(
this,
android.R.layout.simple_spinner_dropdown_item,country);
Spinner spinner =
(Spinner) findViewById(R.id.spinner);
spinner.setAdapter(stringArrayAdapter);
spinner.setOnItemSelectedListener(onSpinner);
}

Si ahora ejecuta el programa, ver algo como:

La posicin representada corresponde al elemento de la matriz que ha sido seleccionado - a


contar desde cero por supuesto.
La mayora de las veces es suficiente slo para tener el nmero de ndice del elemento
seleccionado pero el objeto AdapterView tiene algunos mtodos que permiten conseguir el
artculo seleccionado.
Si desea revisar el elemento seleccionado se puede utilizar la posicin de ndice de la
ArrayAdapter original o incluso la matriz original Cadena - pero estos no estn generalmente
disponibles para el controlador de eventos. As retrive el elemento que utilizara el mtodo
getItemAtPosition.
Por ejemplo, para mostrar el nombre del pas deber modificar la llamada setText a:
myTextView.setText(
(String) parent.getItemAtPosition(position));

Tenga en cuenta que el elemento seleccionado se devuelve como un tipo de objeto y hay que
echarlo antes de poder hacer nada con ella.
Hay una serie de otros mtodos que se pueden utilizar para recuperar informacin o manipular
el elemento seleccionado, pero para aplicaciones ms simples la getItemAtPosition es todo lo
que necesitas saber.

ArrayAdapter De Recursos
Ajuste de los contenidos de la Spinner utilizando una matriz de cadenas en cdigo es una
buena manera de ver cmo funciona el Spinner pero no es la forma en que suele ocurrir.
Android ofrece un sistema integral de recursos - Cuerdas, imgenes y un montn de archivos
XML. La idea es que se puede producir versiones personalizadas de aplicacin que con slo
cambiar el recurso de archivos, es decir, sin tener que modificar el cdigo.
Por ejemplo, en el caso de un Spinner podra configurar un recurso que fue una matriz de
cadenas que proporcion la lista de elementos que se mostrarn. Si a continuacin desea
crear una versin de su aplicacin para un mercado extranjero que usted podra conseguir la
lista traducida y ha creado un recurso en el nuevo idioma.
Los recursos son una gran idea y que deben utilizarlas con todas las cuerdas fijas y datos fijos
en general. Hasta ahora los ejemplos han tendido a evitar recursos para hacer las cosas ms
simples, pero para un Spinner lo que necesita saber cmo codificar un recurso de tipo Alfa y
utilizarlo.
Android estudio tiene un buen apoyo de recursos, pero en algunas zonas es deficiente. Por
ejemplo, en un mundo ideal el sistema ayudara a crear una cadena o cadena de recursos
matriz, pero por el momento slo va tan lejos. Si bien no ayudar a crear un recurso de
cadena que no hace nada por una matriz de cadenas y no tenemos ms remedio que trabajar
con el archivo XML.
Es decir - en el momento en Android estudio slo proporciona ayuda
Encuentra el strings.xml archivo en el directorio res / valores y abra el archivo
strings.xml. Adase a esto la definicin de la matriz de la secuencia:
<string-array name="SpinnerList">
<item>Canada</item>
<item>Mexico</item>
<item>USA</item>
</string-array>

El significado del XML es evidente y esta es la ventaja de un lenguaje de marcado legible por
humanos.
Si usted ha explorado los recursos utilizando la ventana de Recursos que aparece cuando se
selecciona la opcin de tres puntos en la ventana de propiedades usted puede preocuparse de
que este nuevo recurso es decir SpinnerList, no aparece. La razn es que en la actualidad
Android estudio no apoya la asignacin, la edicin o creacin de matrices de Cuerda que no
sea de forma manual. Sin embargo haciendo uso del nuevo recurso es bastante fcil.
Para crear un ArrayAdapter de un recurso que necesita para hacer uso de un mtodo esttico
de la clase ArrayAdapter - createFromResource. Esto slo necesita especificar el contexto, el
identificador de recursos y la disposicin Spinner. Todo lo que tienes que hacer es reemplazar
la creacin de stringArrayAdapter
ArrayAdapter<CharSequence> stringArrayAdapter=
ArrayAdapter.createFromResource(
this,
R.array.SpinnerList,
android.R.layout.simple_spinner_dropdown_item);

Con este cambio todo funciona como antes, pero ahora para cambiar los elementos que
aparecen en el Spinner simplemente editar el archivo XML.

Cambio de la lista
Hay un montn de cosas ms avanzadas que se pueden hacer con Spinners pero estos no se
encuentran que a menudo - sobre todo cuando se trata de construir una experiencia de
usuario personalizada.
La nica cosa que no ocurre a menudo es la necesidad de cambiar dinmicamente la lista de
elementos. Hay muchas variaciones en esto, pero bsicamente lo que puede hacer es cambiar
la matriz de cadena y luego llamar al mtodo notifyDataSetChange del adaptador. Por
ejemplo, si desea cambiar de Mxico, es decir, un elemento, a Groenlandia se debera utilizar:
country[1]="Greenland";
stringArrayAdapter.notifyDataSetChanged();

El ArrayAdapter tambin tiene un complemento, limpiar, remover y un mtodo de insercin que


se puede utilizar para modificar los datos subyacentes, pero para que esto funcione el objeto
la celebracin de los datos tiene que ser modificable.No se puede modificar una matriz de
cadenas de esta manera. Lo que necesita es un ArrayList.
Si cambia la declaracin del pas a:

ArrayList<String> country=new ArrayList<String>(


Arrays.asList("Canada", "Mexico", "USA"));

A continuacin, puede aadir "Groenlandia" hasta el final de los elementos mediante:


stringArrayAdapter.add("Greenland");

Siempre puedes averiguar cuntos elementos hay por el mtodo de getCount.


Observe que en este caso el constructor ArrayAdapter utiliza cambios de uno que acepta una
matriz a una que acepta una lista de objetos.
Cmo modificar una lista de elementos que se crean mediante un recurso?
Esta es una pregunta difcil porque el ArrayAdapter crea una matriz de cadenas para contener
los datos que significa que no puede utilizar los mtodos que modifican una lista.
Hay un nmero de maneras de fijar esto para arriba pero la ms sencilla es, quizs, para
construir su propio ArrayList del recurso:
Resources res=getResources();
ArrayList<String> country=new ArrayList<String>(
Arrays.asList(
res.getStringArray(R.array.SpinnerList)));
ArrayAdapter<String> stringArrayAdapter=
new ArrayAdapter<String>(
this,
android.R.layout.simple_spinner_dropdown_item,
country);

Con esta versin del ArrayAdapter puede volver a utilizar el complemento y otros mtodos
para modificar la lista de elementos.

Conclusin
Hay mucho ms que decir sobre el Spinner y cmo personalizarlo pero los mtodos que se
explica aqu son los ms comunes. Si usted no est de acuerdo enviarme un email con una
pregunta.
Y si usted se est preguntando qu pas con Pickers - el prximo captulo entra en el tema.
Mientras tanto, si usted tiene alguna pregunta sobre lo que hemos cubierto hasta ahora por
favor hgamelo saber utilizar los comentarios.

8.

Aventuras Android Pickers

Pgina 1 de 3
Los recolectores son importantes formas de obtener la entrada del usuario, sino que han
pasado por muchas revisiones que carecen de documentacin simple o directrices cmo
usarlos. Trabajar con Pickers - fecha, hora o nmero - puede ser un lo confuso. Vamos a ver
si podemos hacer que todo parezca lgico.

Aventuras Android con Android Estudio


Contenido
1. Primeros pasos con Android Estudio
2. La actividad y el interfaz de usuario
3. La construccin de la interfaz de usuario y una calculadora App

4. Controles bsicos y Eventos


5. Contenedores de diseo
6. Ciclo de Vida y Estado
7. Spinners
8. Pickers
9. IU Grficos A Deep Dive
10. ListView y adaptadores
Fragmentos
11. Presentacin de Fragmentos
12. Fragmentos y XML
13. Fragmento Y Actividad Trabajando Juntos
14. Gestin de Fragmentos
15. Dilogos personalizados utilizando DialogFragment
16. Clases de dilogo en el DialogFragment
17. Un Proyecto NumberPicker DialogFragment
18. ViewPager
Tambin si usted est interesado en la creacin de plantilla personalizada ver:
Proyectos a Medida En Android Estudio

Un selector es una "marca" que se puede utilizar para seleccionar una de un conjunto
predeterminado de valores.En este sentido, es muy parecido a la Spinner cubierto en
laentrega anterior , pero que tiene un conjunto ms restringido de opciones. Android es
compatible actualmente con tres recogedores de fechas, horas y nmeros generales.
En la actualidad existe un pequeo problema con los recogedores y Android estudio que hace
el editor de interfaz de usuario deja de hacer que el DatePicker y en general el uso de Pickers
es ligeramente frgil.

El uso de un selector
El primer gran confusin a aclarar es que hay dos maneras de hacer uso de un Picker - como
un widget o como un cuadro de dilogo. De los tres recogedores conocidos, el TimePicker y el
DatePicker vienen como widgets y como cuadros de dilogo. El NumberPicker slo se
suministra como un widget, pero por supuesto usted puede ponerlo en un cuadro de dilogo si
desea.
En la mayora de los casos es probable que desee crear un cuadro de dilogo y en este caso
es necesario utilizar un DialogFragment para envolver el dilogo y gestionar su ciclo de
vida. El nico problema con esto es que un fragmento es un componente de interfaz de
usuario complicada y hay muchas situaciones en las que utilizan el widget prima va a hacer el
trabajo lo suficientemente bien.
En resumen, tiene sentido mirar primero los widgets de Picker subyacentes antes de que
lleguemos ronda a mirar Dilogos y DialogFragments en un captulo posterior.

Utilizando TimePicker
TimePicker es un lugar muy fcil para empezar. Si crea un nuevo proyecto Android, llamado
TimeAndDate y aceptar todos los valores predeterminados se puede colocar un TimePicker en
la superficie de diseo como cualquier otro widget de - no hay necesidad de preocuparse por

fragmentos o cuadros de dilogo. Usted puede encontrar el TimePicker en la seccin Fecha y


hora de la caja de herramientas donde tambin se encuentra el DatePicker.

Coloque el TimePicker en la superficie de diseo y tamao y localizar en los trminos


requeridos. En su configuracin por defecto se nota en el diseador utilizando el Theme.Light
estilo y tiene botones para el usuario para ajustar la hora:

Sin embargo, si se ejecuta el programa, suponiendo que usted est apuntando a la ltima
versin de Android podrs ver el ms reciente TimePicker Holo estilo:

El estilo Holo es sin duda ms fcil de usar ya que el usuario puede usar el tacto para "girar" la
seleccin y llegar a un valor mucho ms rpido que en la versin anterior.
Si usted realmente desea presentar el viejo TimePicker estilo, o cualquiera de los otros
Pickers, usted tiene que forzar el estilo de ser Theme.Light o cualquiera de los otros estilos del
tema. En principio, debera ser capaz de hacer esto utilizando Android de estudio, pero los
cambios en el estilo que seleccione en el diseador slo cambia lo que se ve en el diseador y
no en la versin final en ejecucin. En el momento en que tiene que hacer el cambio de estilo
de forma manual mediante la edicin de los archivos de recursos XML que controlan.

Estilo y temas en general, es un gran tema que se tratar en profundidad en otro captulo. No
tenga en cuenta por el momento, que gran parte de la documentacin se refiere a las
versiones earler de Android. La versin actual utiliza el archivo de valores / styles.xml para
determinar el estilo utilizado para los niveles anteriores a la API v11. Para v11 y ms tarde hay
archivos de estilo XML especficos almacenados en directorios llamados valores-VXY donde
xy es el nmero de versin.
As que si usted est destinada a una audiencia v14 SDK necesita cargar y valores-v14 editar /
styles.xml que contiene de forma predeterminada:
<style name="AppBaseTheme"
parent="android:Theme.Holo.Light.DarkActionBar">
<!-- API 14 theme customizations can go here. -->
</style>

Lo que esto significa es que no importa lo que cambia en valores / estilos del programa que se
ejecuta utilizar Holo.Light.DarkActionBar.
Sin embargo, si edita el archivo para que diga:
<style name="AppBaseTheme"
parent="android:Theme.Light">
<!-- API 14 theme customizations can go here. -->
</style>

entonces el estilo "clsico" se utilizar y ver:

Para interactuar con el TimePicker todo lo que tiene que utilizar es los mtodos get / set para
currentHour y CurrentMinute. Tambin puede programticamente cambiar el modo de hora 12
horas / 24. Observe que el tiempo siempre se devuelve en forma de 24 horas
independientemente del modo del widget es.
Por ejemplo, para establecer el TimePicker usaras
TimePicker tp=
(TimePicker) findViewById(R.id.timePicker);
tp.setIs24HourView(true);

tp.setCurrentMinute(10);
tp.setCurrentHour(13);

La nica tarea que queda es encontrar la manera de descubrir entonces el usuario ha


seleccionado un tiempo.Usted puede proporcionar un botn que el usuario tiene que hacer clic
para confirmar la nueva hora.
Por ejemplo, si coloca un botn y una TextView en la superficie de diseo, aadir el siguiente
controlador de eventos clic de los botones:
public void doButtonClick(View e){
TextView tv= (TextView)
findViewById(R.id.textView);
TimePicker tp= (TimePicker)
findViewById(R.id.timePicker);
tv.setText(tp.getCurrentHour().toString() +
":"+tp.getCurrentMinute().toString());
}

y recuerde poner Click propiedad de Button a doButtonClick entonces usted tiene una manera
para que el usuario ajuste la hora.

En la mayora de los casos, la parte difcil en el uso de un selector no se lo crea o conseguir


los datos de ella, pero en el procesamiento de esos datos en un formulario que su programa
puede utilizarlo. En este caso, simplemente convertir el tiempo en un poco con formato
representacin de cadena.

Actualizacin del tiempo


Qu hay de conseguir una actualizacin cada vez que el usuario cambia el TimePicker?
La solucin a esto es escribir un controlador de eventos para un evento
OnTimeChanged. Como siempre, se trata de una cuestin de ya sea la aplicacin de la

interfaz OnTimeChangedListener en la Actividad o como una clase annima. Utilizando


Android Estudio la clase annima es el mtodo ms sencillo. Si escribe en
TimePicker.OnTimeChangedListener OnTimeChanged=
new TimePicker.OnTimeChangedListener() {

utilizando la finalizacin de cdigo y luego al final Android Estudio generar un taln:


TimePicker.OnTimeChangedListener OnTimeChanged=
new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(
TimePicker view,
int hourOfDay,
int minute) {
}
}

Se puede adivinar que cuando el tiempo se cambia por el usuario el mtodo onTimeChanged
se llama y el TimePicker que desencaden el evento se pasa como vista, y su hora y minuto
configuracin como hourOfDay y minutos.
Todo lo que queda es configurar el controlador de eventos utilizando el mtodo
setOnTimeChangedListener.
Por ejemplo, para transferir el nuevo tiempo para el TextView utilizado en el ejemplo anterior
se debera utilizar:
TimePicker.OnTimeChangedListener OnTimeChanged =
new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(
TimePicker view,
int hourOfDay,
int minute) {
TextView tv = (TextView)
findViewById(R.id.textView);
tv.setText(Integer.toString(hourOfDay) +
":" + Integer.toString(minute));
}
};

Y usted necesita aadir:


tp.setOnTimeChangedListener(OnTimeChanged);

a OnCreate para asociar el objeto OnTimeChanged y su mtodo de gestin de eventos con el


TimePicker.
Ahora bien, si se ejecuta el programa, ver el TextView cambiar cada vez que el usuario
modifica la TimePicker por cualquier mtodo.
El programa completo, incluyendo el cdigo para el botn y el controlador de eventos se
muestra a continuacin y tambin se puede descargar desde el CodeBin :

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.widget.TimePicker;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TimePicker tp = (TimePicker)
findViewById(R.id.timePicker);
tp.setIs24HourView(true);
tp.setCurrentMinute(10);
tp.setCurrentHour(13);
tp.setOnTimeChangedListener(OnTimeChanged);
}
public void doButtonClick(View e) {
TextView tv =
(TextView)findViewById(R.id.textView);
TimePicker tp =
(TimePicker) findViewById(R.id.timePicker);
tv.setText(tp.getCurrentHour().toString()
+ ":" + tp.getCurrentMinute().toString());
}
TimePicker.OnTimeChangedListener OnTimeChanged =
new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(
TimePicker view,
int hourOfDay,
int minute) {
TextView tv =
(TextView) findViewById(R.id.textView);
tv.setText(Integer.toString(hourOfDay) +
":" + Integer.toString(minute));
}
};
}

DatePicker

Una vez que haya visto el TimePicker en accin hay muy poco que aadir a cubrir el
DatePicker.
El nico gran problema es que en el momento de escribir el DatePicker y el widget del
calendario no rinden en el diseador. Si se coloca un DataPicker en la superficie de diseo,
ver el mensaje:

Todava puede utilizar el diseador para colocar una DatePicker y puede utilizar la ventana
Propiedades para modificarla pero arrastrar y tamao no puede el widget de forma interactiva.
Para ver el DatePicker en accin simplemente iniciar un nuevo proyecto llamado Fecha y
aceptar todos los valores predeterminados. Coloque una DatePicker en la superficie de diseo
en la esquina superior izquierda - usted no ser capaz de editar despus de colocarlo por el
insecto.
Para ver la vista de tres estndar "spinner" del DatePicker es necesario agregar al final del
evento OnCreate:
DatePicker dp = (DatePicker)
findViewById(R.id.datePicker);
dp.setCalendarViewShown(false);

Al igual que con la TimePicker, el DatePicker se muestra en estilo Holo cuando se genera para
las API de 11 o ms.
Puede mostrar el estilo ms antiguo editando sea el style.xml en valores-v11 y / o valores-v14
para que diga:
<style name="AppBaseTheme"
parent="android:Theme.Light">

<!-- API 14 theme customizations can go here. -->


</style>

Si usted hace esto o si apunta a una API anterior lo que ver es:

Como alternativa se puede optar por mostrar tambin un calendario completo en cualquiera de
los estilos estableciendo CalendarViewShown true y se puede quitar los hilanderos
estableciendo SpinnersShown false.

Adems de jugar con la forma en la DatePicker se ve, tambin se puede establecer y obtener
todas las partes de una fecha con:

DayOfMonth

Mes

Ao

Tambin puede configurar y ver las fechas de mximo y mnimo que el widget mostrar.
Puede configurar un botn para que el usuario pueda ajustar la fecha al igual que con la
TimePicker o puede utilizar el evento OnDateChanged para rastrear el valor. Hacer esto sigue
los mismos pasos que para el evento OnTimeChanged pero con una pequea diferencia - no
existe un mtodo setOnDateChangedListener. En cambio, hay un mtodo init que se puede
utilizar para ajustar la fecha y el controlador de eventos.
Por ejemplo, si agrega un TextView a la parte inferior de la superficie de diseo y el cdigo
siguiente para el controlador de eventos a continuacin, puede ver la fecha cambia cada vez
que el usuario realiza un cambio:
DatePicker.OnDateChangedListener onDateChanged=
new DatePicker.OnDateChangedListener() {
@Override

public void onDateChanged(


DatePicker view,
int year,
int monthOfYear,
int dayOfMonth) {
TextView tv =
(TextView)findViewById(R.id.textView);
tv.setText(Integer.toString(monthOfYear) +
"/"+Integer.toString(dayOfMonth)+
"/"+Integer.toString(year)
);
}
};

Para configurar el DatePicker es necesario agregar al final del evento OnCreate:


dp.init(2014,4,2,onDateChanged);

que fija el ao, el mes y el da y el controlador de eventos.


Si se ejecuta la aplicacin, ver:

Esto le indica a la vez que los meses se numeran comenzando con Jan en cero no 1. La
solucin es aadir uno al nmero de meses.
El programa completo, tambin en el CodeBin es:
import
import
import
import
import

android.os.Bundle;
android.app.Activity;
android.view.Menu;
android.widget.DatePicker;
android.widget.TextView;

public class MainActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatePicker dp = (DatePicker)
findViewById(R.id.datePicker);
dp.init(2014,4,2,onDateChanged);
dp.setCalendarViewShown(false);

dp.setSpinnersShown(true);
}
DatePicker.OnDateChangedListener onDateChanged=
new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(
DatePicker view,
int year,
int monthOfYear,
int dayOfMonth) {
TextView tv =
(TextView)findViewById(R.id.textView);
tv.setText(Integer.toString(monthOfYear+1) +
"/"+Integer.toString(dayOfMonth)+
"/"+Integer.toString(year) );
}
};
}

Number Picker
Usted sabe que el NumberPicker va a haber problemas cuando note que est en la seccin de
Expertos de la caja de herramientas!
En realidad es muy fcil de utilizar y por qu est en la seccin de expertos, y no con los otros
Pickers, es difcil saber.
Para probarlo se inicia un nuevo proyecto llamado Nmero y aceptar todos los valores
predeterminados.
Para usarlo todo lo que tienes que hacer es seleccionar que es un lugar en la superficie de
diseo. Usted, al igual que los otros Pickers, ver una versin diseada para las API de ms
edad.

Si ejecuta la aplicacin a continuacin podrs ver el NumberPicker estilo de la ltima API que
en este caso se ve muy extrao, porque no hay nada cargado en el "spinner".

La razn de esto es que el NumberPicker es un poco ms complicado que los otros Pickers en
que permite establecer cules son las partes del hilandero pantallas.
Hay dos formas distintas en las que se pueden establecer el intervalo que se muestra - como
un par de valores mnimos y mximos, o como los valores almacenados en una matriz.
Por ejemplo, si lo que desea el NumberPicker para mostrar 0-9 podra utilizar:
NumberPicker np=
(NumberPicker) findViewById(R.id.numberPicker);
np.setMaxValue(9);
np.setMinValue(0);

Si no desea que el nmero spinner para envolver puede utilizar


np.setWrapSelectorWheel(false);

Si usted quiere dar al usuario la opcin de 0, 10, 20 y as sucesivamente hasta el 90 primero


tiene que inicializar una matriz de cadenas de tamao correcto para estos valores. En este
caso la diferencia entre MaxValue y MinValue propiedades 1 da el nmero de elementos en la
lista.
Para crear la matriz necesitamos un sencillo bucle for:

String[] values=new String[10];


for(int i=0;i<values.length;i++){
values[i]=Integer.toString(i*10);
}

Una vez que tenemos la matriz de valores para mostrar que se puede asignar a la Picker
utilizando su mtodo setDisplayedValues:
NumberPicker np=
(NumberPicker) findViewById(R.id.numberPicker);
np.setMaxValue(values.length-1);
np.setMinValue(0);
np.setDisplayedValues(values);

Usted puede haber notado que la matriz se utiliza para especificar los valores es una matriz de
cadenas. Lo que esto significa es que el NumberPicker, a pesar de su nombre, puede permitir
al usuario elegir entre una lista de cadenas arbitrarias que se pueden establecer.
Por ejemplo:
String[] values=new String[3];
values[0]="mike";
values[1]="sue";
values[2]="harry";
np.setMaxValue(values.length-1);
np.setMinValue(0);
np.setDisplayedValues(values);

produce:

Cuando se trata de la recuperacin de los datos que se puede utilizar el mtodo getValue que
devuelve un entero que es el valor que el usuario escogi si usted no est utilizando una
matriz de cadenas para los valores, o si es el ndice de la matriz de cadena del valor que el
usuario recogido.
Si desea obtener una actualizacin en vivo del valor que el usuario selecciona usted puede
utilizar el evento OnValueChange. El controlador de eventos
public void onValueChange(
NumberPicker picker,
int oldVal,
int newVal)

le proporciona el objeto NumberPicker que el hecho ocurri el como selector y el ndice de los
valores antiguos y nuevos. El nico problema es conseguir que el valor de la matriz de cadena
que define los valores que se muestran lo que probablemente no es accesible desde el
controlador de eventos. La solucin es utilizar getDisplayedValues del NumberPicker que
devuelve una matriz de cadenas de valores.
Por ejemplo, para transferir el valor a una TextView primero hay que definir un objeto de
escucha que se puede hacer fcilmente con la ayuda de autocompletado de Android
Productora:
NumberPicker.OnValueChangeListener onValueChanged
=new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(
NumberPicker picker,
int oldVal,
int newVal) {

String[] values=picker.getDisplayedValues();
TextView tv=
(TextView) findViewById(R.id.textView);
tv.setText(values[newVal]); TextView tv=
(TextView) findViewById(R.id.textView);
tv.setText(values[newVal]); }
}; }
};

Este utiliza el selector para obtener el conjunto de valores que se muestran a continuacin,
que se transfiere a la TextView usando el newVal como ndice.
Todo lo que necesita hacer para hacer este trabajo es aadir el Listener al NumberPicker:
np.setOnValueChangedListener(onValueChanged);

Ahora, cuando su ejecute el programa de la TextView se actualiza tan pronto como se realiza
algn cambio.

Eso es todo lo que hay para el uso bsico de la NumberPicker.


Para algunas tareas es mejor para mostrar la antigua NumberPicker estilo. Una vez ms todo
lo que necesita hacer es hacer el cambio estndar para cualquier otro archivo XML de estilo
que son relevantes valores-v14 / styles.xml y.
<style name="AppBaseTheme"
parent="android:Theme.Light">
<!-- API 14 theme customizations can go here. -->
</style>

Si haces lo que te dan es lo que se ve en el diseador de Android Productora:

Multi-Digit entrada
Por ltimo, si desea crear una entrada de varios dgitos - dicen centenas, decenas, unidades a continuacin, slo tiene que utilizar tres NumberPickers. Esto es ms difcil de lo que parece,
si desea realizar un seguimiento de forma dinmica el valor actual en ms de un
NumberPicker.
Por ejemplo, para crear una entrada de tres dgitos primero tiene que colocar tres
NumberPickers en la superficie de diseo con identificadores numberPicker1, numberPicker2
y numberPicker3.

Usted podra inicializar cada uno de los NumberPickers, a su vez, pero es instructivo utilizar
una matriz de NumberPickers para hacer el trabajo:
NumberPicker[]
nps[0]=
(NumberPicker)
nps[1]=
(NumberPicker)
nps[2]=
(NumberPicker)

nps=new NumberPicker[3];
findViewById(R.id.numberPicker1);
findViewById(R.id.numberPicker2);
findViewById(R.id.numberPicker3);

Ahora tenemos una gran variedad de objetos NumberPicker podemos inicializar todos ellos de
la misma manera usando un bucle for, pero primero tenemos que la matriz de valores que se
utilizar:

String[] values=new String[10];


for(int i=0;i<values.length;i++){
values[i]=Integer.toString(i);
}

Como estamos usando 0-9 esto se podra hacer como un ndice sin utilizar una matriz, pero
esto hace que el ejemplo ms general.
Ahora tenemos la matriz de valores que podemos inicializar los NumberPickers:
for(int i=0;i<3;i++){
nps[i].setMaxValue(values.length-1);
nps[i].setMinValue(0);
nps[i].setDisplayedValues(values);
nps[i].setOnValueChangedListener(onValueChanged);
}

Ntese que el mismo controlador de eventos se utiliza para todos los NumberPickers. En
algunos casos, esta es la manera de hacer las cosas de otra que es mejor tener un
controlador de eventos para cada widget.
El siguiente problema pequeo es la forma de actualizar el valor mostrado en un TextView
cuando uno de los NumberPickers cambia su valor.
Una vez ms la solucin ms simple para un ejemplo es obtener los valores de cada uno de
los NumberPickers utilizando un bucle for:
NumberPicker.OnValueChangeListener onValueChanged
=new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(
NumberPicker picker,
int oldVal,
int newVal) {
NumberPicker[] nps=new NumberPicker[3];
nps[0]=
(NumberPicker) findViewById(R.id.numberPicker1);
nps[1]=
(NumberPicker) findViewById(R.id.numberPicker2);
nps[2]=
(NumberPicker) findViewById(R.id.numberPicker3);
String temp="";
for(int i=0;i<3;i++){
String[] values=nps[i].getDisplayedValues();
temp=values[nps[i].getValue()]+temp;
}

TextView tv=(TextView)findViewById(R.id.textView);
tv.setText(temp); }
TextView tv=(TextView)findViewById(R.id.textView);
tv.setText(temp); }
}; }
};

En este caso no utilizamos cualquiera de los parmetros del mtodo evento simplemente
conseguimos los tres NumberPickers y obtenemos sus DisplayValues como una matriz de
cadenas y el valor actual utilizando el ndice devuelto por getValue.
El nico complicado pero es la construccin de la cadena de dgitos que se muestra en la
temp. Si no est seguro de lo que est pasando intente cambiar la lnea que establece la
temperatura para que diga:
temp=temp+values[nps[i].getValue()];

En la jerga de matemticas La concatenacin de cadenas no es conmutativa - en la jerga de


programacin importa que termina usted se pega algo en una cadena.
Por supuesto, como todos los tres NumberPickers comparten el mismo conjunto de valores
que realmente necesitamos slo para getDisplayedValues vez, pero esto es ms
general.Tambin es muy obvio que parte del cdigo se repiten y que sera mejor que
refactorizar para crear una funcin para obtener los tres NumberPickers por ejemplo.
Si ejecuta el programa debe ser capaz de alterar lo que se muestra en el TextView de una
manera el valor de posicin de tres dgitos sensata:

El programa completo, que se encuentra en el CodeBin , es:

package com.example.number;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.NumberPicker;

import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NumberPicker.OnValueChangeListener onValueChanged
=new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(
NumberPicker picker,
int oldVal,
int newVal) {
NumberPicker[] nps=new NumberPicker[3];
nps[0]=
(NumberPicker) findViewById(R.id.numberPicker1);
nps[1]=
(NumberPicker) findViewById(R.id.numberPicker2);
nps[2]=
(NumberPicker) findViewById(R.id.numberPicker3);
String temp="";
for(int i=0;i<3;i++){
String[] values=nps[i].getDisplayedValues();
temp=values[nps[i].getValue()]+temp;
}
TextView tv=
(TextView) findViewById(R.id.textView);
tv.setText(temp);
}
};
String[] values=new String[10];
for(int i=0;i<values.length;i++){
values[i]=Integer.toString(i);
}

NumberPicker[]
nps[0]=
(NumberPicker)
nps[1]=
(NumberPicker)
nps[2]=
(NumberPicker)

nps=new NumberPicker[3];
findViewById(R.id.numberPicker1);
findViewById(R.id.numberPicker2);
findViewById(R.id.numberPicker3);

for(int i=0;i<3;i++){
nps[i].setMaxValue(values.length-1);
nps[i].setMinValue(0);
nps[i].setDisplayedValues(values);
nps[i].setOnValueChangedListener(onValueChanged);
}
}

Conclusin
Hay mucho ms que decir sobre el Pickers y cmo personalizarlos, pero los mtodos que se
explica aqu son los ms comunes. Si necesita ms ayuda enviarme un email con una
pregunta.
El mayor omisin aqu es el uso de los recolectores dentro de un DialogFragment. Este es un
gran tema que ser cubierto en un captulo posterior.
Mientras tanto, si usted tiene alguna pregunta sobre lo que hemos cubierto hasta ahora por
favor hgamelo saber utilizar los comentarios.
Puede descargar el cdigo de los programas de la CodeBin(nota hay que registrarse primero).

9.

Aventuras Android - UI Grficos A Deep Dive

Si quieres ser un buen programador de Android, no slo lo que necesita saber cmo crear una
interfaz de usuario, sino tambin cmo se crea la interfaz de usuario. Para ser realmente
seguro de lo que est haciendo, es necesario comprender algunos de los mecanismos
internos del sistema de grficos Android.

Aventuras Android con Android Estudio

Contenido
1. Primeros pasos con Android Estudio
2. La actividad y el interfaz de usuario
3. La construccin de la interfaz de usuario y una calculadora App
4. Controles bsicos y Eventos
5. Contenedores de diseo
6. Ciclo de Vida y Estado
7. Spinners
8. Pickers
9. IU Grficos A Deep Dive
10. ListView y adaptadores
Fragmentos
11. Presentacin de Fragmentos
12. Fragmentos y XML
13. Fragmento Y Actividad Trabajando Juntos
14. Gestin de Fragmentos
15. Dilogos personalizados utilizando DialogFragment
16. Clases de dilogo en el DialogFragment
17. Un Proyecto NumberPicker DialogFragment
18. ViewPager
Tambin si usted est interesado en la creacin de plantilla personalizada ver:
Proyectos a Medida En Android Estudio

Una biblioteca de interfaz de usuario


Hay un montn de diferentes kits de construccin de la interfaz de usuario para Java y otros
lenguajes - AWT, Swing, Qt, MFC, WPF y sobre - y usted podra pensar que el dominio de
todos ellos sera una tarea difcil, si no imposible. De hecho, es mucho ms fcil de lo que
parece porque la mayora de las bibliotecas de interfaz de usuario utilizan el mismo enfoque
general y la biblioteca de interfaz de usuario de Android que no parecen tener un nombre no
es diferente.
Echemos una mirada cuidadosa a cmo funciona.
Una actividad tiene una ventana de la misma y esto es por lo general toda la pantalla grfica
del dispositivo que se est ejecutando. En otras palabras, una actividad puede permitir que
otras clases de Java para dibujar en la pantalla de los dispositivos. Sin embargo, en lugar de
simplemente proporcionar acceso directo al hardware grfico hay un extenso conjunto de
clases que hacen que la construccin de una interfaz de usuario y la realizacin de
operaciones de grficos ms fcil.
Antes de ver la grfica general tenemos que averiguar primero cmo se construye la interfaz
de usuario.

The View
La base de todos los componentes de interfaz de usuario y grficos 2D generales es la clase
View.
Esta es una clase de propsito general que tiene montones y montones de mtodos y
propiedades que determinan cmo se mostrar la entidad widget o otros grficos que
representa.Tambin participa en el sistema de gestin de eventos que significa Vistas pueden
responder a eventos.

Hay Ver clases que implementan todos los widgets estndar que usted haga uso de Android
en el diseador de estudio, es decir, el botn, TextView y as sucesivamente.
Cada objeto View tiene un mtodo OnDraw que puede dibujar la representacin grfica de lo
que representa en un objeto Canvas, que es esencialmente un mapa de bits con mtodos de
dibujo.
Lo que pasa es que la actividad llama al mtodo OnDraw de la Vista cuando se necesita
actualizar la interfaz de usuario y la pasa un objeto Canvas que luego presta a la pantalla usted no tiene que preocuparse acerca de cmo el lienzo se vuelve a la pantalla en este
nivel. Usted puede pensar en esto como "cada objeto View sabe cmo dibujar a s misma".
En resumen:

Una actividad puede estar asociada con un objeto View.

Cuando la actividad tiene que dibujar su interfaz de usuario que llama al mtodo Ver
los objetos OnDraw ejemplo view.onDraw (lienzo)

El objeto View entonces dibuja en el lienzo lo que necesita para - un botn, texto o lo
que sea.

La actividad a continuacin, muestra el objeto Canvas en la pantalla.

Una actividad puede estar asociada con una nica vista objeto que determina lo que se dibuja
en la pantalla. Esto puede parecer un poco limitado, pero, como se ver, est lejos de ser
limitada.

setContentView
Cmo se establece un objeto View para mostrar en la ventana de Actividades?
La respuesta es que se utiliza el mtodo Actividades setContentView - que es lo que hemos
estado haciendo todo el tiempo.
Para ver esto en accin, iniciar un nuevo proyecto Actividades blanco simple y agregue el
siguiente cdigo al onCreate:
Button b = new Button(this);
setContentView(b);

La primera instruccin crea un objeto Button, que es una subclase de vista, y el segundo
establece esto como la vista Actividades.

Si ejecuta este programa lo que se ve es un rea gris que ocupa toda la pantalla. S, este es el
botn! Incluso puedes hacer clic en l aunque, sin controlador de eventos, no pasa nada.
Para hacer que el botn un poco ms interesante que podemos personalizarlo estableciendo
las propiedades.
Por ejemplo:
Button b = new Button(this);
b.setText("Hello Button");
setContentView(b);

Si ejecuta este ver un botn que llena la pantalla con la leyenda "Hola botn".

No te molestes en establecer las propiedades de diseo porque en este momento no hay


ninguna disposicin en vigor por lo que se ignorarn. Cmo conseguir un diseo en la accin
es nuestro siguiente tema.

Layout - ViewGroup
Si una actividad slo puede mostrar un solo objeto View cmo podemos crear una interfaz de
usuario compleja con mltiples botones, textViews y otros widgets?

La respuesta es, y es probable que ya lo adivin, es que no son objetos de la presentacin o


ViewGroup que pueden utilizarse para alojar otros objetos View.
As que en casi todos los casos el objeto View que se asocia con una actividad es una vista de
diseo.
Cuando la Actividad pide la vista de diseo para hacer s mismo, llamando a su mtodo
OnDraw la Disposicin llama al mtodo OnDraw de cada uno de los Objetos de visin que
contiene y los pone juntos para hacer un solo resultado. Por supuesto que tambin realiza una
operacin de posicionamiento disposicin y el dimensionamiento de la Ver objetos que
contiene.
As que un Layout hace dos cosas:

alberga otros objetos View

que realiza la funcin de distribucin despus de la cual toma su nombre.

Para ver esto en accin try:


LinearLayout linLayout=new LinearLayout(this);
Button b = new Button(this);
b.setText("Hello Button");
linLayout.addView(b);
setContentView(linLayout);

La primera instruccin crea un objeto LinearLayout. Esta es una subclase de vista que pueden
contener otros objetos de vista y los organiza en una izquierda a derecha o de arriba a abajo
de manera dependiendo de la configuracin de su propiedad orientacin. A continuacin,
creamos un objeto de botn y luego utilizamos el mtodo addView estndar del LinearLayout
para aadirlo a la disposicin.
Si ejecuta este programa, ver un botn a la derecha en la parte superior izquierda de la
pantalla. Usted puede agregar ms botones para ver cmo funciona el diseo lineal por
defecto:

Por el momento estamos confiando en la configuracin por defecto de los objetos de vista que
estamos creando. Sin embargo, en la prctica se puede pasar el tiempo y las lneas de cdigo
para establecer todas las propiedades necesarias para crear cualquier interfaz de usuario y el
diseo de usted quera.
Ahora ya sabe cmo crear una interfaz de usuario completamente en cdigo. Todo lo que
tienes que hacer es crear todos los objetos de widget que necesita, establezca sus
propiedades y aadirlos a los objetos de disposicin adecuados.
Observe tambin que un diseo puede contener otras presentaciones y por lo que el conjunto
de Ver objetos que componen una interfaz de usuario est estructurado como un rbol - la
jerarqua de vistas. Cuando la pantalla se vuelve a dibujar se pide a cada objeto View
dibujarse a s mismo y esto se hace para todos los objetos de vista de la jerarqua de arriba a
abajo.
Normalmente la jerarqua Vista se dibuja una sola vez cuando se carga la actividad. Si un rea
de la pantalla se oscurece por otro grfico por algn motivo, el volver a dibujarlo inteligente
como para no sacar todo el Vista jerarqua. Slo se vuelve a dibujar Ver objetos que se cruzan
con el rea invalidada de la pantalla. No hay ms que decir sobre esto ms adelante.
La jerarqua Ver tambin participa en la aprobacin eventos entre los objetos y en la
determinacin de qu control tiene el foco actual.

Disposicin XML
Hasta el momento los principios del sistema de grficos son bastante simples.
Todos los mandos o el widget corresponde a un objeto de vista y se puede construir una
interfaz de usuario mediante la creacin de objetos de vista de cdigo y agregarlos a
diseos. Una actividad se basar su Visualizar jerarqua para la pantalla cuando necesita.
OK, esto es cmo crear una interfaz de usuario en el cdigo, pero hasta ahora hemos estado
construyendo una interfaz de usuario mediante el Diseador.
Cmo se relaciona esto con la jerarqua View?
El diseador crea un archivo XML que describe la jerarqua Vista que desea crear. La forma en
que esto funciona es bastante obvio. Cada etiqueta en el archivo XML corresponde a un objeto
View que le gustara crear una instancia de.
Por ejemplo:

<LinearLayout>
</LinearLayout>

creara una instancia de un objeto LinearLayout.


Anidacin de etiquetas dentro de una disposicin indica que la necesidad objeto creado que
se aade a la disposicin como nios Vistas. Por ejemplo:
<LinearLayout>
<Button />
</LinearLayout>

creara un objeto LinearLayout y un objeto Button y luego agregar el objeto Button al


LinearLayout utilizando su mtodo addView.
Se puede ver que el XML captura la idea de la jerarqua Ver perfectamente.
Para establecer las propiedades del objeto todo lo que tienes que hacer es es utilizar los
atributos correspondientes en el XML. Por ejemplo para ajustar el texto del botn que utilizara
<Button
android:text="New Button"
/>

Eso es realmente todo lo que hay que hacer. El XML define una jerarqua de objetos y sus
propiedades y el sistema lee el archivo y crea los objetos. Este uso de XML como un sistema
de objetos de instancias no es un caso raro.
Por supuesto, el XML creado por el diseador se parece mucho ms complicado que los
ejemplos anteriores, pero esto se debe principalmente a que el nmero de atributos que
define. La idea bsica sigue siendo la misma.

Teora de la inflacin
La gran pregunta final que responder es cmo el XML se convierten en una jerarqua de
objetos reales?
La respuesta a esto es utilizar una "inflado". Para inflar un diseo es jerga de Android para
crear instancias de los objetos definidos por un archivo XML.
Normalmente no tiene que llamar a un inflado debido a que el sistema lo hace por usted detrs
de las escenas, pero se puede si usted quiere.

Por ejemplo, para inflar un diseo que utilizara una instancia de la


LayoutInflater. Normalmente no crear una instancia de fresco, pero la opcin de pedir prestado
de THS sistema utilizando getLayoutInflater. Una vez que tenga la LayoutInflater puede utilizar
uno de sus muchos mtodos inflar para crear una jerarqua Ver objeto segn lo especificado
por el cdigo XML. El mtodo que use depende de dnde se almacena el cdigo
XML. Simplemente puede suministrar un ID de recurso para un archivo XML incluido en el
directorio res.
Por ejemplo, para inflar el diseo habitual activity_main.xml se debera utilizar:
LayoutInflater inf = getLayoutInflater();
View myView = inf.inflate(R.layout.activity_main,null);
setContentView(myView);

El segundo parmetro de inflado se puede usar para proporcionar un objeto View para actuar
como el contenedor raz para la jerarqua Ver inflado.
Por supuesto esto es totalmente equivalente a la de costumbre:
setContentView(R.layout.activity_main);

que llama a la LayoutInflater y fija la vista en una instruccin.


La nica razn por la que a usted le inflar manualmente un diseo XML es si queras hacer
algo inteligente como poner un diseo junto con otro o de alguna manera manipular la
jerarqua View.
Observe que hay otros tipos de objetos Inflater - por ejemplo, el de inflado Men pero hace el
mismo trabajo de convertir XML a objetos instanciados con las propiedades dadas. Hay
tambin una versin del mtodo de inflado:
inflate(R.layout.activity_main,root, true/false);

que se infle el recurso XML utilizando la raz como su contenedor a efectos de diseo si el
ltimo parmetro es falso y que se sumar la Vista inflado a la raz si el ltimo parmetro es
cierto.

Encontrar objetos View


Uno de los problemas que tenemos que resolver si se quiere trabajar con la jerarqua Ver
creado por un inflado es encontrar objetos de vista de la jerarqua.
En el ejemplo donde construimos la jerarqua Ver en cdigo era fcil seguir la pista de un
botn o un TextView simplemente manteniendo una referencia a cuando se cre.Un inflado

simplemente devuelve la jerarqua Vista sin una manera fcil de conseguir en un objeto
particular, por ejemplo un botn.
Una forma de resolver el problema sera la de "caminar" el rbol Vista. Un objeto ViewGroup
por ejemplo, un diseo no slo tiene un mtodo addView pero una serie de mtodos que
permiten acceder a los objetos que contiene. Cada objeto hijo se le asigna un ndice de
enteros - Piense en ello como una matriz. El mtodo:
getChildAt(i)

devolver el objeto secundario en el ndice i.


Tambin puede utilizar:
getChildCount()

para averiguar cmo se almacenan muchos objetos secundarios en el contenedor.


El uso de estos mtodos puede buscar en la jerarqua del objeto View que quieras, pero
cmo saber cul es?
La respuesta a esta pregunta es que todos los objetos de vista tienen una propiedad id que
debe identificarlos por separado. Hay mtodos getId y SETID pero por lo general la propiedad
ID se establece como parte del archivo XML.
Para evitar tener que llegar a un valor id la manera estndar de crear un id es definir un
recurso:
<Button
android:id="@+id/my_button"

Cuando el archivo XML se infla el @ + smbolo se interpreta como "crear un recurso". Un


Identificacin del nmero entero se genera utilizando el mtodo generateViewId y esto se
utiliza tanto para crear la propiedad id y aadir una propiedad my_button al objeto R.id.
Hay mucho ms que decir acerca de los recursos, pero por el momento esto es suficiente para
entender lo que est pasando.
Lo que todo esto significa es que no slo se obtiene un valor de id autogenerado, sino tambin
una forma de obtener este valor en la ejecucin de cdigo. Usted podra utilizar los mtodos
getChildAt al paso a travs de todos los objetos de vista de la jerarqua, pero es mucho ms
fcil de usar:
findViewById(R.id.my_button);

que devuelve el objeto en una instruccin.

Cmo construir una interfaz de usuario?


Ahora tiene dos, al menos, los enfoques para la construccin de una interfaz de usuario. Usted
puede hacer todo el trabajo en el cdigo o puede crear un diseo de XML.
En la prctica, por lo general es ms fcil utilizar el diseador Android Studio para generar el
archivo XML para usted. No obstante, usted puede mezclar los dos enfoques y cambiar una
interfaz de usuario "sobre la marcha". Por ejemplo, usted puede cargar una interfaz de usuario
de forma implcita o explcita inflar un archivo XML y luego escribir cdigo para crear y aadir
otros widgets o incluso eliminar los objetos de vista del diseo. Para quitar Ver objeto slo
tiene que utilizar los mtodos removeView o removeViewAt del objeto ViewGroup.

Qu ms se puede aprender?
En los prximos captulos tenemos que averiguar sobre fragmentos, cuadros de dilogo y
grficos 2D.

10.

Aventuras Android - ListView y adaptadores

ListView es, probablemente, los componentes de interfaz de usuario ms comnmente


utilizados y necesarios en una aplicacin para Android. No es difcil de usar, pero hay que
llegar a enfrentarse con la idea de un "adaptador" y entender lo que est pasando paga
dividendos.

Aventuras Android con Android Estudio


Contenido
1. Primeros pasos con Android Estudio
2. La actividad y el interfaz de usuario
3. La construccin de la interfaz de usuario y una calculadora App
4. Controles bsicos y Eventos

5. Contenedores de diseo
6. Ciclo de Vida y Estado
7. Spinners
8. Pickers
9. IU Grficos A Deep Dive
10. ListView y adaptadores
Fragmentos
11. Presentacin de Fragmentos
12. Fragmentos y XML
13. Fragmento Y Actividad Trabajando Juntos
14. Gestin de Fragmentos
15. Dilogos personalizados utilizando DialogFragment
16. Clases de dilogo en el DialogFragment
17. Un Proyecto NumberPicker DialogFragment
18. ViewPager
Tambin si usted est interesado en la creacin de plantilla personalizada ver:
Proyectos a Medida En Android Estudio

Por una serie de razones, una de las cosas ms comunes que hay que hacer en una interfaz
de usuario de Android es para mostrar una lista de las cosas que el usuario puede elegir.
Si est familiarizado con el desarrollo de escritorio entonces usted probablemente piense en
las listas que el usuario puede seleccionar de como algo similar a una lista
desplegable.Dispositivos Android y porttiles a menudo necesitan algo ms que una pequea
lista. Debido al tamao limitado de la pantalla es a menudo el caso de que el usuario slo
puede mostrar una visin general de un buen nmero de artculos diferentes. Cuando el
usuario selecciona un elemento que se presentan a continuacin con ms detalles del
elemento - una vista de detalles.
Viendo listas y otras colecciones de datos es tan comn que Android tiene un mecanismo que
hace que sea ms fcil.Bueno, hace ms fcil una vez que entienda cmo funciona todo.
La idea clave es que para ver una coleccin cada elemento de la coleccin tiene algo de cmo
se convierte en un objeto View apropiado. Es el objeto View que las pantallas de contenedores
para cada elemento de los datos de la coleccin.

El Adaptador
Que exhibe una coleccin de artculos tiene una serie de similitudes no importa lo que la
coleccin de elementos son o lo que el contenedor.
El recipiente tiene diversas posiciones que son visibles en la pantalla para la visualizacin de
artculos. Por ejemplo, un ListView tiene ranuras horizontales, uno por cada artculo y un
GridView tiene una rejilla 2D de las franjas horarias.
Cada contenedor acepta un objeto View y lo muestra en una ranura.
Por ejemplo, usted podra proporcionar el ListView con objetos TextView y sera simplemente
mostrar texto en cada una de sus ranuras.

Tal vez se pregunte por qu no acaba de suministrar un conjunto de cadenas para el ListView
y dejarlo trabajar la manera de mostrar las cadenas como texto?
Las cosas podran ser organizados de esta manera y sera ms simple - pero slo si se
queran mostrar Cuerdas. Si desea mostrar una lista de imgenes, por ejemplo, entonces
usted tendra un ListView que entiende las imgenes y as sucesivamente.
Es mucho ms flexible para proporcionar el contenedor con un conjunto de predispuestas Ver
objetos porque entonces el contenedor simplemente tiene que mostrar el objeto Ver sin tener
que realizar ninguna conversin.
Todos los contenedores que se derivan de la utilizacin maquillaje clase AdapterView de
adaptadores para suministrar lo que se muestran en trminos de objetos View. Estos incluyen,
as como el ListView y GridView, el hilandero, Galera y StackView.
Ya hemos visto en el uso de la Spinner y su adaptador asociado en un captulo anterior as
que esta vez es el turno de un elemento ms avanzada interfaz de usuario - la ListView y su
adaptador.
Este enfoque tambin tiene la ventaja de que se puede brindar el contenedor con un objeto
View que es un diseo completo es decir, que podra ser en s mismo un contenedor con una
gran cantidad de objetos de vista para mostrar. Por ejemplo, usted podra suministrar un
ListView con un objeto View que contiene una imagen y un TextView para crear una lista de
multimedia de imgenes y texto.
Por supuesto, si el envase no est haciendo la conversin del objeto de datos al objeto View usted va a tener que hacerlo.
Aqu es donde el adaptador entra.
El ListView y los contenedores de GridView ambos hacen uso de la clase ListAdapter como su
adaptador de base.
En general usted tiene que tomar la clase ListAdapter y extenderlo a crear su propio adaptador
costumbre que genera un objeto View personalizado para el recipiente a utilizar en cada una
de sus ranuras. El contenedor pide el objeto View que se utiliza para mostrar el punto i o
utilizando cualquier indexacin adapte el contenedor particular. El adaptador devuelve el objeto
View y el contenedor de la muestra - sin preocuparse de lo que es o lo que corresponde.
Esto puede sonar complicado, pero resulta ser muy simple en la prctica.
Sin embargo, para hacer las cosas an sencillo tambin hay un ArrayAdapter que le permite
desplegar un solo elemento de texto para cada elemento de una matriz de objetos arbitrarios.

Cmo es esto posible funciona si el objeto de la matriz puede ser cualquier cosa?
Lo primero a sealar es que ArrayAdapter es una clase genrica y puede aceptar un arreglo
de cualquier tipo, siempre y cuando as lo especifican al crear la instancia ArrayAdapter.
La segunda cosa a destacar es que el adaptador de matriz llama cada artculos mtodo
toString para conseguir un poco de texto para que aparezca en el envase - muy sencillo pero
tambin muy restrictiva. De hecho, es bastante fcil de modificar lo que los ArrayAdapter
pantallas y esto hace que sea ms verstil que se puede esperar y por lo tanto vale la pena
conocer.
Entonces, para resumir:

Contenedores como ListView y visualizacin GridView Ver objeto en una disposicin


particular - como una lista vertical o como una rejilla 2D en este caso.

Un adaptador convierte los datos que se va a mostrar en cada ranura en una vista de
objeto adecuado.

Para los datos y visualizaciones complejas que necesita para crear un adaptador
personalizado.

En muchos casos, sin embargo, el ArrayAdapter se puede utilizar.

El ArrayAdapter, en su forma ms bsica, puede suministrar objetos TextView a un


contenedor de una matriz de cualquier tipo simplemente llamando mtodos toString del
objeto.

El ArrayAdapter
En lugar de comenzar con un ejemplo que es completamente general es digno de mirar cmo
se utiliza la ArrayAdapter en conjuncin con un ListView.
Inicie un nuevo proyecto llamado Android Estudio ListViewExample basado en una actividad
en blanco y aceptar todos los valores predeterminados.
Para un ejemplo simple todo lo que vamos a hacer es mostrar una lista de nombres en un
ListView.
En primer lugar eliminar la habitual "Hello World" textView.In el diseador desplazarse por la
paleta hasta que pueda ver la Contenedores y colocar un ListView en la superficie de diseo.

Usted ver que por el bien de lo que le permite trabajar con el diseo del diseador mostrar
la ListView lleno de unos dos objetos de texto artculo. Nuestro adaptador va a ser ms
sencillo que esta pantalla maniqu con una sola lnea de texto.
Si ejecuta el programa en esta primera etapa usted no ve nada en el ListView - que estar en
blanco. El texto que se ve en el diseador es slo para ayudarle a visualizar la interfaz de
usuario - no hay adaptador asociado con el ListView y por lo tanto cuando lo ejecuta no hay
nada para mostrar.
Nuestra prxima tarea es crear un objeto ArrayAdapter para abastecer el ListView con algo
para mostrar.
Pero primero necesitamos una matriz de cadenas para contener el texto que vamos a
mostrar. Para simplificar, podramos aadir el cdigo al mtodo onCreate en
MyActivity.java. Para crear un simple array Alfa podemos utilizar un literal:
String[] myStringArray={"A","B","C"};

no dude en pensar en algo ms creativo que A, B, C. En el mundo real las cuerdas


probablemente se lee de un archivo o una base de datos, etc.
Lo siguiente que necesitamos para crear el ArrayAdapter. Para ello el constructor necesita el
contexto, por lo general esto, una disposicin a utilizar para mostrar cada cadena y el conjunto
de la secuencia:
ArrayAdapter<String> myAdapter=new
ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
myStringArray);

Note la manera que el tipo de la matriz se especifica como <String>. Si usted no est
familiarizado con los genricos de Java, entonces usted necesita para buscar cmo funciona
todo. Tambin note el uso del estndar suministrado simple_list_item1 diseo. Usted puede
crear sus propios diseos y veremos cmo se hace esto en un momento.
Por ltimo tenemos que asociar el adaptador con el ListView:
ListView myList=
(ListView) findViewById(R.id.listView);
myList.setAdapter(myAdapter);

El mtodo onCreate completa es:


protected void onCreate(
Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
String[] myStringArray={"A","B","C"};
ArrayAdapter<String> myAdapter=new
ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
myStringArray);
ListView myList=(ListView)
findViewById(R.id.listView);
myList.setAdapter(myAdapter);
}

Si ahora ejecuta el programa, ver una lista ordenada con cada elemento de la matriz que se
muestra en una lnea - como se haba prometido.

Hasta ahora esto no se ve impresionante, pero el ListView le da algunos servicios bsicos. Por
ejemplo, si se aumenta el nmero de elementos de la matriz:

String[] myStringArray=
{"A","B","C","D","E","F","G","H","I","J","K"};

Usted descubrir que puede desplazarse automticamente a travs de la lista con el gesto
habitual pelcula.

Trabajando con los datos


El punto de mostrar al usuario una lista de elementos es de manera que puedan interactuar
con l. Puede manipular los datos en la pantalla de diversas maneras y manejar los eventos
cuando el usuario selecciona un elemento.
Obtener Seleccin
Tal vez lo ms importante es hacer frente a la seleccin del usuario y el tema. La forma
habitual de hacer esto es escribir un controlador para el OnItemClickListener. Esto pasa cuatro
parmetros
onItemClick(AdapterView parent, View view,
int position, long id)

El AdapterView es la visin completa que muestra el envase, la vista es la vista de objetos del
usuario seleccionado, la posicin en la recogida y el id es el nmero de elementos de
identificacin en el contenedor. Para una ArrayAdapter el ID es el mismo que el ndice de
matriz.
Puede utilizar este evento para averiguar lo que el usuario ha seleccionado y modificarlo. Por
ejemplo, el controlador de eventos:
AdapterView.OnItemClickListener
mMessageClickedHandler =
new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView parent,
View v,
int position,
long id) {
((TextView)v).setText("selected");
}
};

establece cada elemento el usuario selecciona "seleccionado" - no es til, pero usted puede
cambiar el color a gris a cabo la seleccin.

Es importante saber que el cambio de lo que la vista de objetos muestra no cambia los datos
almacenados en la estructura de datos asociada. Es en este contexto una fila para
"seleccionado" no cambia la entrada del conjunto de cuerdas caso.
Para configurar el controlador a la ListView se debera utilizar:
myList.setOnItemClickListener(
mMessageClickedHandler);

Tambin puede establecer la seleccin en cdigo usando:


myList.setSelection(position);

donde la posicin es la posicin de base cero del elemento de la lista y puede desplazarse
para mostrar cualquier elemento utilizando
myList.smoothScrollToPosition(position);

Un punto sutil vale la pena mencionar es que no se puede hacer uso del objeto de vista que se
pasa al controlador de eventos para mostrar la seleccin en otra parte de la disposicin. Un
objeto de vista slo puede estar en la jerarqua de disposicin de una vez.
En la mayora de los casos esto no es un problema porque normalmente se puede clonar
manualmente el objeto View. Por ejemplo, en este caso el objeto View es un TextView y as
que usted puede crear un nuevo TextView y establecer su propiedad Text a ser el mismo que
el de la una en la lista. Por ejemplo:
TextView w=new TextView(getApplicationContext());
w.setText( ((TextView)v).getText());
LinearLayout myLayout=
(LinearLayout) findViewById(R.id.layout);
myLayout.addView(w);

Esto puede ser ms una molestia si el objeto View es ms compleja.


Modificacin de los datos
Una de las cosas un poco confusos sobre el uso de adaptadores es la relacin entre lo que se
muestra y lo que est en la estructura de datos subyacente. Puede cambiar los datos, pero si
quieres ver el cambio en el contenedor que tenga que utilizar un adaptador notificar mtodo
para decirle que los datos han cambiado.
Por ejemplo, si cambia un elemento de la matriz:
myStringArray[0]="newdata";

entonces nada va a mostrar hasta que utilice:


ListView myList=
(ListView) findViewById(R.id.listView);
ArrayAdapter myAdapt=
(ArrayAdapter)myList.getAdapter();
myAdapt.notifyDataSetChanged();

Tenga en cuenta que usted tiene que emitir el ListAdapter regres de getAdapter a un
ArrayAdapter para llamar al mtodo de notificacin.
Hay una segunda forma de cambiar los datos utilizando la propia ArrayAdapter. Esto
proporciona una serie de mtodos para agregar, insertar, limpiar, remover e incluso ordenar los
datos en el adaptador. El gran problema es que si se utiliza cualquiera de estos entonces la
estructura de datos subyacente asociada con el adaptador tiene que apoyarlos.
Por ejemplo, el mtodo add aade un objeto en el extremo de la estructura de datos pero si
intenta:
myAdapt.add("new data");

con el programa configurado actualmente usted encontrar que usted consigue un accidente
de tiempo de ejecucin. La razn es que en Java una matriz tiene un tamao fijo y el mtodo
add intenta aadir el artculo a la final de la matriz que no es posible.
Si desea agregar elementos al final de una matriz como la estructura de datos es necesario
utilizar un ArrayList y no slo una simple matriz. Un ArrayList puede aumentar o disminuir su
tamao.
Por ejemplo, podemos crear un ArrayList de fuera Array cadena existente:
ArrayList<String> myArrayList=
new ArrayList<String>();

y se puede asociar este nuevo ArrayList con el adaptador en lugar de la matriz de la


secuencia:
ArrayAdapter<String> myAdapter=
new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
myArrayList);

A raz de ello se puede utilizar:

myAdapt.add("new data");

y ver los nuevos datos al final de la lista mostrada. Puede que tenga que desplazarse para
verlo.
Mientras usted est utilizando un ArrayList que son seguros de usar todos los datos del
adaptador mtodos de modificacin:
add(item)
addAll(item1,item2,item3...)
clear() //remove all data
insert(item,position)
remove(item)

Tambin puede hacer uso de


getCount() //get number of elements
getItem(position) // get item
getItemId(position) //get item id

y
getPosition(item)

Un diseo personalizado
Uso Hasta ahora acabamos de hacer del sistema proporciona el diseo de la fila. Es muy fcil
crear su propio archivo de diseo y configurarlo para que se utiliza para representar cada fila pero hay que tener en cuenta que los nicos datos que se mostrar que es diferente en cada
fila se deriva de los artculos. mtodo toString.
El diseo personalizado simple tiene que tener un solo control TextView que se utiliza para
cada lnea. De hecho esto es tan simple que no tiene ventajas sobre el sistema suministrado
diseo as que esto es realmente slo para mostrar cmo funcionan las cosas.
Utilice Android Studio para crear un nuevo diseo en el directorio de diseo estndar y lo
llaman mylayout.xml. Utilice el editor de diseador o de texto para crear un diseo con un solo
objeto TextView:
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="? android:attr/textAppearanceLarge"
android:text="Large Text"

xmlns:android=
"http://schemas.android.com/apk/res/android"
android:id="@+id/textView">
</TextView>

Si elimina el contenedor predeterminado puede ver mensajes de error. Simplemente ignorarlos


y seguir adelante con poner una TextView en el diseo.
Para utilizar el diseo que simplemente proporcione su ID de recurso en el constructor
ArrayAdapter:
ArrayAdapter<String> myAdapter=
new ArrayAdapter<String>(
this,
R.layout.mylayout,
myStringArray);

Si intenta esto usted no ve ninguna gran diferencia entre esto y cuando se utiliza la disposicin
del sistema android.R.layout.simple_list_item_1.
El siguiente nivel es el uso de un diseo que tiene ms que un solo TextView en ella. La nica
complicacin en este caso es que usted tiene para ofrecer no slo la identificacin de la
distribucin pero el id de la TextView en el diseo que desea utilizar para los datos.
Por ejemplo, si crea una presentacin con un LinearLayout horizontal y colocar un CheckBox,
y dos TextViews:

A continuacin, puede utilizar el diseo mediante la creacin de la ArrayAdapter con:


ArrayAdapter<String> myAdapter=
new ArrayAdapter<String>(
this,
R.layout.mylayout,
R.id.textView2,
myStringArray);

suponiendo que el TextView desea que los datos aparezcan en es textView2.

El resultado es un poco ms impresionante que el ejemplo anterior:

Note que cada uno de los objetos de vista en la disposicin da lugar a una instancia distinta
por lnea. Esa es su diseo slo puede haber tenido un CheckBox pero el ListView tiene una
lnea por. Esto significa que cuando el usuario selecciona la lnea que usted puede recuperar
la configuracin de la casilla de verificacin decir. Tambin significa que un ListView puede
generar montones y montones de objetos de vista muy rpidamente y esto puede ser una
carga para el sistema.
Nota importante:
Hay algunas cosas que usted necesita saber si usted va a manejar con xito eventos
onItemClick.
La primera es que su diseo no puede tener Vistas enfocables o puede hacer clic. Si lo hace,
entonces el an no se eleva y el controlador no se llama.
La solucin es para detener cualquier objeto View en el recipiente de ser enfocable. Aadir
android:descendantFocusability="blocksDescendants"

al LinearLayout decir o utilizar la ventana de propiedades para establecerlo en


blocksDescendants - ya que es una propiedad avanzada tiene que seleccionar "Mostrar
avanzado".

Con este cambio, el controlador de eventos debe ser llamado, pero ahora tienes que tener en
cuenta que el objeto View pasa como v en:
public void onItemClick(AdapterView parent,
View v,
int position,
long id)

es el objeto de vista completa de la fila y no slo el TextView.Es decir en el caso del ejemplo
anterior sera el LinearLayout adems de todos sus hijos.
Si usted va a trabajar con el objeto View que tiene que acceder a los objetos contenidos en l
y usted puede hacer esto es de la forma habitual. Por ejemplo:
AdapterView.OnItemClickListener
mMessageClickedHandler =
new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView parent,
View v,
int position,
long id) {
TextView myData =
(TextView) v.findViewById(R.id.textView2);
myData.setText("Selected");
}
};

Observe que puede utilizar findViewById en la vista que se devuelve.

Un ArrayAdapter personalizada

Mientras usted puede hacer frente a lo que se muestra para cada fila de ser una cadena
devuelta por el mtodo toString del objeto, puede utilizar un ArrayAdapter estndar. Incluso
puedes personalizar mtodo toString del objeto para mostrar algo diferente - pero an as es
una cadena.
Si usted tiene una gran variedad de objetos generales y desea mostrar varios artculos de
cada objeto o artculos que no son cadenas, entonces usted necesita para crear un
ArrayAdapter personalizado. Esto no es difcil pero hay uno o dos puntos ms avanzados para
tomar nota de que para este primer ejemplo - vamos a mantener lo ms simple posible.
Primero necesitamos algunos objetos para contener los datos que vamos a mostrar - un tipo
de registro decir con un campo para el nombre y otro para el nmero en stock decir, tambin
se puede aadir una foto del artculo, sino en el espritu de hacer que sea sencillo una
Cuerdas y e int son suficientes.
Si conoces a otros idiomas que podran estar pensando que necesitamos un stuct o algo
similar. En Java no hay estructuras. Si desea crear un registro se crea un objeto con las
propiedades necesarias.
Inicie un nuevo proyecto llamado CustomList y aceptar todos los valores
predeterminados. Navegue hasta el directorio principal de Java, haga clic derecho y seleccione
Nuevo, Clase. Llame a la MyData clase y escriba:
public class MyData {
public String myTitle;
public int myNum;
public MyData(){
super();
}
public MyData(String myTitle, int myNum) {
super();
this.myTitle = myTitle;
this.myNum = myNum;
}
}

La nueva clase tiene dos campos pblicos MyTitle y myNum y un constructor de encargo que
nos permite inicializar estos campos. La adicin de este constructor de inicializacin hace que
sea fcil crear arrays de la nueva clase.
Por ejemplo, en el mtodo onCreate puede agregar

MyData myDataArray[]=new MyData[]{


new MyData("item1",10),
new MyData("item2",20),
new MyData("item3",30)
};

Puede que tenga que agregar ms datos de este para probar el ListView correctamente.
Ahora tenemos algunos datos para mostrar que necesitamos agregar el adaptador
personalizado.
Una vez ms, haga clic derecho en el directorio java y crear una nueva clase llamada
MyAdapter. Esto tiene que heredar de ArrayAdapter:
public class MyAdapter
extends ArrayAdapter<MyData> {
}

Ntese que queremos que el ArrayAdapter genrico para trabajar con objetos MyData. La
mayora de los mtodos de ArrayAdapter funcionar perfectamente bien con matrices de
objetos arbitrarios.
A continuacin tenemos que aadir un constructor adecuado en base a los constructores que
ArrayAdapter tiene. Android Studio puede ayudar.
Haga clic en la lnea de clase y seleccione Generar, Constructor. Ver una lista de posibles
constructores. La que nosotros queremos utilizar es el tercero en la lista.

Al seleccionarlo se genera el siguiente cdigo para usted:


public MyAdapter(Context context,
int resource,
MyData[] objects) {
super(context, resource, objects);
}

Tenemos que ampliar esto porque tenemos que seguir la pista de contexto, los recursos y la
matriz de objetos y primero necesitamos algunas variables para almacenarlos en:
private Context context;
private int resource;
private MyData[] objects;

El constructor puede ahora almacenar los valores pasados a estas variables:


public MyAdapter(Context context,
int resource,
MyData[] objects) {
super(context, resource, objects);
this.context=context;

this.resource=resource;
this.objects=objects;
}

Ntese que con este constructor nuestro adaptador se utiliza en la misma forma que en el
ejemplo anterior - suministramos contexto, ID de recurso y el conjunto de datos.
Ahora llegamos a la parte clave de la personalizacin - anulando mtodo getView del
adaptador. Este es el ncleo de la funcionalidad del adaptador. Cada vez que el ListView
necesita mostrar una nueva fila se llama al mtodo getView del adaptador y espera volver un
objeto View que puede mostrar como la fila.
Para anular el mtodo que puede utilizar Android Studio para generar algo de cdigo. Haga
clic derecho en la clase de adaptador y seleccione Generar, mtodo de anulacin y seleccione
getView. El cdigo generado no es particularmente til, pero al menos se pone la firma del
mtodo correcto:
@Override
public View getView(int position,
View convertView,
ViewGroup parent) {
return super.getView(position,
convertView,
parent);
}

Realmente no importa cmo getView genera el objeto View que va a regresar, pero la forma
ms comn de hacer el trabajo es inflar un archivo de diseo.
Para dar el inflador algo para trabajar con el botn derecho sobre la carpeta res / layout y
seleccione Nuevo archivo de diseo. Llame a la mylayout archivo y cambiar el LinearLayout a
horizonal y aadir dos TextViews con el ttulo y el nmero de identificadores. Sintase libre de
cambiar el diseo para hacer que las cosas se ven bastante - no lo puedo cambiar el cdigo
que necesita para escribir.
Nuestra primera tarea es conseguir un inflador e inflar el archivo de diseo:
LayoutInflater inflater=
((Activity) context).getLayoutInflater();
View row=inflater.inflate(resource,parent,false);

Ntese que hacemos uso de la Identificacin de recursos almacenamos cuando el constructor


corri y usamos el objeto padre Ver aprobada en el mtodo getView. El nico propsito el
padre objeto View sirve es para permitir que el sistema de la disposicin de los recursos en un

recipiente conocido. El parmetro falsa ltimo le dice al inflado de no aadir el objeto generado
recursos para los padres - este es un trabajo para el ListView.
Antes de ello tenemos que poner los datos en el objeto View.Para ello tenemos que encontrar
los dos objetos TextView que nos coloca en el diseo y esto es slo una cuestin de cantar el
patrn findViewById familiar:
TextView title= (TextView)
row.findViewById(R.id.title);
TextView number=(TextView)
row.findViewById(R.id.number);

Una vez que tenga los objetos de vista que tenga que cambiar puede utilizar el parmetro de
posicin para obtener los datos de la matriz de objetos que se establecen por el constructor:
title.setText((CharSequence)
objects[position].myTitle);
number.setText(Integer.toString(
objects[position].myNum));

Eso es todo, hace trabajo. Todo lo que necesitamos hacer ahora es devolver el objeto fila
Vista:
return row;
}

La clase myAdapter completa es:


public class MyAdapter
extends ArrayAdapter<MyData> {
private Context context;
private int resource;
private MyData[] objects;
public MyAdapter(Context context,
int resource,
MyData[] objects) {
super(context, resource, objects);
this.context=context;
this.resource=resource;
this.objects=objects;
}
@Override
public View getView(int position,
View convertView,

ViewGroup parent) {
LayoutInflater inflater=
Activity) context).getLayoutInflater();
View row=inflater.inflate(resource,parent,false);
TextView title= (TextView)
row.findViewById(R.id.title);
TextView number=(TextView)
row.findViewById(R.id.number);
title.setText((CharSequence)
objects[position].myTitle);
number.setText(Integer.toString(
objects[position].myNum));
return row;
}
}

Ahora todo lo que tenemos que hacer es escribir algo de cdigo que hace uso de la nueva
clase y esto es exactamente el mismo que el cdigo que hizo uso de la ListView Stanard:
MyAdapter myAdapter=new
MyAdapter( this,
R.layout.mylayout,
myDataArray);
ListView myList = (ListView)
findViewById(R.id.listView);
myList.setAdapter(myAdapter);

Y, por supuesto, no te olvides de poner un componente ListView en el diseo principal.


Si ejecuta el programa que ahora ver una lista que consta de dos TextViews cada uno con
algo diferente para mostrar en cada lnea. En una aplicacin real que probablemente no crea
una nueva clase para dos elementos de texto - reemplazando el mtodo toString sera ms
fcil, pero los principios son los mismos sin importar las Ver mltiples objetos creados por el
adaptador son.

La reutilizacin, almacenamiento en cach y las


presentaciones generales
Tenemos una clase adaptador personalizado de trabajo pero hay algunas cosas que podemos
hacer para que sea mejor.
La primera se refiere a la eficiencia.

Si usted recuerda, se seal que una gran lista de objetos podra dar lugar a la creacin de
una gran cantidad de objetos de vista. En la prctica, sin embargo, realmente slo
necesitamos el nmero de objeto View que corresponden a filas en realidad se muestran en la
pantalla.
Para evitar tener que disponer de ellos ya crear nuevos Objetos de visin todo el tiempo el
ListView te da la oportunidad de reciclar los objetos de vista que ya haya creado. Esto es lo
que el parmetro convertView en el mtodo getView se trata. Si es nulo tiene que inflar y crear
un nuevo objeto View. Si no es nulo, entonces es un objeto View listo para ser utilizado y usted
no tiene que crear una nueva.
Modificacin del ejemplo anterior para hacer uso de convertView es fcil:
View row;
if(convertView==null) {
LayoutInflater inflater =
((Activity) context).getLayoutInflater();
row = inflater.inflate(resource, parent, false);
}else{
row=convertView;
}

Se trata de un aumento de velocidad pena hacer y evita as tener que crear un montn de
objetos de vista y disponer de ellos.
Sin embargo todava estamos buscando a la nia Objetos de visin cada vez que queremos
cambiar los datos. Esto es:
TextView title= (TextView)
row.findViewById(R.id.title);
TextView number=(TextView)
row.findViewById(R.id.number);

Esto tambin es muy derrochador y se puede evitar con la aplicacin del patrn ViewHolder.
Todo lo que tenemos que hacer es guardar las referencias a los nios en un objeto y almacena
esta en la matriz de Ver propiedad etiqueta. Entonces la prxima vez que vemos al padre Ver
que no tiene que encontrar a los nios que estamos buscando - que se almacenan en la
etiqueta de los padres como un objeto ViewHolder.
En primer lugar tenemos que crear un objeto ViewHolder:
private static class ViewHolder {
TextView title;
TextView number;
}

Tenga en cuenta que esto no tiene campos que puedan contener referencias a nuestros dos
objetos TextView.
La lgica del mtodo getView es ahora tambin para crear y almacenar un objeto ViewHolder
si no estamos reciclando un objeto View

View row;
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater =
((Activity) context).getLayoutInflater();
row = inflater.inflate(
resource, parent, false);
viewHolder.title =
(TextView) row.findViewById(R.id.title);
viewHolder.number =
(TextView) row.findViewById(R.id.number);
row.setTag(viewHolder);
}

Tenga en cuenta que hemos almacenado las referencias a los TextViews en el viewHolder y
almacenada en este campo Etiqueta de la fila - esto es lo campos de la etiqueta genreally se
utilizan.
Si nosotros tenemos un objeto View reciclado entonces slo tenemos que obtener el objeto
viewHolder:
} else {
row = convertView;
viewHolder = (ViewHolder) convertView.getTag();
}

Por ltimo, no importa donde el objeto viewHolder vino de que slo lo utilizan:
viewHolder.title.setText(
(CharSequence) objects[position].myTitle);
viewHolder.number.setText(
Integer.toString(objects[position].myNum));
return row;
}

Con este cambio se ha evitado la creacin de un objeto de vista cada vez y hemos evitado
tener que buscar el nio objetos cada vez - un ahorro muy tiles en tiempo y recursos.
Finalmente hay un ltimo pulimento de aplicar. Por el momento el diseo de la fila tiene que
tener los identificadores de los objetos TextView establecidas al ttulo y nmero. Mucho mejor
para permitir al usuario establecer estos en el constructor:
public MyAdapter(Context context,
int resource,
int resTitle,
int resNumber,
MyData[] objects) {
super(context, resource, objects);
this.context = context;
this.resource = resource;
this.textRes1= resTitle;

this.resNumber = resNumber;
this.objects = objects;
}

Este constructor tiene dos parmetros adicionales que se utilizan para especificar los nmeros
de identificacin de los dos objetos ViewText en el diseo. Estos se almacenan en las
variables privadas para su uso posterior - y tenemos que declarar las variables privadas:
private int resTitle;
private int resNumber;

El constructor original todava se puede mantener el tiempo que establece resTitle y


resNumber:
public MyAdapter(Context context,
int resource,
MyData[] objects) {
super(context, resource, objects);
this.context = context;
this.resource = resource;
this.objects = objects;
this.resTitle =R.id.title;
this.resNumber =R.id.number;
}

Por ltimo tenemos que cambiar el mtodo getView utilizar las dos nuevas variables privadas:
viewHolder.title =
(TextView) row.findViewById(resTitle);
viewHolder.number =
(TextView) row.findViewById(resNumber);

Con estos cambios, el adaptador se puede utilizar como:


MyAdapter myAdapter=new MyAdapter(
this,
R.layout.mylayout,
R.id.title,
R.id.number,
myDataArray);

y el usuario es libre de utilizar ningn cdigo para el diseo, siempre hay dos TextViews.

Resumen

Contenedores como ListView trabajan juntos con un adaptador para mostrar los datos.

El adaptador acepta una estructura de datos - por lo general una matriz o una lista - y
convierte cualquier elemento de datos en un objeto View que representa los datos.

Puede manejar un evento de seleccin para averiguar lo que el usuario ha


seleccionado.

La vista de objetos puede ser complejo con un recipiente exterior y cualquier nmero
de objetos secundarios.

El ArrayAdapter bsica utiliza el mtodo toString de cada objeto de proporcionar los


datos para mostrar en un objeto ViewText.

Si desea mostrar algo que no sea el resultado de llamar toString es necesario


implementar un ArrayAdapter personalizado.

Para hacer esto usted tiene que reemplazar el mtodo getView heredado.

El ListView es lo suficientemente inteligente como para ofrecerle Ver objetos para


reciclar - aunque usted no tiene que hacerlo si no quieres.

El patrn ViewHolder puede hacer que su uso de anidado Objetos de visin ms


eficiente.

Qu Est Faltando?
Al igual que con todas las cosas, hay aspectos de la ListView que no se han cubierto. En
particular, qu hacer si su estructura de datos no es una matriz? El ArrayAdapter puede
manejar listas, simplemente anular el constructor adecuado.Cualquier cosa ms compleja y
que tendr que crear un adaptador personalizado. En la mayora de casos, sin embargo, esto
no es necesario porque la mayora de las estructuras de datos pueden ser mapeadas a una
matriz.
Hay una serie de temas de formato no cubierta - la cabecera y el separador, por ejemplo pero stas son relativamente fciles.
Ms complicado son las opciones de seleccin mltiple y cualquier lista personalizada muestra
como una lista con varias columnas o pop-out detalle ventanas.
Todos son posibles temas para futuros captulos.

Adaptador personalizada
public class MyAdapter extends ArrayAdapter<MyData> {
private Context context;
private int resource;
private MyData[] objects;
private int resTitle;
private int resNumber;
public MyAdapter(Context context,
int resource,

MyData[] objects) {
super(context, resource, objects);
this.context = context;
this.resource = resource;
this.objects = objects;
this.resTitle =R.id.title;
this.resNumber =R.id.number;
}
public MyAdapter(Context context,
int resource,
int resTitle,
int resNumber,
MyData[] objects) {
super(context, resource, objects);
this.context = context;
this.resource = resource;
this.resTitle = resTitle;
this.resNumber = resNumber;
this.objects = objects;
}
private static class ViewHolder {
TextView title;
TextView number;
}
@Override
public View getView(int position,
View convertView,
ViewGroup parent) {
View row;
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater =
((Activity) context).getLayoutInflater();
row = inflater.inflate(resource,
parent,
false);
viewHolder.title =
(TextView) row.findViewById(resTitle);
viewHolder.number =
(TextView) row.findViewById(resNumber);
row.setTag(viewHolder);
} else {
row = convertView;

viewHolder =
(ViewHolder) convertView.getTag();
}
viewHolder.title.setText((CharSequence)
objects[position].myTitle);
viewHolder.number.setText(Integer.toString(
objects[position].myNum));
return row;
}
}

Puede descargar el cdigo de los programas de la CodeBin(nota hay que registrarse primero).

Vous aimerez peut-être aussi