Capitulo 1

Para iniciar este curso definamos que es ANDROID:

La computación oblicua es lo que caracteriza a Android, (integración de la información con la persona, de tal manera que no se perciban como objetos diferenciados), el SO (Sistema Operativo) Android surgió de otro SO, para este caso nació de LINUX, es multitarea, multiusuario no existen virus como en otros "Sistemas Operativos", la principal fortaleza es el Kernel (es el núcleo del SO), tenemos una gran variedad de servicios que controla el Kernel.

Kernel de Linux

En la base tenemos el kernel 2.6 de Linux, Android lo utiliza por su robustez y por la implementación de funciones para cualquier sistema operativo, por ejemplo: seguridad, administración de memoria y procesos, implementación de conectividad de red (network stack) y varios interpretes (drivers) para comunicación con los dispositivos físicos(hardware).

Android utiliza como base el kernel de Linux pero los dos sistemas no son lo mismo, Android no cuenta con un sistema nativo de ventanas de Linux ni tiene soporte para glibc (librería est´andar de C) ni tampoco es posible utilizar la mayoría de aplicaciones de GNU de Linux.

Adem´as de todo lo ya implementado en el kernel de Linux, Android agrega algunas cosas específicas para plataformas móviles como la comunicación entre procesos (lograda a través del binder), la forma de manejar la memoria compartida (ashmem) y la administración de energía (con wakelocks). De las características únicas del kernel utilizado por Android encuentran m´as información en Android Kernel

Librerías y ejecución

Sobre el kernel, tenemos un conjunto de librerías de C y C++ utilizadas por el sistema para varios fines como el manejo de la pantalla (surface manager), mapas de bits y tipos de letra (Free Type), gr´aficas en 2D y 3D (SGL y OpenGL), manejo de multimedia (Media Framework), almacenamiento de datos (SQLite) y un motor para las vistas web y el navegador (WebKit).

Junto a estas librerías, encontramos lo necesario para la ejecución de las aplicaciones a través de la m´aquina virtual Dalvik. Cada aplicación utiliza una instancia de la m´aquina virtual ejecutando un archivo DEX (Dalvik Executable) y el sistema est´a optimizado para que se ejecuten múltiples instancias de la m´aquina virtual. Se desarrolla en Java pero no se utiliza una m´aquina virtual de Sun para su ejecución ni tampoco archivos CLASS.

Estructura de aplicaciones

Sobre las librerías encontramos una estructura que nos brinda un contexto para desarrollar, este framework permite a los desarrolladores aprovechar un sistema de vistas ya construido, administrar notificaciones y acessar datos a través de proveedores de contenido entre otras cosas.

Aplicaciones

Las aplicaciones centrales que incluye el sistema por defecto son: teléfono, navegador, manejo de contactos, etc. En esta capa de la arquitectura es donde trabajaremos desarrollando aplicaciones.

Bloques b´asicos de una aplicación

Una vez vista la arquitectura, empezaremos con lo fundamental para desarrollar una aplicación. Los componentes b´asicos de una aplicación son:

Activities: son componentes de la interfaz que corresponde a una pantalla. Podemos visualizarlo como un mazo de cartas en el que tenemos varias cartas pero solamente una est´a hasta arriba.
Una aplicación para una lista de cosas por hacer (remember the milk) puede tener una actividad para ingresar las cosas por hacer y otra actividad para mostrar el listado, en conjunto estas actividades conforman la aplicación.

Intents: son mensajes que provocan notificaciones o cambios de estatus, que al ser recibidos por actividades o servicios pueden levantar procesos. De esta forma se unen componentes dentro de la misma aplicación o de diferentes aplicaciones.

Views: son los componentes de la interfaz de usuario, diferentes vistas pueden agruparse a través de grupos logrando una jerarquía, esto se logra a través de la disposición de los componentes a través de un archivo XML.

Services: son componentes que ejecutan operaciones en segundo plano y no tienen una interfaz de usuario. Por ejemplo, al escuchar música, hay un servicio encargado de la reproducción que se ejecuta de fondo y la aplicación que manipulamos le manda mensajes a este servicio diciéndole que se detenga, pause o reproduzca la siguiente canción.

Content Providers: representan la abstracción para almacenar y obtener datos permanentes y aplicaciones diferentes. El sistema incluye algunos proveedores de contenido útiles (audio, vídeo,etc) y adem´as pueden desarrollarse nuevos.

Manifest: El archivo AndroidManifest.xml es donde se configura la aplicación, se agregan actividades, se asignan permisos, etc.

Broadcast Receivers: son componentes que responden a avisos y anuncios de difusión (broadcast). Estos avisos provienen del sistema (batería baja, una llamada entrante, etc) y de aplicaciones (pasando avisos de una aplicación a otra). Aun que no muestran una interfaz de usuario algunas veces utilizan barras de progreso para mostrar avances. Estos se activan a través de mensajes asincrónicos llamados intents (mencionados arriba).

¿Qué se puede hacer con Android?


Algunos ejemplos son:
Navegar y buscar por el mundo
Conectarse y compartir
Entretenimiento digital
Crear y colaborar

¿Qué tiene Android?
Un resumen es:
App Widgets para el escritorio
Notificaciones
Multi-tarea
Reconocimiento de voz
C´amara de fotos y vídeos


¿Qué versiones existen de Android?


Un sistema operativo Android tiene tres tipos de denominar a las versiones de Android, aunque las tres hacen referencia a la misma versión:

La comercial con el nombre de postre. Por ejemplo: KitKat
La de los fabricantes (y también comercial) con la versión y subversión. Por ejemplo: 4.4
La de desarrollador con el nivel del API, Interfas de Programación de aplicaciones (ésta nos interesa mucho para desarrollar en Android): Por ejemplo: 19

NOMBRE
VERSION
API

Beta

0


Apple Pie

1.0


Banana Bread

1.1


Cupcake

1.5

3

Donut

1.6

4

Eclair

2.0/2.1

7

Froyo

2.2

8

Gingerbread

2.3.2/2.3.7

9/10

Honeycomb

3.0/3.1/3.2

11/12/13

Ice Cream Sandwich

4.0/4.0.3

14/15

Jelly Bean

4.1.2/4.2.2/4.3

16/17/18

KitKat

4.4/4.4(Wear)

19/20

Lollipop

5.0

21

Versiones que no hay que tener en cuenta, debido a que apenas existan:

C: Cupcake (v1.5), magdalena glaseada.
D: Donut (v1.6), rosquilla.
E: éclair (v2.0/v2.1), pastel francés conocido en España como pepito.
F: Froyo (v2.2), (abreviatura de «frozen yogurt») yogur helado.
G: Gingerbread (v2.3), pan de jengibre.
H: Honeycomb (v3.0/v3.1), panal.
I: IceCream Sandwich (4.0), s´andwich de helado.
J: Jelly Bean (¿¿??), gomitas de gelatina)

Versión 1.x. Demasiado antigua. La versión m´as moderna fue la 1.6, fue lanzada en Septiembre de 2009

Versión 3.x. Era solo para Tablets, casi todas est´an actualizados a la 4.x (Casi todos los dispositivos que se vendieron con la versión 3.X pueden, en potencia, actualizarse a la versión 4.X, si no est´a actualizado es por falta de interés del poseedor del dispositivo)

Android Studio: Requisitos mínimos


Windows

Windows 7/8/10 (32 o 64 bits).
2 GB de RAM (8 GB de RAM recomendado).
2 GB de espacio libre mínimo (4 GB recomendado).
Resolución mínima de 1.280 x 800.
Java 8. 64 bits y procesador Intel (emulador).

Mac

Mac OS X 10.8.5 o superior.
4 GB de RAM (8 GB de RAM recomendado).
2 GB de espacio libre mínimo (4 GB recomendado).
Resolución mínima de 1.280 x 800.
Java 6.

Linux

GNOME o KDE Desktop.
64 bits / 32 bits.
GNU C (glibc) 2.1 o superior.
2 GB de RAM (8 GB de RAM recomendado).
2 GB de espacio libre mínimo (4 GB recomendado).
Resolución mínima de 1.280 x 800.
Java 8.
64 bits y procesador Intel (emulador).


¿Qué características suelen tener los dispositivos con Android?

Gr´aficos: VGA, biblioteca de gr´aficos 2D, biblioteca de gr´aficos 3D basada en las especificaciones de la OpenGL ES 2.0

Almacenamiento: SQLite

Conectividad: GSM/EDGE, IDEN, CDMA, EV-DO, UMTS, Bluetooth, Wi-Fi, LTE, HSDPA, HSPA+, NFC y WiMAX

Mensajería: SMS, MMS y C2DM

Navegador Web: WebKit, motor JavaScript V8

Multimedia: WebM, H.263, H.264 (en 3GP o MP4), MPEG-4 SP, AMR, AMR-WB (en un contenedor 3GP), AAC, HE-AAC (en contenedores MP4 o 3GP), MP3, MIDI, Ogg Vorbis, WAV, JPEG, PNG, GIF y BMP

Streaming: RTP/RTSP (3GPP PSS, ISMA), descarga progresiva de HTML (HTML5 <video> tag), Adobe Flash Streaming (RTMP)

Hardware: c´amaras de fotos, de vídeo, pantallas t´actiles, GPS, acelerómetros, giroscopios, magnetómetros, sensores de proximidad y de presión, sensores de luz, gamepad, termómetro, aceleración por GPU 2D y 3D.

Bluetooth: A2DF y AVRCP, el envío de archivos (OPP)

Videollamadas, Voz, Multi-t´actil

Tethering: usar al dispositivo como punto de acceso inal´ambrico

Arquitectura

Aplicaciones: cualquier tipo de aplicación escrita en Java.
Framework de las aplicaciones: Acceso al API para rehusar componentes o modificarlos.
Bibliotecas en C/C++: el desarrollador puede usarlas a través del Framework.
Runtime de Android: bibliotecas del lenguaje Java y única instancia en la m´aquina virtual Dalvik.
Núcleo Linux: Capa de abstracción del hardware y servicios de seguridad, gestión de memoria, de procesos, pila de red, modelo de los controladores, etc.


Instalación de las herramientas necesarias para programar con Android Studio

Descarga de herramientas necesarios programar con Android con el Android Studio


1 - Primero debemos instalar el compilador de Java y la m´aquina virtual. Estas herramientas las podemos descargar de:

Java SE Development Kit (SDK selecione Java SE Development Kit y copielo en el navegador y descrge la version ultima para su sistema mas abajo esta el link), grupo de herramientas que permiten la programación de aplicaciones móviles.

2 - El segundo paso es la descarga del Android Studio (que contiene todo lo necesario para comenzar el desarrollo de aplicaciones en Android), lo hacemos del sitio :

Android SDK.

Ahora procedemos a su instalación en el equipo ejecutando el archivo que acabamos de descargar:



Iniciamos con Next>




Dejamos por defecto para que instale el Android Studio, el Android SDK, Android Virtual Device etc.

Debemos actualizar los repositorios, que son parte de los servicios de Android Studio, pero se requiere instalar el Java JDK, y necesitamos descargar este software  de la pagina:

 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Ya descargado se instala y revisamos el directorio en donde se alojo, la ruta del directorio es muy necesario:

C:\Program Files\Java\jdk1.8.0_171 ó C:\Program Files\Java\jdk1.8.0_18x

Agregamos esta ruta a las variables de entorno agrega una nueva variable de sistema JAVA_HOME que apunte a tu carpeta de JDK. Desde el panel de control se realiza de esta forma:





Usa el botón Nueva...


Para la instalación en LINUX se descarga esta software en un archivo .zip se descomprime, el directorio resultante se mueve a /opt que es un directorio que actuar´a de forma compartida localmente (root, usuarios pueden tener acceso sin limites de derechos), entonces la ruta sera: /opt/andriod_studio (en el ejemplo se encuentra como /opt/andriod_studio/andriod_studio).

Se mejora mucho el acceso y el diseño en NetBeans 8.2 (ver mas adelante) y android studio si se agregan los siguientes par´ametros en .bashrc (linux)

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
export ANDROID_HOME=$HOME/opt/android_studio/android-studio/
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"
export IBUS_ENABLE_SYNC_MODE=1


# User specific aliases and functions

el path depender´a de donde se encuentra instalado Android Studio, en LINUX se sugiere que sea /opt/android_studio ya que es un directorio compartido

La instalación de Java JDK, para LINUX, usaremos el rpm.

Instalacion en LINUX

la Ruta de instalación esta en /usr/java/jdk1.8.0_171-amd64 (por compatibilidad con procesadores AMD) que debemos de tener en cuenta para agregar al path, y entonces quedaría así:

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
export ANDROID_HOME=$HOME/opt/android_studio/android-studio/
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"
export IBUS_ENABLE_SYNC_MODE=1
export PATH=/usr/java/jdk1.8.0_171-amd64:$PATH

 #User specific aliases and functions

Para Windows  la ruta donde se instala Android Studio

C:\Archivos de Programas\Android\Android Studio\bin\andriod64.exe

La primer ocasión que se ejecute es posible que salga un cuadro de dialogo donde nos solicite una actualización del SDK, si es así permitamos que haga la actualización, y en alguna ocasión posteriormente es posible que nos solicite la actualización nuevamente. El proceso de inicio es igual (pantallas, mensajes, etc. en LINUX y windows).

Proyecto0001

Al finalizar la actualización, podremos ver algo como esto:



Elegimos :  Start a new Android Studio project  (Iniciar un nuevo proyecto Android Studio).



En application name, escribimos el nombre del proyecto a realizar en nuestro caso usamos proyecto0001, y el ultimo de lo campos Project Location nos indicara el lugar donde se ubicara este proyecto: /home/miguels/AndroidStudioProjects/proyecto0001  (esta ruta pertenece al SO LINUX, en Windows se iniciara la ruta comenzando como C:\)



Seleccionamos la opción de donde sera la aplicación, Phone and Tablet, Wear, TV, etc. por el momento usemos el primero, y hacemos clic en Next, lo que nos llevara a lo siguiente:



Usemos "Empty Activity" seleccionamos el cuadro, y hacemos un clic en Next.



Por esta ocasión dejaremos los nombres tal como los asigna el Adroid Studio, realizamos un clic sobre Finish.



Importante: en la parte inferior se observa un globo que tiene el mensaje Events (en este caso 2) podemos hacer un clic ahí y buscar Update, para que se agreguen las mejoras y actualizaciones, podemos detenernos aquí, pero avancemos para conocer como se comporta. Se vera como realiza la agrupación de servicios formando el proyecto


Se nos presentara una ventana que consiste en "Tips" del día solo hacemos clic en Close

En la parte inferior derecha se muestra un mensaje de actualización UPDATE, es necesario realizar la actualización por cambios que son necesarios.

hacemos clic en update y esperamos a que termine


Vea la imagen el lado izquierdo seleccionado los elementos que se observan para mostrar la imagen del lado derecho

No se har´a en este momento un an´alisis del objetivo y propósito de cada elemento que estamos observando, se har´a de forma progresiva seguir como se avance en el curso.

La interfaz visual se almacena en un archivo XML en la carpeta res, la subcarpeta layout, y el archivo activity_mail.xml, (metadatos) en MainActivity.java, se encuentra el código de la aplicación. 



en MainActivity.java se encuentra esto:


PROBLEMAS DURANTE LA EJECUCION

En ocasiones podemos experimentar problemas el error: android studio rendering problems missing styles, que se puede representar que la aplicación no permite ver botones o elementos que estamos agregando, y mostrando Error Rendering.

Para solucionar este problemas haremos lo siguiente:

primero ubicaras la carpeta values– dentro de ella busca el archivo styles.xml


Luego lo abres y te fijas si en tiene este estilo Light.DarkActionBar como muestro en el siguiente código, si lo encuentras ese es el estilo que esta haciendo conflicto en nuestra aplicación.

<resources>
<!-- Base application theme. -->
 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
     <!-- Customize your theme here. -->      <item name="colorPrimary">@color/colorPrimary</item>
       <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
      <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

Ahora regresa a tu activity_main.xml que se encuentra en tu carpeta values. Ahora selecciona el icono Apptheme


Se nos abrir´a una nueva pantalla en ella, haremos lo siguiente daremos clic en Material Light y seleccionaremos el estilo Material.Light.DarkActionBar

Corrigendo el problema



 

En Windows x32 se puede presentar un problema como el siguiente:



Para corregir esta situación haremos lo siguiente.

No usemos la opción de JDK embebido que viene por defecto en Andriod Studio y cambiarla en una propia ruta del JDK. (esta es óptimo para sistemas de 64 bits)

  

Debajo de Andriod NDK locations existe un link Download Andriod Ndk, (Native Development Kit permite a los desarrolladores reutilizar código escrito en C/C++ introduciéndolo en las aplicaciones a través de JNI (Java Native Interface). El NDK hace que la ejecución de la aplicación sea en cierto modo m´as r´apida, ya que pasar´a a ejecutarse directamente en el procesador y no es interpretado por una m´aquina virtual. ) se descargara la aplicación que sea necesario y se agrega de forma autom´atica la ruta de NDK, y retiramos el CheckBox (Use embembed JDK) y se agrega la siguiente ruta : C:\Program Files\Java\jdk1.8.0_171, por lo cual se debera de observar lo siguiente:

Las clases m´as importantes para el desarrollo de aplicaciones en Android son las siguientes:

• ActivityManager : Controla el ciclo de vida de las actividades.

• View : Se usan para construir interfaces en las actividades.

• NotificationManager : Mecanismo no intrusivo para mostrar avisos al usuario.

• ContentProvider : Permiten intercambiar datos de una manera estandarizada.

• Resource Manager: permite usar en la aplicación recursos que no forman parte del código, como XML, strings, recursos gr´aficos, audio, vídeo, etc.

Continuamos con la siguiente acción en la representación del celular hay un cuadro que tiene un titulo que dice "Hello World" lo seleccionamos y lo borramos con la tecla Supr (Suprimir, borrar), del lado izquierdo

Observa el proceso

Es conveniente centrar este elemento usando los ajustes que est´an dentro de las propiedades del botón, hacer un clic botón izquierdo, y usando el la opción Center, aplicar Horizontally y repetir para Vertially :

Si persisten los problemas al ejecutar la app en un sistema de x32 debemos hacer disminuir la huella de memoria para Grandle -> grandle.properties  y cambiar el valor de org.gradle.jvmargs=-Xmx1536m a org.gradle.jvmargs=-Xmx768m, el proceso es el siguiente:

Hacemos un clic , con el botón izquierdo sobre el indicador de proyecto0001 y ahí se mostrara una lista donde se seleccionaremos gradle.properties:


y hacemos clic con el botón izquierdo a lo cual nos desplegara lo siguiente:

en el rect´angulo inferior solo modificamos el valor numérico, y para terminar con ello cerramos la ventana que se activo, cuadro rojo arriba, deber´an verificar en cada proyecto de Android este es un problema que se presenta en Windows x32.

En este punto debemos conectar el SmarthPhone para que se active y la ejecución se realice en el.

En algunas computadoras no se logra instalar correctamente el emulador porque deben de tener algunas características en el procesador como es caso de los procesadores AMD, para ello seguiremos algunos pasos para conectar el celular a Android Studio para que las aplicaciones que se desarrollen se ejecuten en el dispositivo:

Cómo instalar y usar ADB, la herramienta de puente de depuración de Android

ADB, Android Debug Bridge, es una utilidad de línea de comandos incluida con el SDK de Android de Google. ADB puede controlar su dispositivo a través de USB desde una computadora, copiar archivos hacia adelante y hacia atr´as, instalar y desinstalar aplicaciones, ejecutar comandos de shell y m´as.

Primer paso: configurar el SDK de Android.


Dirígete a la herramienta de Android SDK y usa " Tools ", y en SDK Manager que es un conjunto de herramientas que incluye ADB.

   Usamos el separador SDK Tools, asegúrese que Google USB driver este instalado, si no es asi activelo, y actualice

Inicie el Administrador de SDK EXE y revise la selección de todo, y  "Herramientas de Android SDK Platform".

Si est´a utilizando un teléfono Nexus, también puede seleccionar "Google USB Driver" para descargar los controladores de Google. Haga clic en el botón Instalar. Esto descarga e instala el paquete de herramientas de plataforma, que contiene ADB y otras utilidades.

Paso dos: habilite la depuración de USB en su teléfono

Para usar ADB con su dispositivo Android, debe habilitar una característica llamada depuración de USB.

Abra la caja de la aplicación del teléfono, toque el ícono de Configuración y seleccione "Acerca del teléfono". Despl´acese hasta el final y toque el ítem "Número de compilación" siete veces. Deberías recibir un mensaje que diga que ahora eres un desarrollador.

Regrese a la p´agina principal de Configuración, y debería ver una nueva opción cerca de la parte inferior llamada "Opciones de desarrollador". ´abralo y active "Depuración de USB"




M´as adelante, cuando conecte su teléfono a su computadora, ver´a una ventana emergente titulada "¿Permitir depuración de USB?" En su teléfono. Marca la casilla "Permitir siempre desde esta computadora" y toca Aceptar.


Paso tres: prueba ADB e instala los controladores de tu teléfono (si es necesario), puedes consultar la siguiente dieccion URL para obtener los Drivers para las diferentes marcas de equipos https://hexamob.com/es/descargar-drivers-para-android/

Abra la carpeta en la que instaló las herramientas SDK y abra la carpeta platform-tools. Aquí es donde se almacena el programa ADB. Normalmente se ene encuentra en la ruta  C:\Users\miguel\AppData\Local\Android\Sdk\platform-tools  (miguel puede cambiar por el usuario de la maquina) y escribimos adb devices, si no presenta dato alguno debebemos proceder con el paso siguiente:


Si su dispositivo est´a conectado pero no se aprecia nada en la lista, deber´a instalar los controladores apropiados.

El fabricante de su teléfono puede proporcionarle un paquete de controladores descargable para su dispositivo. Diríjase a su sitio web y encuentre los controladores para su dispositivo los HTC vienen como parte de un paquete llamado HTC Sync Manager . También puede buscar Desarrolladores XDA para descargas de controladores sin el software adicional.

También puede intentar instalar el controlador USB de Google desde la carpeta Extras en la ventana Administrador de SDK, como mencionamos en el primer paso. Esto funcionar´a con algunos teléfonos, incluidos los dispositivos Nexus.

Para cada celular puede ser diferente, para un celular LG se uso la siguiente pagina: https://www.lg.com/mx/soporte/software-firmware?keyword=LGX210G&search=LGX210G&superCateId=

y seguimos las indicaciones de la pagina, esto es diferente para cada celular y/o modelo.





Los dos archivos marcados son necesarios para conectar el celular con el Android Studio, se instalan en Windows y cuando ya estan listos en el celular nuestra un mensaje que deberemos aceptar para que hagan "conexión". Si todo salió bien, debería ver su dispositivo en la lista y ¡est´a listo para comenzar a usar ADB!, en ocasiones solicita actualizar el SO de celular acepten la actualización y procedan.

También podemos ejecutarlo como una emulación aquí es donde podemos tener algunas dificultades, la computadora deber´a tener 8 Gb de memoria RAM.

UN PROCESO QUE TENDRAS QUE REPETIR PARA CADA MOVIL NUEVO

Ahora iniciamos la aplicación, Run icono de color verde


y observamos que el dispositivo ya esta reconocido (También puede ser el nombre del celular, siempre y cuando el driver del celular sea el correcto, de otra manera instalar de nuevamente el driver, en ocasiones hay que reiniciar el equipo)


Asi se puede observar al inicio                                                                                         Cuando reiniciamos el equipo y procedemos de nueva cuenta

El proceso puede durar algunos minutos dependiendo de la velocidad de nuestra computadora.

Ahora ejecutamos nuestra aplicación en el botón OK,  y si todo esta bien veremos la aplicación en el celular ejecut´andose.

 


Proyecto0002

En este proyecto realizaremos el primer programa en andriod, la programación es muy similar a Java, pero no te preocupes daremos los elementos necesarios conforme se utilicen y no es difícil aprender esto.

NOTA: SE PRESENTARAN LOS PROYECTOS COMPROBADOS LOS RESULTADOS, SIN EMBARGO HABRA SITUACIONES DONDE SE PRESENTARAN ERRORES DE FORMA INTENSIONAL PARA EL ALUMNO ADQUIERA UN PENSAMIENTO CRITICO.

Para iniciar el proyecto es necesario saber de que se trata, como en todos los programas es necesario definir que necesitamos obtener como resultado así que el propósito de este programa es tener 2 números y sumarlos, parece f´acil y lo es, lo primero que necesitamos es realizar un diseño de como se "vera" el producto final si que te lo muestro, es la pantalla de captura de los datos (como producto intermedio):



Debemos de aprender a establecer las distancias entre los objetos para ello usaremos el panel del lado derecho indicando la distancia de los objetos, la distancia la establecernos en 8ds




dp  (Density-independent Pixels)

Es una unidad abstracta que se basa en la densidad física de la pantalla. Esta unidad es equivalente a un pixel en una pantalla con una densidad de 160 dpi. Cuando se est´a ejecutando en una pantalla de mayor densidad, se aumentan el número de pixels utilizados para dibujar 1dp según los dpi’s de la pantalla. Por otro lado, si la pantalla es de menor densidad, el número de píxeles utilizados para 1dp se reducir´an. Utilizar las unidades dp en lugar de píxeles es la solución m´as simple para tratar los diferentes tamaños de pantalla de los dispositivos.

sp (Scale-independent Pixels)

Esta unidad es como la anterior, pero se escala según el tamaño de fuente configurada. Se recomienda utilizar esta unidad si se especifican tamaños de fuente, por lo que se ajusta tanto para la densidad de pantalla y como a las preferencia del usuario.

pt (Points)

Es un 1/72 de una pulgada, según el tamaño físico de la pantalla.

px (Pixels)


Corresponde a un píxel real en la pantalla. Esta unidad de medida no se recomienda porque la representación real puede variar según el dispositivo en el que se ejecute, ya que cada uno de ellos puede tener un número diferente de píxeles por pulgada y pueden tener m´as o menos píxeles totales disponibles en la pantalla.


mm (Milímetros)
Son milímetros reales según el tamaño físico de la pantalla.


in (Pulgadas)
Son pulgadas reales según el tamaño físico de la pantalla.

  Aquí no se nombran apps ni programas, todo aquello que realizamos como proyecto (para nosotros) en Android se llama Activity (actividad).

Necesitamos usar 3 elementos llamados TextView, 2 Text number, y 1 Button, los 3 TextView son para colocar las etiquetas de texto que llamaremos en su ID (también llamado id, identificación del item, como lo identificarnos en el cuerpo del programa), tv1, tv2, tv3,  los campos de texto que llevaran estos TextView son: Introduce el primer Valor, Introduce el segundo Valor y Resultado, los Text Number "Edit Text" (que recibir´an los números) ser´an  et1 y et2, y no llevaran nombre, ya que recibir´an números, el proceso completo te lo describo en el siguiente vídeo:

Primera parte Proyecto0002

Ahora modificaremos el código XML MainActivity.java

El propósito es que la variables generadas se instancien (quiere decir que les sean asignadas los valores recibidos a cada una de la variables definidas previamente) et1, y et2, junto con tv3, las 2 primeras variables es donde se reciben los números y ser´an tratadas para la suma, y tv3 es donde ira el resultado de la suma, para ello necesitamos agregar la declaración de las variables, para ser instanciadas:

estas instrucción se realiza de la siguiente forma, después de: public class MainActivity extends AppCompatActivity {

Debemos de instanciar las variables con otros nombres a usar para la que tenemos en le proyecto sirvan de recepción y asignarla a otras para poder operar la suma.


public class MainActivity extends AppCompatActivity {
    private EditText num1,num2;
    private TextView text_v1;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

Aquí observara que se muestran unos indicadores de error EditText y TextView en color rojo que son indicativas de que hay errores, y se debe de corregir o agregar bibliotecas que incluyen estas instrucciones.

Veamos como se realiza esta operación:

1.- Llevar el curso sobre el texto en rojo, (que es la error de inicialización).

2.- En ese lugar presionar la tecla Alt  Enter, para que el sistema agregue las bibliotecas necesarias.

Video de proyecto0002 instanciar.

en las siguientes lineas agregaremos la programación de estos Items para que al presionar el Botón se sumes las cantidades.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        num1 = (EditText)findViewById(R.id.et1); // realiza un cast de texto a numero, busca el view por su id del item creado en el diseño
        num2 = (EditText)findViewById(R.id.et2); // realiza un cast de texto a numero, busca el view por su id del item creado en el diseño
        text_v1 = (TextView)findViewById(R.id.tv3); // se hace referencia al valor de resultado que es un TextView

    }

 // este metodo es para realizar la suma
    public void Sumar (View view){
       String valor1 = num1.getText().toString(); //se obtiene el valor de num1 para pasarlo a una variable tipo texto (String)
       String valor2 = num2.getText().toString(); //se obtiene el valor de num2 para pasarlo a una variable tipo texto (String)
      
       int numero1 = Integer.parseInt(valor1); // se comvierten  los Strings a numero
       int numero2 = Integer.parseInt(valor2); // se comvierten  los Strings a numero

       int suma = numero1 + numero2;   // se sumas los valores numericos

       String result = String.valueOf(suma); //el valor de la suma se convierte a String y la asigna a result
       text_v1.setText(result); // se asigna el resultado al TextView definido de forma inicial

}

Ya establecido esto debemos de regresar al diseño para darle atributos al botón



Recordemos que Sumar es el nombre del método creado anteriormente para realizar la operación, con ello realizamos la ejecución de la app

El desarrollo completo es:

package com.example.dell_windows81.proyecto0002; //esta linea sera diferente para cada computadora por lo que es complicado copiar el cogido a otra computadora

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity {

    private EditText num1,num2;
    private TextView text_v1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        num1 = (EditText)findViewById(R.id.et1);
        num2 = (EditText)findViewById(R.id.et2);
        text_v1 = (TextView)findViewById(R.id.tv3);

    }
   // este metodo es para realizar la suma
    public void Sumar (View view){
       String valor1 = num1.getText().toString();
       String valor2 = num2.getText().toString();

       int numero1 = Integer.parseInt(valor1);
       int numero2 = Integer.parseInt(valor2);

       int suma = numero1 + numero2;

       String result = String.valueOf(suma);
       text_v1.setText(result);
    }

}

Resultado de este proyecto


Proyecto0002a

Realizaremos otro proyecto basado en el uso los botones, para este proyecto usaremos 3 campos para recibir datos de calificaciones y realizar un promedio de estos, realizaremos un cambio pondremos los textos dentro de lo campos de captura evitando colocar textos adicionales.


Usaremos de nuevo los valores establecidos por Android Studio, y comenzamos el diseño que necesitamos para la Activity, agregaremos otras características el valor hide, que permite mostrar un texto dentro del ´area de captura y que cuando se introduce el valor este se oculta:

Diseño Proyecto0002a

tenemos los siguientes Items:

Realizamos la programación para esta Activity (en el TextView modificamos el ID, de ser tv_estatus, lo modificamos a tv_status)

package com.example.miguel.proyecto0002a;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private EditText et1,et2,et3; // para cada campo de datos a usar
    private TextView tv1; // donde mostrara el resultado

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //recuperamos la datos que se han introcucido en los campos EditText
        et1 = (EditText)findViewById(R.id.txt_matematicas); //recuperado y almacenado en et1
        et2 = (EditText)findViewById(R.id.txt_fisica); //recuperado y almacenado en et2
        et3 = (EditText)findViewById(R.id.txt_quimica); //recuperado y almacenado en et3
        tv1 = (TextView)findViewById(R.id.tv_status); //recuperado y almacenado en tv1
        // (R.id.<variable>) La R indica que realice una conexión (puente) entre xlm y java, id es la identificación del
        // item en xlm, y el nombre de la variable que ase asigno

      }
      // realizamos el metodo que dispara el evento, este debera estar fuera de onCreate, para que se allmado de forma
      // independiente cuando sea necesario
      //public para que sea visto de forma general, void no regresa valor solo lo ejecuta
      // estatus es solo un nombre para identificar el método (View) es es el par´ametro
      // que recibe, (debe de recibir algo en esto caso la vista de los datos)


      public void estatus (View view){
        //creamos espacio para memoria
          // getText recupera valor de et1 (getText()) y lo pasa a String (toString()) y lo asigna a Matematicas_String
          // como variable String

          String Matematicas_String = et1.getText().toString();
          String Fisica_String = et2.getText().toString();
          String Quimica_String = et3.getText().toString();
          // realizamos un parse significa que pasamos de String a numero para poder operar los valores
          // necesitamos crear variables numericas para este caso de tipo entero (int)
          int Matematicas_int = Integer.parseInt(Matematicas_String);
          int Fisica_int = Integer.parseInt(Fisica_String);
          int Quimica_int = Integer.parseInt(Quimica_String);

          // realizamos el promedio de los 3 valores de tipo entero por lo cual se recibe de igual forma
          int promedio = (Matematicas_int+Fisica_int+Quimica_int)/3;
          if(promedio => 6){
              tv1.setText("Estatus Aprobado con " + promedio); //si el valor es mayor o igual a 6 mostrara Estatus Aprobado
                                                                                               // concatenado el valor del promedio
              }
              tv1.setText("Estatus Reprobado con " + promedio);
         
      }

Lo que nos queda es indicar que Item de botón se asocie con el metodo estatus, es decir cuando se haga clic (o presionar) el boton realize el metodo:

   

package com.example.miguel.proyecto0002a;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private EditText et1,et2,et3; // para cada campo de datos a usar
    private TextView tv1;          // donde mostrara el resultado

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //recuperamos la datos que se han introcucido en los campos EditText
        et1 = (EditText)findViewById(R.id.txt_matematicas); //recuperado y almacenado en et1
        et2 = (EditText)findViewById(R.id.txt_fisica);            //recuperado y almacenado en et2
        et3 = (EditText)findViewById(R.id.txt_quimica);        //recuperado y almacenado en et3
        tv1 = (TextView)findViewById(R.id.tv_status);          //recuperado y almacenado en tv1
        // (R.id.<variable>) La R indica qu realize una conexion (puente) entre xlm y java, id es la identificacion del
        // item en xlm, y el nombre de la variable que ase asigno

      }
      // realizamos el metodo que dispara el evento, este debera estar fuera de onCreate, para que se allmado de forma
      // independiente cuando sea necesario
      //public para que sea visto de forma general, void no regresa valor solo lo ejecuta
      // estatus es solo un nombre para identificar el metodo (View) es es el parametro
      // que recibe, (debe de recibir algo en esto caso la vista de los datos)


      public void estatus (View view){
        //creamos espacio para memoria
          // getText recupera valor de et1 (getText()) y lo pasa a String (toString()) y lo asigna a Matematicas_String
          // como variable String

          String Matematicas_String = et1.getText().toString();
          String Fisica_String = et2.getText().toString();
          String Quimica_String = et3.getText().toString();
          // realizamos un parse significa que pasamos de String a numero para poder operar los valores
          // necesitamos crear variables numericas para este caso de tipo entero (int)

          int Matematicas_int = Integer.parseInt(Matematicas_String);
          int Fisica_int = Integer.parseInt(Fisica_String);
          int Quimica_int = Integer.parseInt(Quimica_String);

          // realizamos el promedio de los 3 valores de tipo entero por lo cual se recibe de igual forma
          int promedio = (Matematicas_int + Fisica_int + Quimica_int)/3;

          String promedio1 = String.valueOf(promedio);
          String estado1 = "Estatus alumno aprobado ";
          String estado2 = "Estatus alumno reprobado";

          // la instrucción if evalúa la condición si es verdadera se ejecuta lo del primer { }
          // si es falso se puede evaluar con la instrucción else y se ejecuta lo que esta en {}

          if (promedio >= 6 ){
              tv1.setText(estado1 + promedio1);
          } else {
              tv1.setText(estado2 + promedio1);
          }

          }
}

se puede modificar la parte de la desición de esta otra forma:

   String promedio1 = String.valueOf(promedio);

           // la instrucción if evalúa la condición si es verdadera se ejecuta lo del primer { }
          // si es falso se puede evaluar con la instrucción else y se ejecuta lo que esta en {}

          if (promedio >= 6 ){
              tv1.setText("Estatus alumno aprobado " + promedio1);
          } else {
              tv1.setText("Estatus alumno reprobado " + promedio1);
          }

En este ejemplo proyecto0002a hay un error de visualización del resultado que puedes hacer para corregirlo ?

Hardcoded string

Cuando se trabaja un proyecto hay algunos mensajes de Warnings (Precaución), estos solo son avisos, sin embargo podemos corregirlos que es lo adecuado, para revisar estos errores debemos de revisar la siguiente sección :

 


Observemos que hay 5 indicadores de Warnings, vamos a corregir estos mensajes, podemos dejarlos así y funciona de forma correcta, pero la corrección de estos mensajes no produzcan código erróneo en nuestra activity, ello demostrara que deseamos hacer correctamente nuestro diseño. Es decir las advertencias nos indican que hay ciertas incongruencias de los textos, debemos conocer que estos elementos est´an presentes en la app final, y estos quedan representados en strings.xml.

Para corregir estos mensajes, hay varios métodos para ello, haremos el proceso sencillo, pero veremos como se van corrigiendo en la secciona de los archivos string.xml de esto:

HardCode

El final de nuestra activity

proyecto0003

Controles RadioGroup y RadioButton

Realizaremos el ingreso de dos valores y estos podr´an se sumados o restados, activado el RadioButton que sea necesario y usando un control Button evaluar la condición del RadioButton presentar el resultado según se selecciono el botón de suma o resta.

Haremos como siempre, en primer lugar el diseño, indicaremos como crear un RadioGroup y los RadioButton.

Definimos los ID de los Items:

Item                    ID                                 Contenido
EditText --------  txt_valor1 ------------  hide Ingresa el primer valor
EditText -------   txt_valor2 ------------- hide Ingresa el segundo valor
RadioButton --- rb1 ---------------------- Text Sumar
RadioButton --- rb2 ---------------------- Text Restar
Button ---------- "      "    ----------------- Text CALCULAR
TextView ------- txt_resultado ---------- Text Resultado

Hay un error en el diseño, observa correctamente las contenidos y corrige el error presentado, en el siguiente vídeo esta de forma intencional.

Proceso de diseño en proyecto0003

La parte logica es la siguiente:

public class MainActivity extends AppCompatActivity {
    private EditText et1,et2;                   //declaramos variables privadas de EditText
    private TextView tv1;                      // declaramos variavles privadas de TextView
    private RadioButton rb1,rb2;          //declaracion de estas 2 variables de RadioButton es porque se puede seleccionar cualquiera de ellos
                                                            // para la suma o la resta


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // localizamos los valores de los items y se asignan a nuevas variables atravez de R.id
        et1 = (EditText)findViewById(R.id.txt_valor1);
        et2 = (EditText)findViewById(R.id.txt_valor2);
        tv1 = (TextView)findViewById(R.id.txt_resultado);
        rb1 = (RadioButton)findViewById(R.id.rb_sumar);
        rb2 = (RadioButton)findViewById(R.id.rb_restar);

    }
    // Metodo para el boton EVALUAR
    public void Evaluar(View view){
        String valor1_string = et1.getText().toString();
        String valor2_string = et2.getText().toString();

        int valor1 = Integer.parseInt(valor1_string);
        int valor2 = Integer.parseInt(valor2_string);

        //selecion del radiobutton si se realiza check este devolvera un valor booleano
        if(rb1.isChecked() == true){
        int suma = valor1+valor2;
        String resultado = String.valueOf(suma);
        tv1.setText(resultado);
        }
        if (rb2.isChecked() == true){
        int resta = valor1 - valor2;
        String resultado = String.valueOf(resta);
        tv1.setText(resultado);
        }

    }


Ya teniendo la parte lógica ya podemos asignar el botón el evento onClick


En este instante se observa la posibilidad de agregar este botón a MainActivity.java, seleccionamos Evaluar [MainActivity].

Que hace referencia a:

  // Metodo para el boton EVALUAR
    public void Evaluar(View view){
        String valor1_string = et1.getText().toString();
        String valor2_string = et2.getText().toString();

Resultado de este proyecto

Ejercicio practico:

Realizar una App que reciba 2 valores de tipo entero, para que realice: suma, resta, multiplicación y división, usando el modelo del proyecto anterior, y establecer el nombre de esta Activity como: ejpr1 (ejercicio practico 1), al final deberías de mostrar tu ejercicio para ser evaluado por el instructor

proyecto0004

Control Check

Es similar al proyecto anterior pero usando el control Check, lo cual tiene una característica que pudedes usar uno o mas check, por ejemplo sumar o restar, o bien sumar y restar al mismo tiempo:

Diseño proyecto0004

El código completo  MainActivity.java es:

package com.example.dell_windows81.proyecto0004;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private EditText et1,et2;
    private CheckBox check1, check2;
    private TextView tv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et1 = (EditText)findViewById(R.id.txt_valor1);
        et2 = (EditText)findViewById(R.id.txt_valor2);
        check1 = (CheckBox)findViewById(R.id.chk_bx1);
        check2 = (CheckBox)findViewById(R.id.chk_bx2);
        tv1 = (TextView)findViewById(R.id.text_v);
        }
        //metodo para el calculo de los valores
        public void Evaluar (View view){
        String valor1 = et1.getText().toString();
        String valor2 = et2.getText().toString();

        int valor_1 = Integer.parseInt(valor1);
        int valor_2 = Integer.parseInt(valor2);

        String resultado =""; // es para eliminar el valor anterior para no interferir con el nuevo calculo

        if(check1.isChecked()== true){
            int suma = valor_1 + valor_2;
            resultado = "La suma es "+suma+" / ";
        }
        if(check2.isChecked() == true){
            int resta = valor_1 + valor_2;
            resultado = resultado + "La resta es "+resta;
        }
           tv1.setText(resultado);
        }
}

Antes de ejecutar / Instalar la app hay que asignar al botón EVALUAR la propiedad, onClic para que sea efectiva la aplicación.


proyecto0005:

Control Spinner

Spinner lo que hace es mostrar una lista desplegable para que elijamos un elemento. Si en tu app quieres implementar este comportamiento, lo vas a necesitar.

Ejemplo de Control Spinner

Para agregar el control spinner se seleciona la paleta Conteiners -- spinner:

 

Damos las distancias entre los items



Asignar los ID



el control spinner y el control button se quedan sin cambios

en el archivo de strings.xml es para asignar las etiquetas a los items, se reliza de forma mas eficiente y rapido que ir ajustando cada elemento, para ello usaremos la secuencia app -> res -> values -> strings.xml


el codigo es:

<resources>
    <string name="app_name">proyecto0005</string>
    <string name="txt_valor1">Primer Valor</string>
    <string name="txt_valor2">Segundo Valor</string>
    <string name="Button">Calcular</string>
    <string name="tv_resultado">Resultado</string>
</resources>


Asignamos los valores a los items, en los campos se usa la secuencia de teclas Ctrl  Espacio (barra espaciadora)







Asignamos el tamaño de 24sp a los controles


En este proyecto el control spinner solo se realiza desde la parte lógica (Programa), solo es posible hacerlo desde ahí.

