Tema 3
En este tema se mostrará paso a paso cómo desarrollar una sencilla aplicación Android, que
aplicará parte de los conceptos básicos explicados en los temas anteriores.
Para implementar esta funcionalidad, será necesario crear dos actividades, clases que
extienden a Activity, así como sus correspondientes archivos XML de layout. Además, será
necesario modificar el archivo strings.xml.
Es importante recordar que, en las aplicaciones Android, para crear una pantalla, se necesitará
una actividad y un layout 1. La actividad es una clase Java en la que se implementa la
funcionalidad de la pantalla, mientras que el layout es un archivo XML que contiene el diseño
de la misma.
El primer paso para desarrollar la aplicación es, evidentemente, crear un nuevo proyecto
Android en el entorno de desarrollo Eclipse, que deberá tener instalado el plugin ADT (Android
Development Tools). Además, será necesario haber instalado correctamente todas las
versiones de la SDK de Android con la herramienta SDK Manager, así como haber configurado
al menos un AVD (Android Virtual Device) con la herramienta AVD Manager.
En Eclipse, se accederá al menú File > New > Other.. > Android > Android Application Project y
se creará el proyecto “AplicacionSencilla”, tal y como muestra la siguiente imagen:
1
También se podrán usar fragmentos, tal y como se verá en un próximo tema.
En este cuadro de diálogo, el nombre de la aplicación será el que se muestre debajo del icono
de la aplicación, en el dispositivo. El nombre del proyecto, que no tiene por qué coincidir con el
de la aplicación, será el nombre de la carpeta (dentro del Workspace de Eclipse), que
contendrá todos los archivos del proyecto. El nombre del paquete (Package Name) será el
nombre del paquete principal de la aplicación, donde en general se ubicarán las actividades, y
que quedará reflejado en el atributo android:package del manifiesto de la aplicación. Dicho
nombre de paquete será utilizado por ADT para ubicar correctamente las clases R.java y
BuildConfig.java.
Se ha de tener en cuenta que el AVD que se haya creado deberá tener un Target igual o
superior al de la aplicación que se va a desarrollar.
Por último, se solicitará el nombre de la actividad principal del proyecto, así como de su layout.
Esta actividad será invocada por el sistema cuando la aplicación sea iniciada, gracias al intent-
filter que contendrá en el manifiesto:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Tal y como se verá en profundidad en un próximo tema, este filtro permite, además, que la
aplicación sea mostrada en la lista de aplicaciones instaladas en el dispositivo (el Launcher).
Al pulsar Finish, Eclipse creará la estructura del proyecto, y generará la actividad principal,
MainActivity.java, y su correspondiente layout, activity_main.xml, además de otros archivos:
Pese a que este modo de diseño es muy útil para construir las pantallas, el código XML será
generado automáticamente por Eclipse (contenido en el layout activity_main.xml). Es
recomendable utilizar la Vista de código para editar directamente el XML.
La primera pantalla que se mostrará al usuario solicitará a este, a través de un TextView, que
pulse en la pantalla. Para ello, una vez abierta la Vista de código del layout principal de la
aplicación, activity_main.xml, se sustituirá el código que automáticamente ha generado
Eclipse, por el siguiente2:
2
ATENCIÓN: no se debe copiar en Eclipse directamente el código de ejemplo mostrado en los temas, puesto que se
copiarán multitud de caracteres especiales e invisibles (tabulaciones, etc.) que harán que el código no compile. Es
necesario escribir manualmente en Eclipse todo el código mostrado en los ejemplos.
Código de res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/textoAccion" />
</LinearLayout>
La estructura de este código será explicada en los próximos temas. Por el momento, cabe
resaltar los siguientes conceptos:
<string name="textoAccion">TODO</string>
A continuación, se creará la segunda actividad, así como su layout. Para ello, se pulsará con el
botón derecho del ratón sobre el proyecto para acceder a “New > Other > Android… > Android
Activity”:
Pulsando por última vez Next, Eclipse mostrará una nueva pantalla en la que se enumeran los
cambios que se introducirán en otros archivos del proyecto, como consecuencia de añadir esta
nueva actividad (por ejemplo, se muestra la modificación del manifiesto de la aplicación para
incluir la nueva actividad):
Al pulsar Finish, Eclipse creará el archivo ResultsActivity.java dentro del paquete principal de la
aplicación (en la carpeta “/src”), así como el archivo activity_results.xml que ubicará en la
carpeta “/res/layout”. Además, abrirá este último archivo en la Vista de código. En dicha vista
se añadirán dos TextView que mostrarán la información que será recogida en la primera
pantalla, y que será enviada desde la primera actividad a la segunda actividad (tal y como se
verá a continuación):
Código de res/layout/activity_results.xml
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/resultados1" />
<TextView
android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/resultados2" />
</LinearLayout>
Código de res/values/strings.xml
<string name="app_name">T03-AplicacionSencilla</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="textoAccion">Pulsa en la pantalla...</string>
<string name="resultados1">
Este texto será sustituido desde la actividad
</string>
<string name="resultados2">
Este texto será sustituido desde la actividad
</string>
</resources>
El plugin ADT contiene un asistente para crear archivos XML de diferentes tipos (archivos de
layout, de propiedades, para definir menús, drawables, animaciones, etc.).
Para crear un archivo XML de layout, se pulsará con el botón derecho del ratón sobre el
proyecto y se accederá a “New > Android XML File” y se seleccionará Layout en la opción
Resource Type:
Una vez añadido el nombre del archivo de layout, new_layout.xml, se establecerá como
elemento raíz (Root Element) para el layout, un LinearLayout y se pulsará Next.
Hasta este punto, lo único que se ha hecho ha sido crear la interfaz de usuario (UI, User
Interface) de dos sencillas pantallas a través de dos archivos XML de layout, y se han declarado
las dos actividades que gestionarán las pantallas. Ahora, se deberá implementar la
funcionalidad de la aplicación en las actividades asociadas a cada una de estas pantallas.
Cuando Eclipse, con la ayuda del plugin ADT, crea las actividades, genera el código que
construye la UI a través del layout (método onCreate()) y el que construye el menú de la
pantalla (método onCreateOptionsMenu()). Por ejemplo, en el caso de MainActivity.java,
genera el siguiente código:
package com.cursoandroid.ui;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
// present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Código de src/MainActivity.java
package com.cursoandroid.ui;
import java.util.Calendar;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
@Override
public boolean onTouchEvent(MotionEvent event) {
intent.putExtras(bundle);
startActivity(intent);
break;
}
return true;
}
}
startActivity(intent);
Código de src/ResultsActivity.java
package com.cursoandroid.ui;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
// present.
getMenuInflater().inflate(R.menu.activity_results, menu);
return true;
}
}
Esta actividad es más sencilla, ya que solo implementa el método onCreate() que accederá al
Bundle contenido en el Intent que ha iniciado esta actividad para extraer los valores que
contiene, a través de las claves establecidas:
Para poder mostrar en pantalla la información recogida, es necesario obtener una referencia
de los controles TextView del layout asociado. Esto se consigue invocando al método
findViewById():
Y, por último, se utilizarán los valores obtenidos del Bundle para componer los textos que se
mostrarán al usuario a través de los controles TextView:
Eclipse, con la ayuda del plugin ADT, permite añadir automáticamente estas cadenas de texto
al archivo strings.xml. Para ello, bastará con seleccionar la cadena de texto, pulsar Ctrl+1 y
elegir la opción Extract String del menú contextual 3. Al realizar esta acción sobre el texto
seleccionado "Has pulsado la pantalla durante ", se mostrará el siguiente cuadro de
diálogo:
3
También se podrá acceder a través del menú de Eclipse “Refactor > Android > Extract Android String…”
Actualmente, el plugin ADT presenta un pequeño problema, que se solventará en una futura
versión. La sustitución que genera no tiene en cuenta que el String que se ha sustituido
puede estar concatenado con otros. El método setText() es polimórfico y admite tanto una
referencia de la clase R (un valor entero, int) como, directamente, un String (simple o
producto de una concatenación). El plugin solo proporciona la primera opción (el valor entero
de la clase R) por lo que, si se quiere crear un String concatenado, se deberá pasar dicha
txtMensaje1.setText(getString(R.string.pulsado_durante) +
segundosPresionado + " segundos");
txtMensaje1.setText(getString(R.string.pulsado_durante)
+ segundosPresionado + getString(R.string.segundos));
txtMensaje2.setText(getString(R.string.pulsado_en_coordenadas)
+ bundle.getInt("X") + ", " + bundle.getInt("Y") + ")");
Existe, no obstante, otra forma más eficiente de crear un String dinámico, basado en la
inyección de parámetros en un String declarado en strings.xml con el método estático
String.format(). Por ejemplo, se puede declarar el siguiente recurso String:
<string name="string_con_parametros">
Esto es un string que tiene dos parámetros. En el primero pone: %1$s,
y en el segundo pone %2$s
</string>
En la actividad, se usará así (se supone que el layout contiene un EditText con identificador
editText):
"Esto es un string que tiene dos parámetros. En el primero pone: 234, y en el segundo pone
Hola Mundo"
4
Las aplicaciones Android incluyen un contexto, espacio representado por la clase Context de la cual hereda
Activity. El método getString(R.string.recurso_string) es un método de Context, accesible por lo tanto en
las actividades.
<string-array name="opciones">
<item>Opción 1</item>
<item>Opción 2</item>
<item>...</item>
</string-array>
<activity android:name="NewActivity">
…
</activity>
La aplicación será probada en un ADV previamente configurado. Para ejecutarla, bastará con
seleccionar la actividad principal de la aplicación, MainActivity, o la raiz del proyecto en la vista
Package Explorer, pulsar el botón Run de Eclipse, , y elegir Run as Android Application:
Al pulsar OK, se mostrará un cuadro de diálogo que permitirá elegir entre los dispositivos
reales que estén conectados y que la herramienta adb haya detectado 5:
Una vez seleccionado un AVD disponible, se pulsará OK. Eclipse cargará el AVD y lanzará la
aplicación, mostrando la siguiente pantalla:
5
Estos dispositivos estarán conectados vía USB y deberán tener la opción Depuración USB activada en el menú
Ajustes > Opciones de desarrollo. Se pueden incluso conectar dispositivos vía WiFi si se activa la opción ADB sobre
TCP/IP y se configura la herramienta adb en dicho modo, con el comando adb tcpip:5555 (donde 5555 es el puerto
sobre el que se conectará).
Si se realiza una pulsación con el ratón en cualquier punto de la pantalla durante un lapso de
tiempo, al levantar el dedo (del ratón), la aplicación mostrará la segunda pantalla, con la
información capturada: