Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Casidiablo en 10 Junio 2010, 22:28 pm



Título: Introducción a la programación con Android
Publicado por: Casidiablo en 10 Junio 2010, 22:28 pm
Me da algo de nostalgia volver preparar un post para este sub foro al que tanto le tengo aprecio. Hace ya más de un año que no soy usuario activo del foro en general, pero esta es la única comunidad de la cual me siento parte, así que me complace estar por aquí de nuevo.

En este caso va un post de introducción a la programación con Android (que es básicamente programación en Java), que es básicamente una adaptación de todos las entradas que he hecho en mi página personal recientemente. Android es un sistema operativo que tiene una acogida cada vez mayor y que, según mi opinión, es el futuro del desarrollo de aplicaciones para dispositivos móviles. Así que ahí va un nuevo aporte después de tanto tiempo...

Introducción a la programación con Android

Android es un estupendo sistema operativo para dispositivos móviles basado en Linux, y que nos proporciona un completo SDK para desarrollar nuestras propias aplicaciones de una manera rápida y divertida.

En esta sección aprenderemos a instalar/configurar el SDK y el plugin para Eclipse.  Haremos el típico Hola Mundo, y explicaré un poco sobre la metodología de programación para esta plataforma. ¡Manos a la obra!

1. Instalar y configurar el SDK de android

Vamos a la página del Android SDK (http://developer.android.com/intl/de/sdk/index.html) y descargamos la versión para nuestro sistema operativo. Yo uso Gentoo Linux, pero los pasos son prácticamente idénticos en Windows y en Mac. La última versión al escribir esta entrada es android-sdk_r06. Una vez que hayamos descargado el archivo, lo descomprimimos, entramos a la carpeta que se crea y ejecutamos (en Linux):

Código:
tools/android

En Windows:

Código:
SDK Setup.exe

Veremos algo como esto:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/Pantallazo-Android-SDK-and-AVD-Manager-.png)

Hacemos clic en Available packages y desplegamos el árbol que aparece bajo Sites, Packages and Archives para instalar el API sobre la(s) que deseamos trabajar, y una vez la(s) hayamos seleccionado hacemos clic en Install Selected. En este caso he seleccionado el API 7 (para la versión 2.1 de Android), la documentación del API 7, los ejemplos del API 7 y el SDK del API 4 (para la versión 1.6 de Android). Es importante elegir las APIs adecuadas teniendo el cuenta el tipo de dispositivo para el que estamos desarrollando la aplicación. Escogí en este caso el API 4 puesto que el equipo sobre el que pruebo los programas (HTC Tattoo (http://www.htc.com/www/product/tattoo/overview.html)) viene con Android 1.6 (Donut) [más información sobre las versiones y sus codenames (http://mundogeek.net/archivos/2010/03/19/versiones-de-android/)]. Por supuesto, si desarrollas con el API 4 tus programas tienen un 98% de probabilidades de correr sobre las versiones más recientes de Android sin modificación alguna.

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/Pantallazo-Android-SDK-and-AVD-Manager-1.png)

Una vez haya terminado de descargar e instalar las APIs podemos crear un dispositivo virtual sobre el que probaremos nuestras aplicaciones. Hacemos clic en Virtual Devices al lado izquierdo, luego sobre el botón New… y configuramos el dispositivo:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/nuevo-android.png)

Como puede apreciar en la imagen de arriba, debe poner un nombre al dispositivo, seleccionar el API sobre el que va a trabajar, darle un tamaño a la memoria ROM, escoger un tipo de pantalla y algunas configuraciones avanzadas que no se tratarán en este tutorial. Una vez tengamos esto, hacemos clic en Create AVD y si todo sale bien veremos algo como esto:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/Pantallazo-Android-Virtual-Devices-Manager-.png)

2. Instalar y configurar el plugin para Eclipse

Para este paso, necesitaremos Eclipse 3.5 (Galileo, recomendado) o 3.4. Abrimos eclipse, vamos a la Window -> Install New Software

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/new-software.png)

Hacemos clic en el botón Add… para añadir el repositorio de Android ( https://dl-ssl.google.com/android/eclipse/ ):

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/add.png)

Clic en OK y ahora seleccionamos los plugins a instalar, y seguimos el proceso de instalación:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/Pantallazo-Install-.png)

Una vez instalado, reiniciamos Eclipse y veremos que se han añadido algunos iconos extra en la barra de herramientas, y que además podemos crear proyectos para Android.

3. Hola Mundo en Android

Ahora vamos a crear un nuevo proyecto y aprender un poco más sobre cómo funcionan las aplicaciones para Android.  Hacemos clic en el botón de creación de proyectos Android (o File… -> New Project -> Android Proyect):

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/nuevo-proyecto-android.png)

Veremos el asistente de creación de proyectos para Android en donde debemos especificar: el nombre del proyecto (HolaParce), el API para el que vamos a desarrollar (1.6 en este caso), el nombre de la aplicación (Hola Parce en este caso), el nombre del paquete (se recomienda que sea un paquete nombrado con el estándar de Java, es decir, un dominio invertido), seleccionamos Create Activity y le damos un nombre (que cumpla las especificaciones de un nombre de clase en Java), y por último seleccionamos la versión mínima del API que deberán tener los dispositivos que corran nuestro aplicativo:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/android-parce.png)


¡Clic en Finish y listo! Ahora podemos probar la aplicación… hacemos clic derecho sobre el Proyecto, seleccionamos Run as… -> Android Application. Se cargará el emulador y después de un par de minutos podremos ver nuestra aplicación:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/Pantallazo-5554Pruebas.png)

4. Entendiendo el funcionamiento básico de las aplicaciones en Android

Las aplicaciones en Android funcionan bajo el esquema de “Actividades”. Una actividad presenta una interfaz gráfica (escrita en XML) que permite al usuario interactuar con la aplicación. Cada aplicación tiene varias actividades que se van mostrando al usuario según este las vaya necesitando. Una actividad llama a otra cuando sea necesario, y cada una de las actividades que se vayan mostrando se almacenan en una pila; es decir, cada vez que la aplicación lo requiera inserta una nueva actividad en la pila y, cuando esta ya no se necesite, se hace un push sobre esta lo cual deja en descubierto la actividad que estaba debajo. Importante leer esto para tener claro cada uno de los aspectos fundamentales de las aplicaciones Android (http://developer.android.com/intl/de/guide/topics/fundamentals.html).

Ahora, veremos detalladamente qué ocurrió en los pasos que seguimos arriba. Por ejemplo, al crear el proyecto se generan algunos archivos automáticamente. Veamos que hace cada uno de ellos…

Dentro del directorio res se han creado algunos subdirectorios:

  • drawable-hdpi, drawable-mdpi, drawable-ldpi en donde se almacenan las imágenes que va a utilizar nuestra aplicación. La diferencia entre ellas es que debemos colocar las imágenes que aparecerán según el tipo de pantalla del dispositivo. En drawable-hdpi se colocarán las imágenes para dispositivos con alta resolución (High) y en drawable-ldpi (Low) pondremos las imágenes para dispositivos con pantallas pequeñas.
  • values contiene inicialmente el archivo strings.xml, que es donde declaramos las cadenas de texto que usará nuestra aplicación. No es obligatorio definir todas las cadenas de texto allí, pero es bastante recomendable hacerlo. En este caso simplemente contiene la definición de una cadena de texto (llamada hello), que es la que se muestra al ejecutar la aplicación:
Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string name="hello">Hello World, HolaParce!</string>
  4. <string name="app_name">Hola Parce</string>
  5. </resources>

  • layout contiene los archivos XML que representan interfaces gráficas. Si echamos un vistazo al archivo generado (main.xml) veremos algo como esto:

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/hello"
  11. />
  12. </LinearLayout>
  13.  

  • Los layouts son XML estrictos, así que deben comenzar con el encabezado <?xml version="1.0" encoding="utf-8"?> y todas las etiquetas abiertas deben ser debidamente cerradas.
  • Los LinearLayout representan contenedores de widgets (algo similar al JPanel de swing en Java). Es decir, es la manera de organizar cada grupo de elementos de la interfaz gráfica.
  • En este caso, dentro del contenedor solo tenemos un TextView (que sería algo así como un JLabel de swing en Java).
  • Sea cual sea el elemento que pongamos en el layout, debemos especificar su anchura (android:layout_width) y altura (android:layout_height). Para cada parámetro podemos usar el valor fill_parent o wrap_content. fill_parent hará que el widget ocupe todo el tamaño posible, mientras que wrap_content hará que ocupe el menos posible.
  • El parámetro android:text permite asignar un texto al TextView. En este caso se usa @string/hello que indica que se usará una variable llamada hello. Esta variable puede ser encontrada en el archivo strings.xml dentro del directorio values. También podríamos especificar el texto directamente, por ejemplo: android:text="Hola parcero!"
  • Como tal vez se dio cuenta, es posible editar los archivos XML gráficamente o con el editor de textos de Eclipse.

    Dentro del directorio gen se encuentra un archivo llamado R.java. Este archivo NO debemos modificarlo ya que es Eclipse quien se encarga de poner el código allí dentro. Este archivo sirve básicamente para enlazar las cosas que hagamos en XML con la programación en Java. Por ejemplo, se crea una referencia a la variable hello creada en el archivo strings.xml. Esto permite que podamos referenciar dicha variable desde Java (esto se explica con más detalle abajo).

    Bajo el directorio src se creó un paquete y dentro de él un archivo en Java que es nuestra primera actividad (fíjese cómo la clase creada extiende la clase Activity del paquete android.app):

Código
  1. package net.casidiablo.holaparce;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. public class HolaParce extends Activity {
  5. /** Called when the activity is first created. */
  6.    @Override
  7.    public void onCreate(Bundle savedInstanceState) {
  8.        super.onCreate(savedInstanceState);
  9.        setContentView(R.layout.main);
  10.    }
  11. }

Veamos en detalle cada línea:

  • Línea 1 define el nombre del paquete.
  • Líneas 2 y 3 importamos las clases que necesitamos para correr la actividad.
  • En la línea 4 podemos ver que la clase exitiende a Activity.
  • En la línea 7 redefinimos el método onCreate de la clase Activity, el cual es ejecutado al momento de iniciar la aplicación. Note que no es necesario tener un método main; en Android se define una actividad principal que será ejecutada al iniciar la aplicación (más adelante veremos donde se configura esto).
  • En la línea 9 se usa el método setContentView que define cual de las interfaces gráficas creadas en el directorio layout serán usadas. Como parámetro usamos la variable R.layout.main. Esto es algo confuso al principio así que lea atentamente: R, como vimos anteriormente, es una clase generada por Eclipse automáticamente cada vez que creamos nuevos componentes para la aplicación; dentro de ella se crean clases estáticas con variables enteras que representan cada uno de estos componentes (main.xml es entonces una variable entera llamada main, dentro de la clase estática layout, que a su vez se encuentra dentro de la clase R.java). Por ejemplo, para usar la variable hello desde Java, tendríamos que usar una referencia de tipo R.values.hello.

Por último, tenemos el archivo AndroidManifest.xml. Todas las aplicaciones deben tener este archivo y no debe ser renombrado. En él se especifican las opciones generales del programa, como el paquete principal, la actividad que deberá ejecutarse al iniciar la aplicación (y deben incluirse allí TODAS las actividades que se van usar), el icono a usar, los permisos, etc.

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="net.casidiablo.holaparce"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <application android:icon="@drawable/icon" android:label="@string/app_name">
  7. <activity android:name=".HolaParce"
  8. android:label="@string/app_name">
  9. <intent-filter>
  10. <action android:name="android.intent.action.MAIN" />
  11. <category android:name="android.intent.category.LAUNCHER" />
  12. </intent-filter>
  13. </activity>
  14. </application>
  15. <uses-sdk android:minSdkVersion="4" />
  16. </manifest>

5. Operaciones avanzadas: acceder al dispositivo por consola y obtener una shell

Como sabemos, Android está basado en Linux, y como tal posee una interfaz de linea de comandos que podemos acceder usando las herramientas del sdk. Esto lo podemos hacer tanto para dispositivos virtuales, como el de este ejemplo, como para dispositivos reales. En este caso lo haremos con el dispositivo virtual que creamos para el ejemplo. Es tan sencillo como ejecutar esto en consola (en Linux):

Código:
tools/adb -s emulator5554 shell

Lo que hacemos con el comando anterior es indicarle al adb que queremos abrir una shell del dispositivo con serial emulator-5554. Para ver los dispositivos conectados actualmente y sus seriales usamos el comando adb devices. Si todo va bien veríamos algo como esto:

Código:
funtoo@larry tools % ./adb -s emulator-5554 shell
# ls
sqlite_stmt_journals
cache
sdcard
etc
system
sys
sbin
proc
init.rc
init.goldfish.rc
init
default.prop
data
root
dev

Desde dicha shell podemos hacer bastantes cosas, pero la más interesante para mi, es poder usar el SQLite3 para acceder a las bases de datos de las aplicaciones que creemos, lo cual nos permite una depuración mucho más rápida.

Depuración de aplicaciones en Android

Siguiendo con la serie de entradas sobre Android, aprenderemos a depurar de una manera sencilla las aplicaciones que escribamos. Muchas veces, al ejecutar la aplicación obtenemos un mensaje de este tipo:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/android-broken.png)

Cuando estamos desarrollando aplicaciones normales en Java, usualmente imprimimos mensajes en consola que contienen la información de las excepciones que capturamos, y que nos permiten detectar los errores. En Android tendremos hacer uso de la clase Log, que genera logs  (¡capitán obvio al rescate!).

Su uso es bastante simple. Como ejemplo usemos este programa que arrojaría un famoso NullPointerException:

Código
  1. package net.casidiablo.ejemplo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. public class EjemploInvertir extends Activity {
  6. @Override
  7. public void onCreate(Bundle b) {
  8. super.onCreate(b);
  9. setContentView(R.layout.interfaz_grafica);
  10. String x = null;
  11. try {
  12. x.length();
  13. } catch (Exception e) {
  14. Log.d("Al inicio", "El error es: "+e.toString());
  15. }
  16. }
  17. }

En este caso se usó el método d de la clase Log, el cual genera mensajes de tipo DEBUG. Existen otros como v, para VERBOSE, e para ERROR, etc. La lista completa la encuentras en el API de la clase (http://developer.android.com/intl/de/reference/android/util/Log.html).

Para leer el registro de errores desde Eclipse vamos a Window -> Show view -> Other… Dentro del cuadro de diálogo que se abre seleccionamos Android -> Logcat:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/log-cat-android.png)

Espero que les sea de ayuda. No duden en comentar sus dudas o sugerencias.


Título: Conceptos básicos de interfaces gráficas con Android
Publicado por: Casidiablo en 10 Junio 2010, 22:29 pm
Conceptos básicos de interfaces gráficas con Android

En esta sección vamos a introducirnos en el desarrollo de interfaces gráficas para Android (http://casidiablo.net/tutorial-basico-android/). Haremos un sencillo ejemplo paso a paso en donde la idea es que comprenda la filosofía con la que se trabaja al usar widgets y actividades. El resultado será una aplicación sencilla que pide una cadena de texto al usuario y la invierte. Es importante que ya tenga configurado el SDK y el Eclipse como se explica en el post anterior; aprenderemos a usar labels, cajas de texto, botones y eventos.

Puesto que es el primer post de este tipo, voy a explicar detalladamente cada paso. En las siguientes iré un poco más rápido. Así que, si ya tiene experiencia con Android tal vez se aburra un poco...

0. Crear un nuevo proyecto

Abrimos Eclipse y creamos un nuevo proyecto para Android:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/nuevo-proyecto-android.png)

Configuramos el proyecto de tal manera que quede así:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/proyecto-android.png)

En este caso estoy usando la versión 1.6 de Android, pero puede escoger la versión que concuerde con el dispositivo sobre el que desea probar la aplicación. Esto se explica con más detalle en el post anterior. Fíjese que no hemos creado ninguna actividad inicialmente (el checkbox Create Activity no está seleccionado); la idea es ver cómo se deben crear las actividades, los layouts con la interfaz gráfica, las clases que referencian a las actividades y la configuración del AndroidManifest.xml.

1. Crear y configurar una Actividad inicial

Creamos una clase dentro del paquete net.casidiablo.ejemplo:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/nueva-clase.png)

Y en el asistente de creación de clases de Eclipse le damos como nombre EjemploInvertir. Clic en Finish y editamos la clase para que luzca así:

Código
  1. package net.casidiablo.ejemplo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. public class EjemploInvertir extends Activity{
  5.    @Override
  6.    public void onCreate(Bundle b){
  7.        super.onCreate(b);
  8.        setContentView(R.layout.main);
  9.    }
  10. }


Lo que hemos hecho es extender la clase Activity (http://developer.android.com/intl/de/reference/android/app/Activity.html) y redefinir el método onCreate. Además, ejecutamos el método setContentView indicándole que usaremos el layout main.xml.

Puesto que deseamos que esta actividad sea mostrada al momento de ejecutar la aplicación, debemos editar el archivo AndroidManifest.xml, que se encuentra en la raíz del proyecto. Al hacer doble clic sobre este, vemos que es posible editarlo usando una interfaz gráfica. Para añadir la actividad que acabamos de crear, hacemos clic en la pestaña inferior Application, y en la sección Application Nodes hacemos clic en Add… Allí seleccionamos Activity y hacemos clic en OK.

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/aniadir-android-activity.png)

Ahora debemos configurar la actividad. En la parte derecha ha aparecido un formulario llamado Attributes for Activity, en donde podremos hacerlo. Lo más importante es el nombre de la actividad, el cual debe ser el nombre de la clase que acabamos de crear. Es posible usar el botón Browse… para buscar las actividades actualmente disponibles…

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/browse-activities.png)

Una vez hayamos seleccionado o escrito el nombre de la clase, debemos añadirle un Intent (http://developer.android.com/intl/de/reference/android/content/Intent.html); pero… ¿qué es un Intent  ? Los componentes de una aplicación en Android se comunican a través de mensajes llamados Intents (objetos de la clase android.content.Intent). Se trata de una estructura de datos pasiva que contiene una descripción abstracta de una operación que será realizada, y se usa comúnmente para iniciar actividades. Sí ya se, es algo confuso al principio, pero de momento no es demasiado importante (más información aquí (http://developer.android.com/intl/de/guide/topics/intents/intents-filters.html)). Para añadir el intent, seleccionamos la actividad que acabamos de crear y hacemos clic en el botón Add… Seleccionamos Intent Filter, hacemos clic en OK. Y ahora, dentro del Intent crearemos dos componentes un Action y un Category.

Un Action es un String que contiene el nombre de la acción a ser realizada. En este caso, el Action será android.intent.action.MAIN, el cual es usado para ejecutar la primera actividad de una aplicación. Entonces, seleccionamos el Intent Filter que acabamos de crear, y hacemos clic en Add… escogemos Action, clic en OK y escogemos el nombre del Action:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/action-android.png)

Category es un String que contiene información adicional acerca del tipo de componente que debería manipular el Intent. En este caso el Category que añadiremos será CATEGORY_LAUNCHER el cual indica que la actividad puede ser la principal (la que se ejecuta al iniciar la aplicación). Luego de añadir el Category veremos que queda así:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/category-android.png)

Hacemos clic en el icono de guardar en la barra de herramientas y listo. También es posible editar el archivo AndroidManifest.xml a mano, lo cual pienso que es mucho más rápido. Pero no esta de más saber cómo hacerlo con la interfaz gráfica. Si abrimos el archivo con el editor de XML veremos:

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.    package="net.casidiablo.ejemplo" android:versionCode="1"
  4.    android:versionName="1.0">
  5.    <application android:icon="@drawable/icon" android:label="@string/app_name">
  6.        <activity android:name="EjemploInvertir">
  7.            <intent-filter>
  8.                <action android:name="android.intent.action.MAIN" />
  9.                <category android:name="android.intent.category.LAUNCHER"></category>
  10.            </intent-filter>
  11.        </activity>
  12.    </application>
  13.    <uses-sdk android:minSdkVersion="4" />
  14. </manifest>

Ahora que hemos configurado el AndroidManifest.xml podemos hacer una prueba de ejecución del programa… si todo va bien veremos algo como esto:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/hello-world-android.png)

2. Crear la interfaz gráfica

En este paso, crearemos una nueva interfaz gráfica que contendrá un label, una caja de texto y un botón. Aprenderemos a posicionar/agrupar los elementos en la pantalla, y darles un tamaño adecuado. Vamos a crear un nuevo layout dentro del directorio res/layout/ (aunque podríamos haber usado el main.xml generado por asistente de Eclipse, pero prefiero que aprenda este proceso de una vez). Así que, hacemos clic en el botón de creación de nuevos archivos XML de Android:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/nuevo-xml-android.png)


Seleccionamos la opción layout y le damos un nombre al archivo. Por ejemplo, interfaz_grafica.xml:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/crear-xml-android.png)

¡Hacemos clic en Finish y listo! Al hacer doble clic sobre el archivo que acabamos de crear vemos que es posible editarlo usando una interfaz gráfica, pero en este caso usaremos el editor de XML, ya que es mucho más rápido hacerlo así. Hacemos clic en la pestaña inferior que tiene el nombre del archivo (interfaz_grafica.xml) y veremos algo como esto:

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content">
  5. </LinearLayout>

Por defecto se crea un objeto LinearLayout que contiene contiene tres parámetros: un XML Name Space (en este caso http://schemas.android.com/apk/res/android ), el tamaño que ocupará a lo ancho y el que ocupará a lo largo. Para estos dos ultimos parámetros se está usando wrap_content indicando que se debe usar el menor espacio posible. Los objetos LinearLayout funcionan de manera similar a los JPanel de Java, pudiendo “contener” widgets de Android (labels, botones, menus u otros LinearLayout, etc.).

Lo siguiente será crear la interfaz gráfica para nuestro programa de ejemplo, pero antes vamos a aprender un poco sobre el directorio res/values. Por defecto veremos que hay un archivo llamado strings.xml que contiene pares nomber<=>valor. Este archivo es usado para almacenar todas las variables “estáticas” de la aplicación. Si bien su uso no es estrictamente obligatorio, si es recomendado y es bueno saber usarlo. Para nuestro ejemplo entonces, tenemos dos cadenas de texto que podrían ser estáticas: el texto que aparecerá en el label y el texto que aparecerá en el botón. Para la primera vamos a asignar el texto directamente en el XML de la interfaz gráfica, mientras que para el botón lo haremos usando el archivo strings.xml; lo hago de las dos maneras con el fin de que quede clara la diferencia entre ambos métodos.

Abrimos el archivo strings.xml, que se encuentra en el directorio res/values, para añadir una nueva cadena de texto que será usada por el botón de la aplicación. Solo debemos añadir algo como esto: <string name=”texto_boton”>Invertir!</string>, de tal manera que quede así:

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3.    <string name="hello">Hello World!</string>
  4.    <string name="app_name">Ejemplo</string>
  5.    <string name="texto_boton">Invertir!</string>
  6. </resources>

Ahora sí, vamos a modificar el archivo interfaz_grafica.xml de tal manera que quede así:

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent" android:layout_height="fill_parent"
  4.     android:orientation="vertical">
  5.    <LinearLayout android:orientation="horizontal"
  6.     android:layout_width="fill_parent" android:layout_height="wrap_content">
  7.        <TextView android:text="Palabra: " android:layout_width="wrap_content"
  8.         android:layout_height="wrap_content" />
  9.        <EditText android:id="@+id/cajaTexto" android:layout_width="fill_parent"
  10.         android:layout_height="wrap_content" />
  11.    </LinearLayout>
  12.    <Button android="@+id/btnInvertir" android:layout_width="fill_parent"
  13.     android:layout_height="wrap_content" android:text="@string/texto_boton"/>
  14. </LinearLayout>

Veamos qué hemos hecho arriba:

  • En la línea 3 podemos ver que cambiamos el ancho y alto del LinearLayout principal de tal manera que utilice toda la pantalla (usando fill_parent).
  • Puesto que el LinearLayout contendrá otros objetos, debemos indicarle el sentido en el que los irá poniendo. En este caso se deben poner verticalmente (android:orientation="vertical").
  • En las líneas 5 y 6 creamos un nuevo LinearLayout que contendrá el label y la caja de texto. Puesto que queremos que estos dos objetos aparezcan en una sola línea, ponemos el parámetro android:orientation="horizontal". Además, le indicamos que ocupe toda la pantalla a lo ancho, pero que la altura sea la más pequeña posible.
  • En las líneas 7 y 8 creamos un nuevo TextView (un label) con el texto "Palabra: "; esto lo indicamos con la propiedad android:text. Además queremos que ocupe el menor espacio posible tanto en alto como en ancho (wrap_content para layout_width y layout_height).
  • En las líneas 9 y 10 creamos un EditText (una caja de texto), que es donde el usuario pondrá la palabra que desea invertir. Intentará ocupar el mayor ancho posible en la pantalla. Además, puesto que este es un objeto del cual necesitaremos datos, debemos asignarle un ID para que podamos acceder a él desde el programa en Java que crearemos en breve.
  • En la línea 11 cerramos el LinearLayout que contiene el label y la caja de texto.
  • En las líneas 12 y 13 creamos un objeto Button. Este objeto también tiene un ID puesto que debemos obtener una referencia del mismo desde el programa en Java. Además, a la propiedad android:text se está asignando @string/texto_boton que es la referencia a la variable que creamos en el strings.xml
Ahora que hemos creado la interfaz gráfica, vamos a ejecutar la aplicación para ver si ha quedado bien. Pero antes, debemos indicarle a nuestra Actividad que el layout que debe ejecutar es interfaz_grafica.xml. Esto lo hacemos modificando la clase EjemploInvertir.java para que quede así:

Código
  1. package net.casidiablo.ejemplo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. public class EjemploInvertir extends Activity{
  5.    @Override
  6.    public void onCreate(Bundle b){
  7.        super.onCreate(b);
  8.        setContentView(R.layout.interfaz_grafica);
  9.    }
  10. }


Si todo va bien, al ejecutar la aplicación veremos algo como esto:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/interfaz-grafica-android.png)

3. Programación de objetos de la interfaz gráfica

Ahora que hemos construido la interfaz gráfica, debemos programar la parte de “invertir la cadena de texto”. Para ello necesitamos extraer el texto que se ponga en la caja de texto y manejar los eventos que genera el botón; en cualquier caso, necesitamos referencias a dichos objetos. Así que, de momento, vamos a hacer que nuestra clase EjemploInvertir.java luzca así:

Código
  1. package net.casidiablo.ejemplo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.Button;
  5. import android.widget.EditText;
  6. public class EjemploInvertir extends Activity{
  7.    //declarar objetos
  8.    private EditText texto;
  9.    private Button boton;
  10.    @Override
  11.    public void onCreate(Bundle b){
  12.        super.onCreate(b);
  13.        setContentView(R.layout.interfaz_grafica);
  14.        //iniciar los objetos
  15.        texto = (EditText) findViewById(R.id.cajaTexto);
  16.        boton = (Button) findViewById(R.id.btnInvertir);
  17.    }
  18. }

Veamos qué ha pasado allá arriba:

  • En las líneas 4 y 5 importamos las clases Button y EditText del paquete android.widget.
  • En las líneas 9 y 10 declaramos objetos de tipo EditText y Button, los cuales los usaremos para manipular los que hemos creado en la interfaz gráfica.
  • En la líneas 17 iniciamos el objeto EditText usando el método findViewById, a la cual le enviamos como parámetro el ID de la caja de texto (¿recuerdas? pusimos esto dentro del XML: android:id="@+id/cajaTexto").
  • De igual manera creamos el objeto botón usando el ID btnInvertir que definimos en el XML.
Hasta el momento solo hemos creado los objetos, pero no estamos haciendo nada con ellos. Para esto, vamos a asignar un listener al botón, que ejecutará ciertas acciones al momento de presionarlo. Esto lo hacemos con el método setOnClickListener el cual recibe como parámetro un objeto de tipo android.view.View.OnClickListener. Veamos cómo debe quedar la clase y luego explico cada componente nuevo:

Código
  1. package net.casidiablo.ejemplo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.view.View.OnClickListener;
  6. import android.widget.Button;
  7. import android.widget.EditText;
  8. import android.widget.Toast;
  9. public class EjemploInvertir extends Activity{
  10. //declarar objetos
  11. private EditText cajaDeTexto;
  12. private Button boton;
  13. @Override
  14. public void onCreate(Bundle b){
  15. super.onCreate(b);
  16. setContentView(R.layout.interfaz_grafica);
  17. //iniciar los objetos
  18. cajaDeTexto = (EditText) findViewById(R.id.cajaTexto);
  19. boton = (Button) findViewById(R.id.btnInvertir);
  20. boton.setOnClickListener(new OnClickListener() {
  21. @Override
  22. public void onClick(View v) {
  23. invertir();
  24. }
  25. });
  26. }
  27. //metodo para invertir el texto
  28. private void invertir(){
  29. //obtener el string de la caja de texto
  30. String txt = cajaDeTexto.getText().toString();
  31. //verificar que haya texto por invertir
  32. if(!txt.equals("")){
  33. //invertir texto
  34. String resultado = "";
  35. for (int i = txt.length()-1; i>=0; i--)
  36. resultado += txt.charAt (i);
  37.    //asignamos el string invertido a la caja de texto
  38. cajaDeTexto.setText(resultado);
  39. }
  40. else Toast.makeText(this, "No hay nada que invertir", Toast.LENGTH_LONG).show();
  41. }
  42. }

Veamos que fue todo eso…

  • En la línea 5 se importan la interfaz OnClickListener. Dicha interfaz es usada en la línea 20 al crear un objeto que se enviará como parámetro al método setOnClickListener. Dentro, es necesario implementar el método onClick en donde pondremos las instrucciones que serán ejecutadas al momento de hacer clic en el botón (en este caso una llamada a la función invertir(), líneas 28 a 41).
  • El método invertir inicia una variable String con los datos que contenga la caja de texto, usando el método getText de la clase EditText.
  • En las líneas 35 y 36 se invierte la cadena, que posteriormente se pone de nuevo en la caja de texto usando el método setText (línea 38).
  • En la línea 40 mostramos un mensaje usando la clase Toast. Este mensaje aparece cuando no hay datos en la caja de texto. Lo he colocado puesto que es bastante sencillo de implementar. Basta con usar el método estático makeText pasándole como parámetros el contexto en el que se mostrará (se usa this, puesto que se mostrará en la Actividad actual), el texto a mostrar y cuanto tiempo durará el mensaje.
Al ejecutar la aplicación, escribir “Estoy invertido” en la caja de texto y presionar el botón, veremos algo así:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/texto-android.png)

Si no ponemos texto y presionamos el botón Invertir, veremos:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/sin-texto-android.png)

La aplicación está lista para ser probada en un dispositivo real. En mi caso la instalé en una HTC Tattoo y se ve así:

(http://casidiablo.net/wordpress/wp-content/uploads/2010/03/device.png)

4. Descargar código

Este es el código fuente (http://casidiablo.net/descargar/Ejemplo+UI+Android) usado para este tutorial, espero le haya gustado. Cualquier duda o sugerencia no dude en comentarla.


Título: Construir aplicaciones Android desde la línea de comandos
Publicado por: Casidiablo en 10 Junio 2010, 22:29 pm
Construir aplicaciones Android desde la línea de comandos

Emacs (http://www.gnu.org/software/emacs/) es algo adictivo sin duda… a tal punto que a veces prefiero programar todo desde la línea de comandos en vez de usar un IDE como Eclipse o Netbans. En esta entrada, que sin duda es de esas que me sirve solo a mi y a unos pocos más, se detalla el proceso de compilación e instalación de aplicaciones para Android sin usar más que el SDK y una línea de comandos. Esta guía es aplicable para cualquier sistema operativo, pero yo lo haré en mi equipo que corre Funtoo Linux (http://www.funtoo.org/).

0. Configuración del entorno de trabajo

Lo primero es tener el SDK instalado, lo cual está explicado en el primer post de este mismo hilo. Una vez hayamos instalado y configurado el SDK (incluyendo la adición del directorio tools al path del sistema) y tengamos un proyecto que compilar podemos iniciar el proceso de compilación. Es posible también crear el proyecto desde la línea de comandos así:

Código:
android create project -t 1 -p /tmp/ejemplo -k net.casidiablo.ejemplo -a Ejemplo

Donde -t 1 es el id de la plataforma para la que vamos a desarrollar la aplicación (el target). Se puede usar el comando android list targets para ver el listado de targets disponibles. -p indica la ruta de creación del proyecto y -a el nombre de la actividad inicial.

1. Compilación

Es posible usar Ant para compilar y empaquetar todo automáticamente… pero me gusta hacer cada cosa y saber qué está pasando por debajo. Así que haremos todo manualmente. El siguiente comando generará el archivo R.java.

Código:
aapt p -m -J src -M AndroidManifest.xml -S res -I $ANDROID_DIR/android.jar

  • p = package
  • -m -j src indicar el directorio de los archivos fuente
  • -M indicar la ubicación del manifiesto
  • -S indicar la ubicación del directorio de recursos
  • -I $ANDROID_DIR/android.jar añade el paquete android.jar al classpath del proyecto. Importante: en mi caso $ANDROID_DIR apunta a /opt/android/platforms/android-4/ y en el path del sistema se encuentra incluido /opt/android/platforms/android-4/tools/ Es importante tener en cuenta que NO se usa la base del SDK como antiguamente se hacía, sino el correspondiente directorio bajo platforms.

Ahora sí vamos a generar los archivos .class (por supuesto, es necesario tener el JDK de Java instalado):

Código:
javac -encoding ascii -target 1.5 -d bin -bootclasspath $ANDROID_DIR/android.jar src/net/casidiablo/ejemplo/*.java

Esto básicamente genera archivos .class en el directorio bin. Si la aplicación usara librerías de terceros, se debería agregar el parámetro -classpath=libs/*.jar

Puesto que los archivos .class están generados para la JVM, es necesario convertirlos a archivos para la Dalvik VM:

Código:
dx –dex –output=bin/classes.dex bin # si existieran librerías externas se añade libs/*.jar

Ahora empaquetamos los recursos:

Código:
aapt p -f -M AndroidManifest.xml -S res/ -I $ANDROID_DIR/android.jar -F bin/ejemplo.ap_

Ahora empaquetamos usando los bytecodes de Dalvik que creamos (classes.dex) para generar el paquete final:

Código:
apkbuilder bin/ejemplo.apk -z bin/ejemplo.ap_ -f bin/classes.dex -rf src -rj libs

Finalmente podemos instalarlo tal como escribí en Manipulación de smartphones con Android desde la consola de Linux (http://casidiablo.net/android-desde-linux/):

Código:
adb install bin/ejemplo.apk

Links interesantes: How to build Android application package (.apk) from the command line using the SDK tools + continuously integrated using CruiseControl (http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/) y Developing Android without Eclipse or Ant (http://benlynn.blogspot.com/2009/01/developing-android-without-eclipse-or.html)


Título: Re: Introducción a la programación con Android
Publicado por: Leyer en 11 Junio 2010, 01:10 am
Magnifico aporte casidiablo ;D se agradece lo seguí al pie de la letra y esta correcto, solo te falto colocar en el paso "Instalar y configurar el plugin para Eclipse" que hay que establecer la ruta del SDK de android en el eclipse "Windows->Preferences-SDK Location" antes de crear un nuevo proyecto android.

Saludos!


Título: Re: Introducción a la programación con Android
Publicado por: Casidiablo en 11 Junio 2010, 03:32 am
Es cierto... no había caído en cuenta. Gracias por el apunte.


Título: Re: Introducción a la programación con Android
Publicado por: nØFi# en 20 Junio 2010, 20:48 pm
Muy buen manual!  ;-)

Sabes si con el SDK se puede programar algo con el GPS? o con los sensores de movimiento,altitud,etc.. ?


Título: Re: Introducción a la programación con Android
Publicado por: Debci en 20 Junio 2010, 20:53 pm
Tengo una duda, me compre un mobil hace escasos dias, y me preguntaba si puedo instalarle android o este viene de serie?
Luego saber si es exclusivo para plataformas mobiles, no existe algo parecido para PC?

Saludos


Título: Re: Introducción a la programación con Android
Publicado por: Amerikano|Cls en 21 Junio 2010, 23:53 pm
Gracias por el tute!!


Título: Re: Introducción a la programación con Android
Publicado por: Casidiablo en 1 Julio 2010, 21:37 pm
Muy buen manual!  ;-)

Sabes si con el SDK se puede programar algo con el GPS? o con los sensores de movimiento,altitud,etc.. ?

Por supuesto. El SDK tiene APIs para GPS, GMaps, Sensores de movimiento, Compass, etc.

Tengo una duda, me compre un mobil hace escasos dias, y me preguntaba si puedo instalarle android o este viene de serie?
Luego saber si es exclusivo para plataformas mobiles, no existe algo parecido para PC?

Saludos

No es exclusivo de móviles, aunque es donde más se encuentra. Lo puedes instalar en una máquina virtual si quieres. Por cierto... felicidades por el cargo de Moderador. Ya hacia falta.

Un saludo!


Título: Re: Introducción a la programación con Android
Publicado por: Debci en 1 Julio 2010, 22:04 pm
Muy buen manual!  ;-)

Sabes si con el SDK se puede programar algo con el GPS? o con los sensores de movimiento,altitud,etc.. ?

Por supuesto. El SDK tiene APIs para GPS, GMaps, Sensores de movimiento, Compass, etc.

Tengo una duda, me compre un mobil hace escasos dias, y me preguntaba si puedo instalarle android o este viene de serie?
Luego saber si es exclusivo para plataformas mobiles, no existe algo parecido para PC?

Saludos

No es exclusivo de móviles, aunque es donde más se encuentra. Lo puedes instalar en una máquina virtual si quieres. Por cierto... felicidades por el cargo de Moderador. Ya hacia falta.

Un saludo!
Muchisimas, gracias, me parece que voy a dar chinchetazo al tema, pues esta muy completo, y es todo un thread con info muy interesante.

Saludos


Título: alguien porfa ayudenme!!!
Publicado por: pdora en 21 Julio 2010, 18:16 pm
en: 15 Julio 2010, 00:47 »   

--------------------------------------------------------------------------------
¿me sale error cuando abro el emulador android,para windows«
segun se ,primero se ejecutar el sdk setup.exe.

lo ejecuto y me sale losiguiente:



Failed to fetch URL https://dl-ssl.google.com/android/repository/repository.xml, reason: No route to host: connect

por diganme porque sale esto
o a que se debe
y como debo a solucionarlo. muchisimas gracias


Título: Re: Introducción a la programación con Android
Publicado por: jossydeleon en 2 Septiembre 2010, 20:19 pm
Hola tengo una duda no existe el Plugin para hacer la adaptacion a Netbeans?
Muchas Gracias


Título: Re: Introducción a la programación con Android
Publicado por: Leyer en 3 Septiembre 2010, 04:00 am
Hola tengo una duda no existe el Plugin para hacer la adaptacion a Netbeans?
Muchas Gracias

http://www.pensandoenred.com/2010/01/25/android-sdk-con-netbeans-6-8/


Título: Re: Introducción a la programación con Android
Publicado por: josco en 11 Septiembre 2010, 05:17 am
hola que tal alguien usa netbeans y android que me pueda ayudar a correr los ejemplos que trae el sdk como el de snake, lo que intente hacer es crear un nuevo proyecto y meter las clases del src del ejemplo en mi proyecto en netbeans pero me sale error en todo lo que tenga que ver con R, por ejemplo en:

R.layout,  R.id.snake

se suppne  que en el ejemplo deve existir esta clase llamada R pero no la encuentro


Título: Re: Introducción a la programación con Android
Publicado por: Xedrox en 13 Septiembre 2010, 04:45 am
Hola, excelente manual muchísimas gracias por el tremendo aporte, pero quería hacerte una consulta, sabes si las aplicaciones que uno desarrolla se pueden comercializar ?


Título: Re: Introducción a la programación con Android
Publicado por: Castiblanco en 13 Septiembre 2010, 13:37 pm
Sí, Android Market.

:http://www.androidsis.com/android-market-ya-disponible-para-espana/
:http://www.incubaweb.com/android-market-venta-de-aplicaciones-para-android/

Saludos...


Título: Re: Introducción a la programación con Android
Publicado por: 043h68 en 3 Octubre 2010, 02:29 am
Excelente aporte! Se agradece  ;D


Título: Re: Introducción a la programación con Android
Publicado por: jax20 en 9 Noviembre 2010, 23:55 pm
Muy buen aporte, me viene muy bien para practicar.


Título: Re: Introducción a la programación con Android
Publicado por: rdzlcs en 23 Diciembre 2010, 23:27 pm
Gracias Muy bueno.. Recién me estoy descargando las herramientas...

SAludos


Título: Re: Introducción a la programación con Android
Publicado por: LovePeace2012 en 10 Marzo 2011, 06:49 am
Gracias


Título: Re: Introducción a la programación con Android
Publicado por: xexio en 6 Abril 2011, 22:24 pm
cuando le doy para bajar el SDK de Android para GNU/Linux solo da la opcion para x86, no hay para x86_64, o da igual?


Título: Re: Introducción a la programación con Android
Publicado por: Casidiablo en 14 Abril 2011, 15:01 pm
Sí Xexio, es el mismo para distros de 64 bits... no te va a dar ningún problema.


Título: Re: Introducción a la programación con Android
Publicado por: xexio en 14 Abril 2011, 19:08 pm
Sí Xexio, es el mismo para distros de 64 bits... no te va a dar ningún problema.

;)


Título: Re: Introducción a la programación con Android
Publicado por: ovalencia en 24 Abril 2011, 10:11 am
Ahora, se que estas en latinoamerica, para nuestro caso,
como podriamos vender una aplicacion ya lista hecha en android
para el marketplace de google?
Lo has hecho?

Gracias por el aporte.


Título: Re: Introducción a la programación con Android
Publicado por: Raikuzu en 2 Mayo 2011, 17:53 pm
(http://s3.subirimagenes.com:81/fotos/6343068dibujo.jpg)

Mi problema esque no me sale ninguna opción en Target name y por eso no puedo continuar... ¿en que me he equivocado? He seguido todos los pasos, excepto que he puedto el 1.5 en vez del 1.6, pero no creo que me haya inconveniente en eso.


Título: Re: Introducción a la programación con Android
Publicado por: [Case] en 29 Junio 2011, 17:03 pm
(http://s3.subirimagenes.com:81/fotos/6343068dibujo.jpg)

Mi problema esque no me sale ninguna opción en Target name y por eso no puedo continuar... ¿en que me he equivocado? He seguido todos los pasos, excepto que he puedto el 1.5 en vez del 1.6, pero no creo que me haya inconveniente en eso.

Despues de instalar el sdk has actualizado la adb?


Título: Re: Introducción a la programación con Android
Publicado por: dlanor_1990 en 25 Octubre 2011, 15:16 pm
Como instalo en pligin para Netbeans 7.0  :-[


Título: Re: Introducción a la programación con Android
Publicado por: pikMR en 4 Abril 2012, 20:43 pm
Hola Casidiablo tengo una duda referente al desarrollo de aplicaciones android ya que he visto que lo dominas bien, gracias a tu manual que realizastes para el foro, bueno mi pregunta es la siguiente:

Cuando compilo la aplicación a traves de eclipse hay veces ( la mayoria ) que no actualiza el nuevo codigo introducido, por lo cual cuando voy a la pantalla del movil, al compilar la aplicación siempre me aparece el mismo programa del principio,el de la primera compilación, para que me entiendas mejor, es como cuando pasa muchas veces en la programación web y no borras tu cache, cuando vas al explorador algunas veces te muestra el codigo anterior y no el actualizado.. cual seria la solución a mi problema? Gracias.


Título: Re: Introducción a la programación con Android
Publicado por: mapers en 4 Octubre 2012, 19:01 pm
Una pregunta y android se puede conectar a mysql o a sqlserver ??? si es asi cual es la manera porfa


Título: Re: Introducción a la programación con Android
Publicado por: R/G en 14 Diciembre 2012, 09:12 am
Hola amigos, una consulta ya que estan en el tema de android, yo realice una aplicacion en netbeans y mi S.O es windows xp, esa aplicacion funcionara si la trato de correr en un tablet con android? o tengo tengo que obligadamente ccodificarla en android... bueno gracias de antemano y saludos.