package com.example.dell.proyecto0005;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Spinner spinner1; //agregar la clase spinner con import (Alt - Enter) import android.widget.Spinner;
    private EditText et1,et2;
    private TextView tv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et1 = (EditText)findViewById(R.id.txt_valor1);
        et2 = (EditText)findViewById(R.id.txt_valor2);
        tv1 = (TextView)findViewById(R.id.tv_resultado);

        spinner1 = (Spinner)findViewById(R.id.spinner); // spinner es el id del control spinner del diseño
        // agregamos un arreglo matricial para acomodar todos los datos, por defecto
        // se pueden usar hasta 10 elementos (0 -9) sin declarar el tamaño de estos.
        // la forma de crear un arreglo unidimencional es

        String [] opciones = {"Sumar","Restar","Multiplicar","Division"}; //crea un arreglo de 4 elementos de texto
        // con el nombre opciones y conectamos este arreglo con el control spinner
        ArrayAdapter <String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, opciones);
        // con esto creamos un objeto llamado adapter (puede der otro nombre) toma el valor usado, acomodamndolos con simple_spinner_item
        // secoloca el objeto en spinner1

        spinner1.setAdapter(adapter);
    }
    // metodo del boton para calcular la opcion selecionada
    public void Calcular (View view){
        String valor1 = et1.getText().toString();
        String valor2 = et2.getText().toString();

        int val1 = Integer.parseInt(valor1);
        int val2 = Integer.parseInt(valor2);

        String seleccion = spinner1.getSelectedItem().toString();  //toma el valor de spinner1
        if(seleccion.equals("Sumar")){
            int suma = val1 + val2;
            String resultado = String.valueOf(suma);
            tv1.setText(resultado);
        }
        if(seleccion.equals("Restar")) {
            int resta = val1 - val2;
            String resultado = String.valueOf(resta);
            tv1.setText(resultado);
        }
        if(seleccion.equals("Multiplicar")) {
            int multiplicar = val1 * val2;
            String resultado = String.valueOf(multiplicar);
            tv1.setText(resultado);
        }
        if(seleccion.equals("Division")) {
            if (val2 != 0) {   // != evalúa si no es el valor, si es 0 (cero) pasa a la instrucción else mostrando el mensaje de advertencia con Toast
                int division = val1 / val2;
                String resultado = String.valueOf(division);
                tv1.setText(resultado);
            } else {
                Toast.makeText(this, "No se puede dividir entre 0", Toast.LENGTH_LONG).show();
                // Toast realiza mensajes de advertencia
            }
        }

    }

}

Para finalizar asignamos el boton calcular sobre el evento onClic




Modificar el proyecto0005

Modificar el control Spinner donde crearemos un archivo xlm, y este sera sustituido en MainActivity.java donde hace referencia al control, y con ello crearemos un diseño especifico, con tamaño, color.

Primeramente debemos acceder a la siguiente sección app >res > layout > activity_main.xml de nuestro proyecto0005

   

Selecciona layout y realiza un clic con el botón derecho mostrando un menú donde dice New, y de ahi a Layout resource file:



Seleccionamos Layout resource file y hacemos clic en el lo que mostrara un cuadro de dialogo que es una ventana de creación de archivos xml, poniendo un nombre en el campo File name: puede ser cualquier nombre, pero para poder relacionar a lo que necesitamos ponemos spinner (ejemplo)




con ello establecido solo hacemos clic en OK, llevando a la pantalla principal, seleccionamos spinner_item.xml



Debemos de borrar las lineas desde la segunda solo quedando

<?xml version="1.0" encoding="utf-8"?>



Agregamos las siguientes lineas

<?xml version="1.0" encoding="utf-8"?>
<TextView
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:textSize="24sp"
    android:padding="10sp"
    android:textColor="#2e7fd1"
    xmlns:android="http://schemas.android.com/apk/res/android" />


andrid:layout_height="wrap_content"  se refiere a la altura de la opcion y "warp_content" se ajusta a la altura con respecto a los demas items

android:layout_width="match_parent" se refiere a la distancia del ancho del control y sera simpre el mismo no cambia.


Proceso para agregar codigo

Ahora modificamos ActivityMain.java para incluir este código y mejorar la apariencia de spinner

esta linea es la original:

 ArrayAdapter <String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, opciones);

se borran las instrucciones android y simple_spinner_item al agregar el punto después de layout se activa la lista de xml disponibles donde esta spinner_item.

y la instruccion simple_spinner_item que es el valor por defecto que usa Android Studio, sera cambiada por el codigo creado con spinner_item.

la modificamos a lo siguiente, R.layout.spinner_item, para ello colocamos el cursor despues de R.layout y agregamos el "." y la secuncia Ctrl Espacio donde veremos spinner_item y este es agregado a la secuencia.



al final queda asi:


Ejecute la activity y ve el resultado

proyecto0006:

Control ListView

El control ListView a diferencia del Spinner que se cierra luego de seleccionar un elemento, ListView permanecen visibles varios elementos (se lo utiliza cuando hay que mostrar muchos elementos)

Si la lista no entra en el espacio que hemos fijado para el ListView nos permite hacer scroll de los mismos.

Ejemplo del proyecto0006

Comenzaremos por incluir un TextView y ListView esta en el apartado Legacy (Legado), para el TextView el ID es tv1, y para ListView es lv1.





Podemos apreciar que se genera un cuadro donde se acomodan los items que contendr´a la lista, y se generan sin indicación adicional, ahora realizaremos los cambios sobre el código directamente para los elementos que componen la activity, nos dirigimos a app > res > values > strings.xml.



Donde agregaremos en la tercer posición la siguiente etiqueta:

 <string name="TextView">Selecciona un nombre</string>

Quedando así:


Esto es equivalente a colocar el nombre del campo en la vista de diseño

Podemos cerrar el separador strings.xml

Hay que realizar el ajuste de los elementos de la activity.



Para asociar el nombre con TextView buscamos text  y presionamos la secuencia Ctrl (Espacio)



donde se mostrara lo siguiente



donde seleccionamos @string/TextView, y el contenido realizado en strings.xml sera actualizado en el Item de TextView en nuestro diseño




A nuestro item actualizado cambiarle el tamaño del texto a 18sp.



Ahora crearemos un nuevo archivo tipo xml tal como el proyecto pasado para darle las propiedades de este en el archivo, la secuencia es app > layout  hacer clic botón derecho y New > Layout resouce file




lo que nos lleva a:



Como se observa establecemos el nombre : list_item_p0006, que sera el nombre de este nuevo layout para asignar las propiedades, en el separador que se creo un diseño y el código, seleccionamos Text y veremos lo siguiente (list_item_p0006):



borraremos desde la segunda linea al final, quedando únicamente esto: <?xml version="1.0" encoding="utf-8"?> agregando desde la segunda linea lo siguiente:


<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#073059"
    android:textSize="24sp"
    android:padding="10sp"
    android:textColor="#ffffff"
    xmlns:android="http://schemas.android.com/apk/res/android" />

Aquí vemos el proceso para realizarlo

Pasemos a MainActivity.java para realizar la programación para la activity

package com.example.dell_windows81.proyecto0006;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView tv1;
    private ListView lv1;
    // formamos arreglos de igual tamañao para que sean uno a uno la relacion de datos 9 nombres con 9 edades
    private String nombres [] = {"Samuel","Angelina","Gabriela","Silvia","Guadalupe","Margarita","Josefina","Cynthia","Daniela"};
    private String edades [] = {"18","50","48","52","55","60","50","24","20"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv1 = (TextView)findViewById(R.id.tv1);
        lv1 = (ListView)findViewById(R.id.lv1);

        ArrayAdapter <String> adapter = new ArrayAdapter<String>(this,R.layout.list_item_p0006,nombres);
        lv1.setAdapter(adapter);

        lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() { //para realizar el proceso solo escriban lv1.setOnI y completara lo demas
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            tv1.setText("La edad de "+ lv1.getItemAtPosition(i)+ " es "+ edades[i]+ " años");
            }
        });
    }
}

Ejecute la activity y vea el resultado en su celular.

proyecto0007

Usaremos ImageButton, este control es para asociar una imagen (contenida en un botón) con un evento, para ello es necesario tener previamente una imagen que contenga ciertas características que son las siguientes:


La imagen que se necesita para esto contendría un tamaño de 50 x 50 pixeles (largo y ancho).

Los nombres de la im´agenes siempre deber´an estar en minúsculas (imagem1.jpg , image2.png) los tipos de im´agenes deber´an ser jpg o png solo se reconocen estos tipos.


Teniendo en cuenta estos elementos iniciaremos descargando las im´agenes puede ser de Internet, cualquier imagen, para el tamaño debemos realizar el ajuste necesario para ello usaremos Photoshop CS6, a continuación un vídeo que muestra como realizarlo.

Ajuste tamaño im´agenes

En este punto pasaremos estas im´agenes al directorio del proyecto0007 para que sean incluidas esto lo realizaremos con el Explorador de Archivos de Windows.

Copia de im´agenes al directorio del proyecto0007

En el nuevo proyecto usamos el siguiente control, ImageButton que esta en Buttons, llevamos este control al ´area de trabajo



y en cuanto lo soltemos nos presentara (tarda unos segundos) un cuadro con 3 diferentes secciones



En la primer sección (hacer clic en el tri´angulo de Project) debemos observar algo similar a esto



Se puede apreciar que se incluyen las 2 im´agenes que pasamos al directorio y que son de 50x50 pixeles. seleccionamos la primera, y clic en el botón OK


y nos mostrara lo siguiente



con lo que hemos agregado ImageButton con la imagen que nos interesa, y realizamos el segundo botón, con lo que se vera asi:



pasemos a la vista donde daremos la distancias y se podría ver de esta manera



Nos regresamos al diseño (Desing) y procedemos a colocar el: contentDescription ya que estar´a mostrado Warning así que colocamos para el primer botón Info1 y para el segundo Info2, esto es solo de asignación de nombres aunque esto no lo veremos como resultado de la Activity



y revisamos los Warnings y los corregimos



y lo realizamos apara ambos botones.

Ahora pasamos a la parte lógica (Programa) donde


realizaremos 2 métodos uno para Info1 y otro para Info2

con la instrucción Toast que se uso anteriormente



Por ultimo tenemos que asociar el evento de onClic para cada botón:

 

El código esta aquí:

package com.example.dell_windows81.proyecto0007;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       }
       // tengase en cuenta que los metodos van fuera de onCreate
    //metodo para el primer boton Info1
    public void info1(View view){
        Toast.makeText(this,"Estoy programando en andriod",Toast.LENGTH_SHORT).show();
    }
    // metodo para el segundo boton Info2
    public void info2(View view){
        Toast.makeText(this,"CE.CA.T.I 89 Andriod",Toast.LENGTH_SHORT).show();
    }
}

proyecto0008

En este proyecto crearemos una activity donde se desarrollara una entrada de datos con un nombre y un password, donde ser´an evaluados los campos que posean información, si no contienen información se mostrara un mensaje donde solicita que se ingrese la información, formemos el proyecto0008.

Como se vera el proyecto0008

Iniciaremos ubicando  PlainText y Password que estna en la categoría de Text



Arrastramos los controles anteriores  y un button al ´area del activity.



Para el primer Item de tipo TextPlain (Texto plano), su Id es txt_nombre, y para el item password su id es txt_password, como se aprecia en la imagen anterior

Para button el nombre es REGISTRAR

Corrija las asignaciones campo y ajusta las distancias de los items usando el ´area de Blueprint, después ajusta el tamaño de los 3 items a 24sp, luego prosigamos con el código.

package com.example.dell_windows81.proyecto0008;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private EditText etn,etp; // etn EditText n nombre , etp EditText p password

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        etn = (EditText)findViewById(R.id.txt_nombre);
        etp = (EditText)findViewById(R.id.txt_password);
        }
        //Metodo para el boton

    public void Registrar (View view){
       String nombre = etn.getText().toString();
       String password = etp.getText().toString();

       // evaluamos si los strings contienen algun texto y si no mostramos un texto con Toast

        if(nombre.length()==0){ // examina a nombre en su longitud si es 0 no hay texto
            Toast.makeText(this,"Debes ingresar un nombre",Toast.LENGTH_LONG).show();
            }
        if(password.length()==0){// examina a password en su longitud si es 0 no hay texto
            Toast.makeText(this,"Debes ingresar un password",Toast.LENGTH_LONG).show();
        }
        if(nombre.length() !=0 && password.length() !=0){ //si ambos nombre y password contienen algo comienza el acceso y verificación
            Toast.makeText(this,"Procesando acceso espere ...",Toast.LENGTH_LONG).show();
        }
    }
}

Terminado el codigo regresemos al diseño y asignemos el botón REGISTRAR  al evento onClic


Realice la ejecución del app y ve el resultado en su celular



REFERENCIAS

proyecto0001:
http://developer.android.com/guide/topics/fundamentals/activities.htm
http://developer.android.com/guide/topics/intents/intents-filters.html
http://developer.android.com/guide/topics/ui/index.html
http://developer.android.com/guide/topics/fundamentals/services.html
https://bitbucket.org/nbandroid/nbandroid/wiki/Installation#markdown-header-how-to-install
http://www.oracle.com/technetwork/java/embedded/javame/javame-sdk/downloads/javamesdkdownloads-2166598.html
https://translate.google.com.mx/translate?hl=es&sl=en&u=https://www.howtogeek.com/125769/how-to-install-and-use-abd-the-android-debug-bridge-utility/&prev=search
http://cup-coffe.blogspot.com/2009/04/crear-un-pequena-aplicacion-para.html
proyecto0002:
https://es.stackoverflow.com/questions/57616/elementos-amontonados-android-studio
http://jonsegador.com/2012/09/diferentes-unidades-de-medida-disponibles-en-android-dp-sp-pt-px-mm-in/
http://www.aprendeandroid.com/l3/fundamentos_bucles.htm
proyecto0003:
https://androidstudiofaqs.com/tutoriales/usar-radiobutton-android
proyecto0004:
https://androidstudiofaqs.com/tutoriales/checkbox-android-studio
proyecto0005:
https://androidstudiofaqs.com/tutoriales/usar-spinner-android-studio
https://danielme.com/2013/04/25/diseno-android-spinner/
proyecto0006:
https://developer.android.com/guide/topics/ui/layout/listview?hl=es-419
http://www.vogella.com/tutorials/AndroidListView/article.html#exercise_listsactivity_simple
http://www.vogella.com/tutorials/AndroidListView/article.html#resources_listview
proyecto0007
https://www.movilzona.es/tutoriales/android/desarrollo/curso-de-desarrollo-android-tema-19-como-asignar-una-imagen-a-un-boton-con-imagebutton-en-android-studio/
proyecto0008
https://es.stackoverflow.com/questions/27355/mostrar-contrase%C3%B1a-edittext
https://www.nosinmiubuntu.com/creando-nuestro-sistema-de-registro-y/