Академический Документы
Профессиональный Документы
Культура Документы
ndice de contenido
1. INSTALACIN DE ANDROID EN ECLIPSE...............................................................................3
2. Hola Mundo....................................................................................................................................10
3.Programacin Android: Interfaz grfica Conceptos bsicos........................................................22
Context......................................................................................................................................23
4.Programacin Android: Interfaz grfica Layouts.........................................................................24
FrameLayout.............................................................................................................................24
LinearLayout.............................................................................................................................25
RelativeLayout..........................................................................................................................26
6. BOTONES Y EVENTOS...............................................................................................................28
Programacin Android: Interfaz grfica Componentes grficos y Eventos....................................31
Button........................................................................................................................................31
EditText.....................................................................................................................................32
ImageView................................................................................................................................33
CheckBox..................................................................................................................................33
7. Android: Escuchador y Manejador de eventos...............................................................................35
8. Android: Checkbox y RadioButtons con su evento de click..........................................................36
9. Programacin Android: Interfaz grfica Adapters ......................................................................41
10. Spinners en Android, de trer formas distintas..............................................................................49
Poblando Spinners.........................................................................................................................49
Desde arrays.xml.......................................................................................................................49
Desde SQLite............................................................................................................................50
Desde un objeto.........................................................................................................................51
Obteniendo el dato seleccionado...................................................................................................52
11. Programacin Android: Interfaz grfica Mens........................................................................53
Options Menu............................................................................................................................53
Context Menu............................................................................................................................54
Mas ejemplo de Mens..................................................................................................................57
Submen........................................................................................................................................59
12. Dilogos y notificaciones.............................................................................................................63
Notificaciones Toast..................................................................................................................63
Notificaciones en la barra de estado..........................................................................................65
Dilogos....................................................................................................................................66
13. Android: Una aplicacin con varios idiomas................................................................................69
14. Android: Disear aplicaciones para todas las dimensiones de pantalla........................................70
15. Estilos y Temas.............................................................................................................................71
Definiendo estilos.....................................................................................................................71
Herencia....................................................................................................................................72
Aplicar estilos y temas a la interfaz grfica..............................................................................72
16. Usando recursos............................................................................................................................75
Referenciando atributos de estilo..............................................................................................75
17. Recursos Strings........................................................................................................................77
Recursos string...............................................................................................................................77
19. Recursos Layout........................................................................................................................79
1
1. INSTALACIN DE ANDROID EN
ECLIPSE.
Para poder empezar a desarrollar aplicaciones en Android, primero debemos asegurarnos que
tenemos correctamente instalado y configurado nuestro JDK, podemos instalar la versin 5 6
desde http://www.oracle.com/technetwork/java /javase/downloads/index.html. La descarga ronda en
torno a unos 75MB.
Finalmente, la ltima herramienta que os voy a hacer descargar e instalar directamente es, cmo no,
el SDK de Android desde http://developer.android.com/sdk/index.html. Una vez dentro de la
pgina, seleccionad el archivo perteneciente a la plataforma Windows y a esperar unos 20MB de
descarga. Cuando lo instalis apuntad la ruta, luego se la tendremos que indicar a Eclipse.
Con todas las herramientas descargadas e instaladas vamos ahora a configurar nuestro Eclipse para
poder desarrollar aplicaciones en Android. Ejecutamos Eclipse y nos vamos a Help->Install New
Software. Una vez ah hacemos click en Add y en el dilogo que aparece ponemos name:
Android Plugin location: https://dl-ssl.google.com/android/eclipse/ (probamos con http si
no nos funciona con https) y hacemos click en OK. En la ventana Available Software ahora
debera aparecer Developer Tools, seleccionamos su checkbox asociado y deberan seleccionarse
los items Android DDMS y Android Development Tools, hacemos click en Next dos veces y
click en Finish, ya tenemos el plugin ADT instalado en nuestro Eclipse, ya falta menos!.
Configuracin Eclipse
Tenemos que descargar el ltimo target disponible de Android para poder acceder a toda la
funcionalidad reciente y a todos los mdulos que nos proporciona Google (por ejemplo el API de
Google Maps). Para ello nos vamos a Inicio -> Todos los Programas -> Android SDK Tools ->
SKD Manager o podemos ir directamente desde Eclipse Window -> Android SDK and AVD
Manager, una vez ah vamos al apartado Available Packages seleccionamos todos los checkbox
tanto de Android Repository como de Third party Add-ons y le damos a Install Selected, esta
instalacin es la ms duradera pero en cuanto tengamos los target estaremos a punto de empezar.
Podramos haber instalado slo el target ms reciente pero es conveniente, ya que vamos a ser
desarrolladores, tener conocimiento tambin de todos los anteriores.
Mdulos
Ya tenemos casi todo configurado, slo nos falta crearnos un emulador y empezamos con el primer
proyecto. Para ello vamos a Window -> Android SDK and AVD Manager -> Virtual Devices.
Hacemos click en New ponemos un nombre a nuestro emulador, por ejemplo FluDevice y le
cargamos un target, para empezar vamos a ponerle el target Android 2.2 API Level 8, las dems
opciones las dejamos por defecto.
Cdigo de prueba
2. Hola Mundo
Una vez que tenemos las herramientas necesarias para comenzar a programar en Android,
crearemos nuestro primer proyecto, para ello nos vamos a File - New - Project...
En esta ventana, en Project Name, ponemos el nombre de nuestro proyecto, en este caso
HolaMundo, quedando marcada la opcin Create new project in workspace. Pulsamos sobre Next:
10
Aqu debemos seleccionar la versin de Android sobre la que queremos trabajar, en este caso voy a
seleccionar la versin 2.1, sin embargo, deberamos seleccionar la versin que necesitemos. Si elijo
la versin 2.1, el programa seguro que funcionar desde esta versin en adelante. Volvemos a pulsar
sobre Next. Ahora tenemos que elegir un nombre de paquete, en nuestro caso ejercicios.ejemplo, ya
que el programa nos obliga a que el nombre del paquete tenga dos identificadores. Tambin si
queremos que cree una Activity, que se llamara HolaMundoActivity, dejamos marcada esta opcin
para que la cree.
11
A continuacin vamos a ver algunas de las carpetas y archivos importantes en un proyecto, como
vemos aparecen en la parte izquierda de Eclipse:
src/ejercicios.ejemplo/HolaMundoActivity.java. Pulsamos doble clic sobre el nombre de
este archivo. Como vemos aqu ir todo nuestro cdigo Java, la lgica de nuestra aplicacin.
Tenemos la clase HolaMundoActivity que extiende la clase Activity y se sobreescribe el
mtodo onCreate(). Cada pantalla de la aplicacin se define mediante un objeto Activity.
Podemos tener las Activities que necesitemos.
01.import android.app.Activity;
02.
03.import android.os.Bundle;
04.
05.public class HolaMundoActivity extends Activity {
06.
07./** Called when the activity is first created. */
08.
09.@Override
10.
11.public void onCreate(Bundle savedInstanceState) {
12.
13.super.onCreate(savedInstanceState);
14.
15.setContentView(R.layout.main);
16.
17.}
18.
19.}
res/layout/main.xml. Aqu se definen los componentes de la interfaz grfica de la aplicacin
y se especifican todas sus propiedades. Se definen los layouts de la aplicacin que son
12
14
15
Pulsamos sobre Create AVD y en la ventana del AVD Manager seleccionamos el emulador y
pulsamos sobre el botn Start..., en la ventana que sale pulsamos sobre el botn Launch y ahora ya
podemos probar nuestro programa en el emulador.
17
Para probar una aplicacin la seleccionamos y bien pulsamos con el botn derecho del ratn sobre
el nombre del proyecto y seleccionamos la opcin Run as - Android Application o bien nos vamos
al men Run - Android Application. Y voil, aqu tenemos ejecutndose a nuestro "Hola mundo".
18
Si utilizamos Android Debug Bridge (adb), podemos emitir comandos con la opcin -d para
apuntar al dispositivo conectado.
21
Context
Si ya has programado algo en Android, o has visto alguno de los ejemplos, probablemente hayas
visto que muchos mtodos referidos a la vista piden como parmetro un objeto de tipo context.
Context es una interfaz para la informacin global de la aplicacin. A travs de l podemos acceder
a recursos, clases y operaciones, como lanzar actividades, manejar intents etc.
Podemos acceder al contexto de diferentes formas en funcin de donde nos encontremos:
Con el mtodo getContext().
Las actividades implementan esta interfaz, por lo que haciendo referencia a ellas mismas,
con (this) o NombreActivity.this, estaremos referenciando el contexto.
Usando otros mtodos como getApplicationContext() o getApplication()
23
FrameLayout
Este tipo de Layout es el ms bsico, coloca a sus objetos hijos en la parte superior izquierda de la
pantalla.
< ?xml version="1.0" encoding="utf-8"?>
<framelayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<textview android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
<textview android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"/>
</framelayout>
Como se puede apreciar en en resultado, si hay ms de un hijo, los objetos se amontonan unos
encima de otros.
24
LinearLayout
Este tipo de layout coloca sus hijos unos detras de otros, tambin comenzando por la esquina
superior izquierda de la pantalla. Podemos colocarlos alineados horizontalmente o verticalmente
mediante su propiedad android:orientation=horizontal | vertical
< ?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<textview android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:background="#0ff"/>
<textview android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello"
android:background="#ff0"/>
</linearlayout>
En este caso, he pueso un fondo de color a cada texto (con la propiedad android:background) para
diferenciarlo bien, y he usado la horientacin horizontal, de haber usado la orientacin vertical, los
textos apareceran uno debajo del otro:
25
RelativeLayout
Este Layout permite que coloquemos los elementos en un lugar con respecto a la posicin de otro,
es decir, colocar un botn a la derecha de un texto, o centrarlo en la pantalla, o por ejemplo, colocar
un texto encima de tal elemento y a la derecha de este otro.
Para conseguir esto, RelativeLayout proporciona propiedades como android:layout_toRightOf o
android:layout_alignLeft, que toman como valores los identificadores de los objetos, o valores
booleanos.
< ?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<textview android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:background="#0ff"
android:layout_centerInParent="true"
android:id="@+id/text1"/>
<textview android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello"
26
Para saber ms acerca de todos los tipos de layouts que hay podis visitar
http://developer.android.com/guide/topics/ui/layout-objects.html
27
6. BOTONES Y EVENTOS
Un botn en tu layout es algo simple, os pongo un ejemplo:
1 <Button
android:id="@+id/btnBoton"
2
android:layout_width="wrap_content"
3
android:layout_height="wrap_content"
4
5
android:text="Botn"
6
/>
Como veis es bastante sencillo pero si lo pulsas no hace nada, para hacer que funcione al pulsarlo,
tenemos que trabajar con manejadores de eventos. Para comprobar que un botn se ha pulsado,
existen 5 formas de hacerlo y cada una con sus ventajas e inconvenientes, yo voy a explicar las 3
ms utilizadas:
1 Forma: La clase interna annima.
Declarar el OnClickListener dentro del mtodo setOnClickListener, es algo comn. Este mtodo es
til cuando cada oyente no puede compartir la funcionalidad con otros oyentes. Algunos
desarrolladores novatos encuentran este tipo de cdigo difcil de entender. Tenemos que repetir el
cdigo para cada botn.
Cdigo:
findViewById(R.id.btnBoton).setOnClickListener(new
1
OnClickListener(){
2
public void onClick(View arg0) {
3
Button boton = (Button)arg0;
4
boton.setText("Has pulsado el botn");
5
}
6
});
2 Forma: Implementacin en la actividad
-implementar la interfaz OnClickListener en la actividad con la que vamos a interactuar con el
botn.
- Dentro del mtodo onCreate, relacionar el botn del layout con la actividad a travs del id para
poder trabajar con l desde el cdigo.
- En el mtodo que implementa la interfaz OnclickListener llamado onClick() tenemos que
programar que se va a hacer cuando hagamos clic en el botn.
Aqu tenemos un ejemplo explicado del cdigo:
28
1
2
3
4
5
6
//Relacionamos el boton del layout con botn java.
7
Button boton = (Button)findViewById(R.id.btnBoton);
8
//Lo ponemos a escuchar para cuando sea pulsado
9
boton.setOnClickListener(this);
10
11
}
12
13
//Aqu se ir administrando cuando un botn es pulsado
14
@Override
15
16
public void onClick(View v) {
17
/*Comprobamos a que id pertenece el id del botn pulsado,
18 en este caso como solo tenemos 1
19
siempre va a ser el mismo pero se puede dar el caso de
20 que haya ms de un botn, entonces aqu se controlara que botn
21 se ha pulsado.
22
*/
23
switch(v.getId()){
24
case R.id.btnBoton://Si el id del botn pulsado se
25 corresponde con el id que tenemos aqu entrara dentro del case.
26
//Aqu va el cdigo que se va a ejecutar cuando
27 se pulse el botn.
28
}
}
}
3 forma: Se aade un atributo en el diseo del botn llamado onClick disponible a partir de la
versin 1.6 (para m la forma ms fcil).
<Button
1
android:id="@+id/btnBoton"
2
android:layout_width="wrap_content"
3
android:layout_height="wrap_content"
4
android:text="Botn"
5
android:onClick="nombre del mtodo sin parntesis al a que
6
ira al pulsar el botn"
7
/>
Atencin: tenemos que importar todos los paquetes que se nos solicite, de lo contrario no
29
30
Button
Botones simples, para realizar acciones al pulsar sobre ellos.
<button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Plsame"
android:layout_centerInParent="true"
android:id="@+id/button1"/>
});
En este caso, hemos declarado una variable como miembro de la clase, (public int contador = 0;),
para que cada vez que pulsemos el botn nos salga un mensaje con el nmero de veces que lo
hemos pulsado:
31
EditText
Son campos de texto en los que el usuario puede escribir.
<edittext android:layout_width="200dip"
android:layout_height="wrap_content"
android:layout_above="@id/button1"
android:id="@+id/editText1"
android:layout_centerInParent="true"/>
final EditText editText1 = (EditText) findViewById(R.id.editText1);
editText1.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
if (arg1 == KeyEvent.KEYCODE_ENTER){
Toast.makeText(
editText1.getContext()
, "Escribiste: " + editText1.getText()
, Toast.LENGTH_SHORT)
.show();
return true;
}
return false;
}
});
Lo que hemos hecho con este EditText, es fijarle un onKeyListener, que comprobar (con el if), que
hemos pulsado la tecla enter, y si es cierto, mostrar el texto escrito:
32
ImageView
Nos permite mostrar imgenes en la pantalla.
<imageview android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon"/>
final ImageView imageView1 = (ImageView) findViewById(R.id.imageView);
imageView1.setImageResource(R.drawable.icon);
CheckBox
Es un tipo de botn con dos estados, activo o inactivo, practicamente tiene el mismo
comportamiento de un botn, una de sus caractersticas es que podemos comprobar si el botn esta
activo o no:
<checkbox android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="CheckBox"
33
@Override
public void onCheckedChanged(CompoundButton arg0, boolean checked) {
if (checked) Toast.makeText(checkbox1.getContext(), "Activo", Toast.LENGTH_LONG).sho
else Toast.makeText(checkbox1.getContext(), "Inactivo", Toast.LENGTH_SHORT).show();
}
});
En este caso, hemos usado como listener onCheckedChanged, que se ejecutar cada vez que el
estado del checkbox cambie.
Estos son los componentes grficos bsicos, tambin disponemos de RadioButton, ToggleButton
(Parecidos a los checkBox, pero con una luz que se ilumina al estar activos, y con la caracterstica
de que el texto cambia dependiendo de su estado, aunque esto se puede conseguir con el checkbox
facilmente.)
En general con echar un vistazo a los mtodos y listeners de cada componente, y con la
documentacin que ofrece javadoc en eclipse, lograremos entender como funciona cada uno, y
podremos usarlos fcilmente.
34
Manejador de eventos:
Si ests creando un descendiente de la clase View, podrs utilizar varios mtodos (callback)
directamente usados como manejadores de eventos por defecto (Event Handlers). En esta lista se
incluye:
onKeyDown(int KeyCode, KeyEvent e) Llamado cuando una tecla es pulsada.
onKeyUp(int keyCode, KeyEvent e) Llamado cuando una tecla deja de ser pulsada.
onTrackballEvent(MotionEvent me) Llamado cuando se mueve el trackball.
onTouchEvent(MotionEvent me) Llamado cuando se utiliza la pantalla tctil.
onFocusChanged(boolean obtengoFoco, int direccion, Rect prevRectanguloFoco) Llamado
cuando cambia el foco.
Es la forma ms sencilla, dado que no hace falta user una interfaz, ni registrar el mtodo callback.
35
15
16
/>
17
<RadioGroup
18
android:id="@+id/rg1"
19
android:layout_width="fill_parent"
20
android:layout_height="wrap_content"
21
android:orientation="vertical">
22
<RadioButton android:id="@+id/rb1" android:text="Radio
23 1" />
24
<RadioButton android:id="@+id/rb2" android:text="Radio
25 2" />
26
<RadioButton android:id="@+id/rb3" android:text="Radio
27
3" />
28
</RadioGroup>
29
<TextView
30
android:id="@+id/tvRadioGroup1"
31
android:layout_width="fill_parent"
32
android:layout_height="wrap_content"
33
android:text="RadioGroup: No hay ningn radio
34
seleccionado"
35
/>
36
<Spinner
37
android:id="@+id/spn1"
38
android:layout_width="250dp"
39
android:layout_height="wrap_content"
40
android:layout_centerHorizontal="true"
41
android:layout_marginTop="2dp"
42
/>
43
<TextView
44
android:id="@+id/tvSpinner"
45
android:layout_width="fill_parent"
46
android:layout_height="wrap_content"
/>
</LinearLayout>
Ahora el cdigo java que corresponde a los click de usuario:
1 public class MainActivity extends Activity {
2
private CheckBox checkBox;
3
private TextView tvCheckBox, tvRadioGroup, tvSpinner;
4
private RadioButton rb1, rb2, rb3;
5
private Spinner spn1;
6
7
@Override
37
38
40
android.app.Activity;
android.os.Bundle;
android.widget.ArrayAdapter;
android.widget.ListAdapter;
android.widget.ListView;
41
}
}
</string>
Como vemos, al crear el arrayAdapter, tenemos que pasar tres parmetros, el contexto, un layout
que se usar para dibujar cada item (en este caso simple_list_item_1, que ya viene definido por
android), ms adelante veremos como crear los nuestros propios, y como tercer parmetro la
coleccin de datos.
Aprovechando que en la anterior entrada hablamos de los eventos, voy a explicar como fijar un
evento onclick para cada elemento de la lista.
//Evento que se disparar al pulsar en un elemento de la lista
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView< ?> arg0, View arg1, int arg2,
long arg3) {
ListAdapter la = (ListAdapter) arg0.getAdapter();
Toast.makeText(
arg1.getContext()
,la.getItem(arg2).toString()
,Toast.LENGTH_LONG)
.show();
};
});
Para realizar este tipo de cosas, android proporciona una clase llamada ListActivity, este tipo de
clase necesita que exista una vista con el id ya definido por Android @android:id/list y otra con el
id @android:id/empty (Tal y como lo definimos en nuestro layout), as, si el adaptador que le
asiganamos a la lista no tiene datos, se mostrar al usuario la vista empty, el cdigo quedara de la
42
android.app.ListActivity;
android.os.Bundle;
android.view.View;
android.widget.ArrayAdapter;
android.widget.ListAdapter;
android.widget.ListView;
android.widget.Toast;
43
44
A continuacin vamos a crear el adaptador desde cero, siendo necesario extender de la clase
BaseAdapter.
package app.elbauldelprogramador.adapters2;
import java.util.ArrayList;
import
import
import
import
import
import
import
android.content.Context;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.BaseAdapter;
android.widget.ImageView;
android.widget.TextView;
45
return arg1;
class ContenedorView{
TextView nombreVersion;
TextView numeroVersion;
ImageView logoVersion;
}
}
</versionesubuntu>
Lo que hace esta clase es lo siguente, en su constructor, carga un objeto LayoutInflater, que infla los
objetos XML del layout para que podamos usarlos, convirtindolos en un objeto java.
Tambin tenemos tres mtodos sencillos (getCount, getItem, getItemId), que se encargan de
devolver el nmero de elementos de la coleccin, un elemento en concreto y el identificador de un
elemento.
46
Por ltimo, tan solo queda usar el adaptador que hemos creado en los pasos anteriores en nuesta
Actividad principal, en este caso, una ListActivity:
package app.elbauldelprogramador.adapters2;
import java.util.ArrayList;
import android.app.ListActivity;
import android.os.Bundle;
public class Adaptadores2Activity extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<versionesubuntu> versiones =
new ArrayList</versionesubuntu><versionesubuntu>();
versiones.add(
new VersionesUbuntu("Lucid Lynx", "10.4 LTS", R.drawable.lucid));
47
}
}
</versionesubuntu>
48
Ya tenemos el objeto de nuestro spinner. Ahora para poblarlo usamos un ArrayAdapter. Voy a
comentar tres formas de hacerlo, dos de ellas bastante populares por internet, poblarla desde un
archivo xml de arrays y desde la base de datos SQLite de Android, y una no tan popular pero
bastante til (y ms compleja). Despus de esto comentar como obtener los datos elegidos por el
usuario y porque me gusta ms el tercer mtodo para segn qu cosas.
Poblando Spinners
Desde arrays.xml
Bien amigos, para esto necesitamos un archivo arrays.xml con los textos que queramos rellenar en
el spinner y un par de lneas de cdigo. El archivo arrays.xml, situado en res/values, tiene el
siguiente formato.
1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3
<string-array name="comidas">
4
<item>Salchichas</item>
5
<item>Huevos</item>
6
<item>Tomates</item>
7
</string-array>
8 </resources>
Bien, una vez que tengamos esto vamos a nuestro activity en java y utilizamos el siguiente cdigo
que explicar despus.
1 //Creamos el adaptador
2 ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.comid
3 //Aadimos el layout para el men
49
Desde SQLite
Android proporciona para nuestro deleite personas una base de datos SQLite. Aqu es posible que
tengamos los datos que necesitamos para poblar nuestro Spinner. Vamos a ello.
Me ahorro el explicar cmo crear una base de datos SQLite en android, si necesitis informacin
sobre cmo manejarla ya sabis, internet tiene la respuesta, solo dir que est abierta en el objeto
baseDatos, que la tabla donde estn los datos se llama comidas y la columna con lo que lo vamos a
poblar nombres, adems de una id.
Vamos con el cdigo.
1
2
3
4
5
6
7
8
//Creamos el cursor
Cursor c = baseDatos.rawQuery("select id AS _id, nombre from comidas", null);
//Creamos el adaptador
SimpleCursorAdapter adapter2 = new SimpleCursorAdapter(this,android.R.layout.simple_spi
//Aadimos el layout para el men
adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//Le indicamos al spinner el adaptador a usar
prueba.setAdapter(adapter2);
Veamos, con el cursor hacemos un Query a la base de datos. Aqu hay un detalle importante, para
que esto funcione necesitamos que la columna del identificador se llame _id, pero, no s por qu, si
la llamas as en la base de datos y luego haces un select normal no funciona, cosas de google (un
bug?). Con AS funciona estupendamente. El segundo parmetro es para parmetros de seleccin,
como no queremos nada pues le ponemos null.
Vayamos con el adaptador, que tiene tela. Creamos el adaptador en base a un cursor. Los parmetros
son el contexto y el layout por defecto, como en el caso anterior, el cursor que hemos creado en la
lnea anterior, un array de String donde le indicamos que columna es la que tiene que tomar para
mostrarlo y de nuevo otro layout por defecto que, sinceramente, no s muy bien que hace.
50
Desde un objeto
En ocasiones necesitamos poblar el Spinner con elementos que no estn en SQLite o en un array,
como puede ser elementos que nos vengan desde una conexin a una base de datos, creados
dinmicamente, o lo que sea.
Veamos los ingredientes; un spinner, que ya tenemos, una clase que genere los objetos que
queramos, con su toString sobrescrito, unas cuantas lneas similares a las anteriores y sazonar al
gusto.
Vamos con la clase de los objetos, que no tiene mucho misterio, pero bueno.
1 public class ObjetosClase{
2
int id;
3
String nombre;
4
//Constructor
5
public ObjetosClase(int id, String nombre) {
6
super();
7
this.id = id;
8
this.nombre = nombre;
9
}
10
@Override
11
public String toString() {
12
return nombre;
13
}
14
public int getId() {
15
return id;
16
}
17 }
Creo que est claro, no hay que explicarlo. El getId lo usaremos en el siguiente punto, paciencia.
Vale, ahora a crear el spinner.
1
2
3
4
5
6
7
8
9
10
11
//Creamos la lista
LinkedList<ObjetosClase> comidas = new LinkedList<ObjetosClase>();
//La poblamos con los ejemplos
comidas.add(new ObjetosClase(1, "Salchichas"));
comidas.add(new ObjetosClase(2, "Huevos"));
comidas.add(new ObjetosClase(3, "Tomate"));
//Creamos el adaptador
ArrayAdapter<ObjetosClase> spinner_adapter = new ArrayAdapter<ObjetosClase>(this, andr
//Aadimos el layout para el men y se lo damos al spinner
spinner_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
prueba.setAdapter(spinner_adapter);
Si controlas un poco de java ves que he creado un nuevo LinkedList y he metido ah los objetos con
las 3 comidas que estamos utilizando.
Despus he creado el ArrayAdapter como en el primer caso, solo que esta vez lo hemos creado
51
Perfecto, ahora en cuanto un usuario pulse una opcin de nuestro spinner se guardar en la variable
alimentoId el id de nuestra comida escogida.
Como podis ver, utilizando nuestros propios objetos es mucho ms sencillo recuperar los datos.
Podemos crear objetos relativamente grandes, con varios datos, y obtenerlos y tratarlos como
queramos en el oyente. Estoy casi seguro que con el primer mtodo tambin se podra sacar el id (o
lo que queramos) de forma muy similar, pero no lo he conseguido.
52
Options Menu
Lo ms simple y sencillo es definir los mens en XML, colocado en ./res/menu, para este ejemplo
he definido el siguiente menu, que contiene dos elementos, un About y un Quit:
< ?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/about"
android:icon="@drawable/about"
android:title="About App">
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/submenu"
android:title="Submen de &quot;About App&quot;"/>
</menu>
</item>
<item android:id="@+id/quit"
android:title="Quit App"
android:icon="@drawable/quit"/>
</menu>
Bien, voy a explicar un poco la estructura de este men, Empezamos declarando el men con la
etiqueta
, que contendr todos sus elementos bajo la etiqueta , en este caso, tambin tenemos un submenu,
que se declara igual que el men principal.
Los atributos de cada elemento son su identificador, el icono a mostrar y el ttulo.
Para poder usar este men, necesitamos inflarlo (Convertir el fichero XML en un objeto java), para
hacer esto, hay que llamar a MenuInflater.inflate(), el cdigo siguiente infla el fichero xml anterior
en el mtodo callback onCreateOptionsMenu().
53
Ahora, tenemos que responder a las acciones del usuario cuando pulse algn elemento de nuestro
men, para ello vamos a sobreescribir el mtodo onOptionsItemSelected()
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.about:
Toast.makeText(
MenusActivity.this
,"Ejemplo Mens App"
,Toast.LENGTH_LONG)
.show();
return true;
case R.id.quit:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
Context Menu
Los mens contextuales son similares a los mens mostrados al hacer click con el botn derecho de
un ratn en un PC, para crearlos, debemos sobreescribir el mtodo onCreateContextMenu(), donde
inflaremos el archivo xml.
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.ejemplo_menu, menu);
}
Al igual que en los options menu, tenemos que responder a las acciones del usuario:
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.about:
Toast.makeText(
MenusActivity.this
,"Ejemplo Mens App"
54
default:
return super.onOptionsItemSelected(item);
}
Pero este men contextual no se va a mostrar, ya que tenemos que asociarlo para que se lanze al
realizar una pulsacin prolongada sobre una view, en este caso un botn:
final Button boton = (Button) findViewById(R.id.button1);
registerForContextMenu(boton);
55
56
57
58
Submen
Pues bien, lo nico que tenemos que tener son dos mtodos en la actividad donde queramos que
aparezca el men.Un mtodo sera para crear el men public boolean
onCreateOptionsMenu(Menu menu) y otro mtodo para realizar la accin que le digamos al
pulsar una opcin del submen public boolean onOptionsItemSelected(MenuItem item).Estos
mtodos ya estn predefinidos, es decir no se les puede cambiar el nombre o no harn su funcin.
El primer mtodo(para disear el men principal y submen) sera as (dentro del cdigo comento
que hace cada trozo de cdigo):
59
1
2
3
4
5
6
switch(item.getItemId()){
7
case 10: //Id del men, para combrobar que se ha
8 pulsado
9
Toast.makeText(this,"Has pulsado la Opcin 0 del
10
men salir",Toast.LENGTH_LONG).show();
11
break;
12
case 11:
13
Toast.makeText(this,"Has pulsado la Opcin 1 del
14
men salir",Toast.LENGTH_LONG).show();
15
break;
16
case 20:
17
Toast.makeText(this,"Has pulsado la Opcin 0 del
18
19 men informacin",Toast.LENGTH_LONG).show();
break;
20
case 21:
21
Toast.makeText(this,"Has pulsado la Opcin 1
22
23 del men informacin",Toast.LENGTH_LONG).show();
break;
}
return true;//Consumimos el item, no se propaga
}
Este sera el resultado en pantalla de este ejemplo despes de pulsar el botn de men del
dispositivo android:
61
62
Notificaciones Toast
Una notificacin Toast es un mensaje que se muestra superpuesto en la pantalla. Solo ocupa el
espacio necesario para mostrar la alerta, mientras tanto, la actividad que estaba visible puede seguir
usndose. Este tipo de notificaciones se muestran durante un periodo de tiempo y desaparecen, no
permiten interactuar con ellas. Debido a que un Toast se crea mediante un servicio en segundo
plano, puede aparecer aunque la aplicacin no est visible.
A lo largo de todas las entradas sobre Android, se ha usado mucho este tpo de notificaciones:
Toast.makeText(context, text, duration).show();
63
Hay que asignar un id al LinearLayout, que usaremos posteriormente. Tambin hemos creado un
ImageView para mostrar un icono, y un TextView para mostrar el mensaje.
El siguiente paso es inflar este layout desde el cdigo:
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(
R.layout.toast_layout
,(ViewGroup) findViewById(R.id.toastLayout));
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
64
//Agregando sonido
notification.defaults |= Notification.DEFAULT_SOUND;
//Agregando vibracin
notification.defaults |= Notification.DEFAULT_VIBRATE;
Intent notificationIntent = new Intent(this, NotificacionesActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
mNotificationManager.notify(HELLO_ID, notification);
El resultado es el siguiente:
65
Al igual que los Toast, se puede crear un layout personalizado, para ms informacin visite:
http://developer.android.com/guide/topics/ui/notifiers/notifications.html
Dilogos
Por ltimo, vamos a ver los dilogos, que son ventanas que se muestran delante de las actividades, y
pueden recibir acciones del usuario, hay varios tipos:
AlertDialog
ProgressDialog
DatePickerDialog
TimePickerDialog
Si necesitamos un Dilogo que no sea uno de los de arriba, podemos extender de la clase Dialog, y
crear el nuestro propio.
La clase Activity implementa mtodos para gestionar los dialogos, son:
66
67
68
69
El directorio Layout, es el que viene por defecto, es decir todos los dispositivos cogern el diseo
de la aplicacin de ese directorio, sin embargo si creamos los directorios layout-large, layout-small
y layot-xlarge, cada dispositivo coger automticamente dependiendo de su tamao y resolucin el
diseo que se encuentre en el directorio que mejor se adapte al dispositivo, es decir si yo tengo una
tablet y el tamao de pantalla es de 10.1 pulgadas automtica mente coger el diseo del directorio
layout-xlarge, pero en cambio si tengo un dispositivo mvil con una pantalla de 2.7 pulgadas,
obtendr el diseo del directorio layout-small.
En resumidas cuentas, tenemos que crear un diseo diferente para cada densidad en sus respectivos
directorios, pero siempre poniendo el mismo nombre a cada una de ellas.
70
Con estilos:
<textview style="@style/CodeFont"
android:text="@string/hello" />
Definiendo estilos
Los estilos se definen en un fichero de recursos distinto al layout, colocado en el directorio
/res/values. stos ficheros no tienen porqu tener un nombre en concreto, pero por convencin se
suelen llamar styles.xml themes.xml
El nodo raiz de estos archvos debe ser .
Para cada estilo que queramos definir, hay que aadir un elemento
y un atributo name para ese estlo (es obligatorio), despus, aadiremos un elemento para cada
propiedad del estilo, que debe tener obligatoriamente el atributo name que declara la propiedad del
estilo y su valor. Los valores para pueden ser una palabra clave, valor hexadecimal, una referencia a
un recurso u otro valor dependiendo de la propiedad del estilo. Veamos un ejemplo:
<style name="CodeFont" parent="@android:style/TextAppearance.Medium">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#00FF00</item>
<item name="android:typeface">monospace</item>
</style>
71
Herencia
Como acabamos de ver, el atributo parent sirve para heredar propiedades de otros estilos, podemos
heredar tanto de estilos del sistema como de los nuestros propios:
Del sistema:
<style name="GreenText" parent="@android:style/TextAppearance">
<item name="android:textColor">#00FF00</item>
</style>
En este caso, no usamos el atributo parent, ya que estamos usando un estilo propio, tambin se
puede apreciar que podemos heredar cuantas veces queramos, como es el caso de
(CodeFont.Red.Big)
72
A continuacin, dejo una captura del ejemplo que he hecho para esta entrada, que se puede
descargar desde aqu.
73
74
75
./res/values/style.xml
< ?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MiTema" parent=
"@android:style/Theme.Light">
<item name="android:windowBackground">
@drawable/fondo</item>
<item name="cabecera">
@style/TituloRojo</item>
</style>
<style name="TituloRojo"
parent="@android:style/TextAppearance.Large">
<item name="android:textColor">#FF0000</item>
<item name="android:textStyle">bold</item>
</style>
</resources>
76
Recursos string
Android permite definir strings en uno o ms archivos XML de recursos. Estos archivos estn bajo
el directorio ./res/values. El nombre del archivo XML para este tipo de recurso puede ser
cualquiera, pero por convencin se suele llamar strings.xml. Veamos un ejemplo de este fichero:
< ?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello</string>
<string name="app_name">Hello app_name</string>
</resources>
Cuando este archivo se crea o modifica, el plugin ADT de eclipse automticamente crear o
actualizar una clase java de nuestra aplicacin llamada R.java alojada en el directorio ./gen, que
contiene los IDs nicos para las dos cadenas que acabamos de crear.
Para el fichero strings.xml que acabamos de crear, tendremos lo siguiente en la clase R:
package nombre.de.nuestro.paquete;
public final class R {
//.. otras entradas dependiendo de tu proyecto y aplicacin
Como vemos como primero R.java define una clase principal en el paquete raiz: public final class
R. Depues, define una clase interna llamada public static final class string. R.java crea esta clase
esttica interna como espacio de nombres para guardar los IDs de los recursos string.
77
Ahora, el plugin ADT de eclipse se encargar de actualizar el fichero R.java, que contendr lo
siguiente:
package nombre.de.nuestro.paquete;
public final class R {
//.. otras entradas dependiendo de tu proyecto y aplicacin
78
La lnea setContentView(R.layout.main); seala que hay una clase esttica llamada R.layout y, que
dentro de esa clase hay una constante entera llamada main que apunta a una vista definida por un
fichero de recursos layout xML. El nombre del fichero XML es main.xml, el cual debe estar en el
directorio ./res/layout. El contenido de este fichero es el siguiente:
< ?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<textview android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<button android:id="@+id/b1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
</linearlayout>
Vamos a ver la composicin de este fichero, como elemento raiz tenemos un elemento llamado
TextView seguido de un Button. Un LinearLayout coloca a sus hijos uno detrs de otro vertical u
horizontalmente.
Para cada pantalla que queramos hacer, necesitaremos ficheros layout distintos, mejor dicho, cada
layout debe estar en un fichero, como ./res/layout/screen1.xml y ./res/layout/screen2.xml
Por cada archivo de layout que tengamos en ./res/layout, se generar una entrada en R.java. Por
ejemplo, si tenemos estos dos archivos, file1.xml y file2.xml, en R.java aparecer:
// ...
public static final class layout {
public static final int file1=0x7f030000;
79
Las vistas definidas en estos layout, como el TextView son accesibles mediante cdigo java a travs
sus IDs de recursos generadas en R.java.
TextView tv = (TextView) this.findViewById(R.id.text1);
tv.setText("Texto para el TextView")
El valor del atributo id, indica que la constante llamada text1 ser usada para identificar nicamente
a esa vista. El signo + de +id/text1 significa que el ID text1 ser creado si no existe. En la siguiente
entrada se tratar la sintaxis de los recursos.
80
3 Elegimos el nombre del paquete en el que se encuentra la aplicacin, en este caso se llama:
81
4 Ahora en el directorio del proyecto res/layout, nos aparece un xml llamado main.
Ese main.xml lo editamos y ponemos este cdigo:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
1
2
3
4
5
6
<TextView
7
android:layout_width="fill_parent"
8
android:layout_height="wrap_content"
9
android:text="Introduce una cadena de carcteres para
10
11 mostrarlo en la siguiente actividad" />
12
<EditText
13
android:layout_width="fill_parent"
14
android:layout_height="wrap_content"
15
android:id="@+id/etCadena"
16
/>
17
<Button
18
android:layout_width="wrap_content"
19
android:layout_height="wrap_content"
20
android:text="Cambiar de actividad"
21
android:onClick="cambiarActividad"
22
/>
</LinearLayout>
Nos quedar algo as:
82
83
84
package es.inforjmr.pasardatos;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class ResultadoActivity extends Activity {
TextView tvDatosRecibidos; //TextView donde se mostrra la
86
1
2
3
4
5
6
<uses-sdk android:minSdkVersion="8" />
7
8
<application
9
android:icon="@drawable/ic_launcher"
10
android:label="@string/app_name" >
11
<activity
12
android:name=".PasarDatosActivity"
13
android:label="@string/app_name" >
14
<intent-filter>
15
<action android:name="android.intent.action.MAIN"
16
/>
17
18
<category
19
android:name="android.intent.category.LAUNCHER"
/>
20
</intent-filter>
21
</activity>
22
<activity
23
android:name=".ResultadoActivity"></activity>
24
</application>
25
</manifest>
RESULTADO:
87
88
90
92
93
3. Para definir la vista en landscape es necesario crear una carpeta llamada layout-land dentro del
directorio res. Dentro de esta carpeta vamos a crear un nuevo archivo XML llamado main.xml en el
que definiremos lo siguiente:
Como puedes ver, el contenido de ambos archivos es casi idntico. Hemos definido un
LinearLayout como elemento raz del archivo, y dentro de l hemos colocado dos botones, el
94
android.app.Activity;
android.os.Bundle;
android.provider.ContactsContract.Contacts;
android.widget.Button;
android.net.Uri;
android.view.View;
android.content.Intent;
95
startActivityForResult(i, PICK_REQUEST);
viewButton=(Button)findViewById(R.id.ver);
viewButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
startActivity(new Intent(Intent.ACTION_VIEW, contact));
}
});
restoreMe(savedInstanceState);
viewButton.setEnabled(contact!= null);
}//Fin de onCreate()
@Override
protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
if (requestCode==PICK_REQUEST) {
if (resultCode==RESULT_OK) {
contact=data.getData();
viewButton.setEnabled(true);
}
}
}//Fin de onActivityResult()
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (contact!=null) {
outState.putString("contact", contact.toString());
}
}//Fin de onSaveInstanceState()
private void restoreMe(Bundle state){
contact=null;
if (state!=null) {
String contactUri=state.getString("contact");
if (contactUri!=null) {
contact=Uri.parse(contactUri);
}
96
Layout en Portrait
97
Layout en Landscape
99
100
Para qu sirve esto? Cuando ejecutemos nuestra aplicacin y rotemos horizontalmente la pantalla,
si el programa detecta que existe una carpeta llamada layout-land en vez de rotar el main.xml
original (pudiendo perder la configuracin para que encaje en la pantalla) cargar el main.xml que
est dentro de layout-land.
Esto nos permite crear un xml para cuando estemos corriendo la aplicacin en vertical y otro para
cuando estemos en horizontal, asegurndonos de este modo que siempre tendremos un interface
grfico sin errores.
MOSTRAR UN MENSAJE RPIDO
Algunas veces es necesario informar al usuario o confirmarle una accin de forma
rpida y directa, para eso android contiene los llamados mensajes tipo toast, los cuales
se imprimirn en pantalla con el texto que queramos, evitndonos tener que crear una
nueva alerta, o si nos complicamos la vida, una nueva actividad.
El cdigo de un mensaje toast es tan sencillo como esto:
101
Toast.makeText(NOMBREACTIVIDAD.this,Elandroidelibre.com,Toast.LENGTH_SH
ORT).show();
Cmo decamos, se imprimen en pantalla durante unos segundos, no obstante si se quiere prolongar
algo ms el tiempo de prolongado no tenemos mas que modificar el comando SHORT por LONG.
PERO.. Y SI QUEREMOS UN MENSAJE MS DETALLADO?
Una vez vista la utilidad informativa del mensaje toastqu ocurre si lo que necesitamos es un
mensaje informativo que requiera de una interaccin con el usuario?.
Pongamos un ejemplo: grabamos un nombre de usuario y una contrasea y queremos que la
aplicacin nos lance un men donde aparezcan estos datos con un botn de confirmar o cancelar.
El toast simplemente muestra un texto (aunque tambin se puede crear con una
imagen) de modo que para interactuar con el usuario crearemos un alert dialog.
102
103
105
106
107
109
Para ver el cdigo y el funcionamiento vamos hacer un ejemplo muy prctico que seguro que a
muchos le gusta.
Crear una barra de progreso en Android:
El ejemplo que vamos a utilizar es una barra de progreso (ProgressBar) que mostraremos
inicialmente, a continuacin crearemos un thread y en su interior la funcin que queramos, en este
ejemplo simplemente ser un contador (tendremos que simular algn proceso que tarde algo para
poder ver funcionando el thread y no sea simplemente un parpadeo) y utilizaremos un handlet para
ir actualizando la barra de progreso (situada en el hilo principal) como hemos comentado para
actualizar datos de pantalla desde un hilo secundario (en nuestro caso el contador) hace falta un
puente, es decir, nuestro handler.
Como vamos a ver el Handler hay que declararlo al inicio:
private Handler puente = new Handler() {
@Override
110
Como vemos hay que pasarle un Message, en nuestro caso sera el contador hacia la progressbar.
Ahora mostramos el progressbar:
progressDialog = new ProgressDialog(EjemplotutoActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setMax(10000);
progressDialog.setProgress(0);
progressDialog.setCancelable(false);
progressDialog.show();
La barra de progreso la hemos puesto a 0 y su mximo ser 10000 as nos dar tiempo a verlo.
Creamos el Thread y lo ponemos en marcha con la funcion start() :
Thread th1 = new Thread(new Runnable() {
@Override
public void run() {
}
});
th1.start();
Ahora vamos hacer el paso importante pasar nuestro contador por un 'puente' handler hacia el
progressBar, lo haremos atravs de un Message :
Thread th1 = new Thread(new Runnable() {
@Override
public void run() {
for(int a=1;a<9999;a++){
int contador = a;
111
Como vemos enviamos un Message a nuestro Handler 'puente' y lo har 9998 veces ya que esta
dentro de un tnel, la velocidad como veris va un poco saturada al menos en el emulador. Ya solo
queda recivir el contador en el Handler e insertarlo en el ProgressBar:
private Handler puente = new Handler() {
@Override
public void handleMessage(Message msg) {
progressDialog.setProgress((Integer)msg.obj);
}
};
Como ya vis hay que hacer un casteo '(Integer)msg.obj' para convertir el mensaje en su forma
original, un Integer y aadirlo al progressBar atravs del .setProgress.
112
113
Nombre del
mtodo
exists()
getCanonicalPath()
getName()
getParent()
canRead()
canWrite()
lastModified()
length()
isFile()
isDirectory()
Significado
Verdadero si existe ese nombre.
Nombre de archivo completo (ruta).
Nombre de archivo relativo.
Directorio padre.
Devuelve true si el archivo se puede leer.
Devuelve true si en el archivo se puede escribir.
Ultima modificacin.
Tamao del archivo.
Devuelve true si es un archivo.
Devuelve true si es un directorio (puede no ser ni archivo ni
directorio).
114
Cdigo:
115
1
2
3
4
5
6
7
8
9
10
11
//Se encierra la lectura entre las sentencias try-catch
12
por si hay algn error en el transcurso de la lectura.
13
try {
14
//Mientra la linea sea distinto de null sigue leyendo
15
while((linea = leer.readLine()) != null){
16
//Aade el contenido de la linea al textoFinal
17
textoFinal.append(linea);
18
}
19
} catch (IOException e) {
20
//En caso de error muestra lo sucedido.
e.printStackTrace();
}
116
117
119
1
2
3
4
5
6
7
8
9
//Para obtener el espacio libre en la tarjeta SD.
10
double espacioLibre = (long) informacionSD.getBlockSize()
11 * (long) informacionSD.getFreeBlocks();
12
//Para obtener el espacio ocupado en la tarjeta SD le
restamos al tamao total el espacio libre.
double espacioOcupado = tamanioTotal - espacioLibre;
//Para obtener el tamao en megabytes, tenemos que dividir el
1 resultado por 1048576.
2 double megTotal = tamanioTotal / 1048576;
3
4 double megLibres = espacioLibre / 1048576;
5
6 double megOcupados = espacioOcupado / 1048576;
7
8 //Si se desea mostrar el valor con dos cifras decimales, se puede
9 utilizar un objeto DecimalFormat.
DecimalFormat formaDosDecimales = new DecimalFormat("#.##");
120
121
124
125
Para el caso de las actualizaciones y el borrado de datos tambin existen estas dos formas de
hacerlo.
Para las actualizaciones:
Por ejemplo cambiamos el nombre Pepito por el nombre Pedro Pikapiedras
Con el mtodo exectSQL():
bd.execSQL("UPDATE tablaprueba SET nombre='Pedro Pikapiedras'
WHERE nombre='Pepito' ");
Con el mtodo update():
1
126
2) El tipo de dato que contiene cada campo. Esto es importante, ya que si queremos obtener un
nmero de un campo numrico no lo vamos a hacer igual que si queremos obtener un valor de un
campo de texto.
127
128
Como podis comprobar, nos muestra un listado de todos los registros junto a la fecha y hora. Pues
129
Como podis comprobar la fecha del segundo registro no cambia, esto es debido a que ese da del
calendario fue lunes.
O ajustar la fecha al lunes anterior:
130
131
Configuracin de proyecto
A continuacin pasamos a explicar para qu sirven cada una de las carpetas y ficheros generados:
src En esta carpeta se alojarn todas las clases de nuestra aplicacin. Como podemos
observar tenemos una nica clase Main generada automticamente al crear el proyecto. Esta
ser la clase que inicie nuestra futura aplicacin. Si abrimos el fichero Main nos
encontramos con lo siguiente:
132
Cdigo inicial
Tenemos una clase Main que hereda de la clase Activity. En nuestro proyecto tendremos tantas
clases como vistas (en el futuro las llamaremos actividades) tenga nuestra aplicacin y todas deben
heredar de Activity. Al heredar de la clase Activity debemos sobrescribir algunos mtodos, unos de
forma obligatoria y otros de forma optativa si nuestra aplicacin lo requiere. Uno de los mtodos
que siempre hay que sobrescribir es el mtodo onCreate. Este mtodo siempre recibe un objeto de
la clase Bundle que hace referencia al estado en el que se encuentra nuestra aplicacin, onCreate
siempre se activar nada ms crearse la aplicacin luego siempre tendremos que darle
funcionalidad. Tenemos la opcin de rescribir ms mtodos que hace referencia a estados en los que
puede entrar nuestra aplicacin como por ejemplo onDestroy (mtodo que se activa cuando salimos
de la aplicacin) u Como podemos observar dentro del mtodo, se hace una llamada a la clase
padre Activity mediante la lnea super.onCreate(savedInstanceState), esta sentencia es
recomendable hacerla siempre que estemos sobrescribiendo un mtodo de una clase padre. Por
ltimo, nos encontramos con la llamada a un mtodo de la clase Activity setContentView que es el
encargado de cargar la interfaz que tendr nuestra actividad, este mtodo recibe una direccin de
memoria R.layout.main que apunta a un fichero xml de cuya estructura hablaremos ms adelante.
res: Vamos a dar un pequeo salto a la carpeta res, s, ya s que me he pasado de largo la
carpeta gen, pero creo que es lo mejor para seguir una explicacin lgica. Esta carpeta va a
ser la encargada de guardar todos los recursos que necesitemos usar en nuestra aplicacin
(imgenes, xml de interfaz, xml de strings, sonidos, audios, etc). Android gestiona los
recursos de una forma muy peculiar, a cada recurso le asigna una direccin y lo define como
un atributo de una clase llamada R (esta clase se encuentra en la carpeta gen), recordis
como cargbamos la interfaz a nuestra actividad? R.layout.main, ms tarde volveremos a
ello.
Si nos fijamos, tenemos tres carpetas llamadas drawable: drawable-hdpi, drawable-mdpi,
drawable-ldpi. En estas carpetas irn alojadas las imgenes de nuestra aplicacin y sus
extensiones (higth, medium y low) hacen referencia al tipo de densidad de pantalla de
nuestro dispositivo o emulador. En principio no es relevante donde coloquemos las imgenes
a no ser que queramos optimizar nuestra aplicacin. Tenemos la opcin de crearnos
una carpeta llamada drawable (sin extensin) donde coloquemos todas nuestras imgenes o
tenemos la opcin de poner las imgenes en cualquiera de las tres, yo personalmente
siempre opto por meterlas en drawable-hdpi. Si abrimos cualquiera de las tres carpetas
133
Configurando interfaz
Como podemos observar, disponemos de una paleta llena de componentes para crear interfaces de
usuario, podemos aadir botones, listas, etiquetas de texto, imgenes, etc, simplemente
arrastrndolos a nuestro lienzo. Si pulsamos en la etiqueta main.xml (al lado de Graphical
Layout) podemos observar el xml puro y como se definen y programan todos los componentes.
XML de la interfaz
En este xml de interfaz tenemos definido un LinearLayout que no es ms que una especie de
contenedor que albergar componentes de forma consecutiva, en este caso alberga un componente
de tipo TextView que es una etiqueta de texto. Cada componente (o tag xml) tiene atributos, en el
caso del TextView vemos que tiene un atributo android:text cuyo valor corresponde al contenido
textual que tendr dicha etiqueta de texto. Este valor est almacenado en @string/hello, la variable
@string apunta a un fichero xml strings.xml que contiene todos los strings que vayamos a usar en
nuestra aplicacin.
Seguimos con la carpeta values donde nos encontramos con el fichero strings.xml
mencionado anteriormente. La filosofa de Android es intentar separar lo mximo posible la
parte de la interfaz de la aplicacin con respecto a la lgica y a los datos, luego todas las
cadenas de texto que utilicemos, ya sean nombres de botones, etiquetas de texto, etc,
134
Android Resources
De momento, slo hay declarados dos strings: Un string hello que hace referencia al valor de
nuestro TextView, cuyo valor textual es Hello World, Main! y cuyo identificador para poder
referenciarlo en los ficheros xml de interfaz (en este caso en el fichero /res/layout/main.xml) es
hello. Y, por ltimo, un string app_name cuyo valor es el nombre de nuestra aplicacin Ejercicio1 y
que ms adelante veremos dnde se referencia.
Vamos ahora con la carpeta gen, esa que nos hemos saltado anteriormente. Si os acordis
mencion que Android referenciaba todos los recursos (imgenes, audios, xml de interfaz,
etc, guardados en la carpera res ) en una clase llamada R. Si abrimos la carpeta gen y la
clase R podemos comprobarlo nosotros mismos.
135
Cdigo
Si tenemos un poquito de experiencia en Java podremos observar como cada subcarpeta de
res est declarada como una clase static y como cada recurso de cada carpeta est declarado
como un atributo static de su correspondiente clase. De esta forma, podemos deducir que se
puede acceder a cualquier recurso de la aplicacin y desde cualquier clase de la forma
R.subdirectorio_res.nombre_recurso. Si recordamos, ya lo hicimos anteriormente para
cargar la interfaz de la actividad main en la clase /src/Main.java con la sentencia
setContentView(R.layout.main).
El ltimo fichero que vamos a explicar de la estructura del proyecto es el
AndroidManifest.xml. En este fichero se reflejan todos los permisos de nuestra aplicacin
(permisos para utilizar wifi, bluetooth, gps, etc) y todas las actividades que vayamos
creando. Cuando empecemos con nuestra primera aplicacin veremos cmo se declaran
determinados permisos.
Nuestra primera aplicacin paso a paso:
Esta primera aplicacin va a ser muy simple. Tendremos una nica actividad Main.java con una
interfaz main.xml que contendr una imagen (banner) y dos botones. Vamos a dar funcionalidad a
cada botn, de forma que al pulsar el primero obtengamos la direccin IP de nuestro dispositivo
mvil en una red wifi y al pulsar el segundo obtengamos la direccin MAC de la interfaz de red
wifi. La aplicacin resultante deber ser exactamente igual a la que os mostramos a continuacin:
136
Cdigo
Cargamos ahora los recursos de la carpeta resources que os dejamos adjunta al final del post.
Descargamos la carpeta y comprobamos que tenemos tres imgenes (flubanner.png, buttonip.png,
137
138
Cdigo
Debemos indicarle al mtodo onClick qu botn le ha llamado. Como podemos observar el
mtodo recibe un objeto de clase View, como apunte, debemos concretar que View es la
clase padre de todos los componentes incluido de Button, por lo que nos ser fcil filtrar el
id del componente pulsado. Para filtrar el Button pulsado slo tendremos que hacer una
comparacin del id del Button con un switch o un simple if.
Implementando cdigo
139
Implementando cdigo
Como podemos ver, ambos mtodos crean un objeto de clase WifiManager y obtienen la
informacin correspondiente. En el caso de la direccin IP hay que recurrir a un mtodo de la clase
Formatter para poder obtenerla en un formato legible.
Una vez definidos los mtodos, slo tenemos que llamarlos en el lugar correspondiente y
mostrar por pantalla la informacin obtenida en forma de alerta Toast.
Implementando cdigo
Ya tenemos toda la funcionalidad definida de nuestra primera aplicacin peeero, esto
ahora mismo no va a funcionar, tenemos que dar permiso a nuestra aplicacin para que
pueda utilizar la interfaz wifi. Abrimos el fichero AndroidManifest.xml, pulsamos en la
pestaa Permissions, Add.. -> Uses Permission y buscamos un permiso de nombre
android.permission.ACCESS_WIFI_STATE. Lo dejamos indicado y ya podemos probar
nuestra primera aplicacin.
Antes de dar por finalizada la entrada hay que resaltar que si probamos la aplicacin mediante el
emulador obtendremos que nuestra ip es la 0.0.0.0 y nuestra mac es null. Esto es debido a que el
acceso a red mediante el emulador se hace a travs de un proxy por lo tanto la forma idnea de
probarla es cargando la aplicacin en un dispositivo Android. Para ello no hay ms que conectarlo
va USB y ejecutar la aplicacin al igual que lo hacemos con el emulador, Eclipse nos reconocer el
telfono automticamente y podremos probarla sin problemas.
140
Despus de haber aprendido la estructura de un proyecto Android y de haber hecho nuestra primera
aplicacin, vamos ahora a ponernos con cosas un poquito ms serias. En esta tercera entrada,
propondremos la realizacin de una aplicacin que haga una bsqueda de las redes Wifi que
tenemos a nuestro alrededor y que nos muestre sus parmetros, como por ejemplo el ssid y qu
seguridad utilizan. La aplicacin resultante debe tener la siguiente apariencia.
Nos ponemos manos a la obra y creamos un proyecto en Android cuyo nombre sea Ejercicio2,
como paquete com.fluproject.Ejercicio2, su target Android 2.2 y no nos olvidamos de indicarle
que queremos una clase principal llamada Main (si alguien no recuerda como se hace todo este
proceso que le eche un vistazo a las dos entradas anteriores).
Diseando la interfaz de la actividad Main:
Una vez tenemos nuestro proyecto creado nos vamos a poner a modelar la interfaz de la aplicacin.
Vamos a empezar por la primera actividad (clase Main) que, tal y como observamos en la imagen
anterior, tendr como elementos una imagen (ImageView) y un botn con funcionalidad (Button).
Lo primero que debemos hacer es meter las imgenes del archivo resources, que os adjuntamos en
la entrada, a la carpeta /res/drawable-hdpi/. Vamos ahora al fichero que define la interfaz de
nuestra actividad Main main.xml y lo dejamos con esta pinta:
141
Como podemos ver en el cdigo del main.xml, tenemos un LinearLayout principal que contendr
la imagen del banner de fluproject y otro LinearLayout. El segundo LinearLayout contendr un
TextView con el texto Escanea Wifi y un Button con forma de imagen. El motivo de separar la
interfaz en dos LinearLayout es conseguir darle gravedad slo al segundo LinearLayout
(android:gravity=center) de forma que slo se centren en la pantalla el TextView y el Button.
Una vez definida la interfaz, pasamos ahora a darle lgica.
Definiendo la funcionalidad de la actividad Main:
La funcionalidad de esta actividad es bastante sencilla, exactamente igual que la que utilizamos el
otro da para nuestra primera aplicacin. La nica diferencia es que aqu, adems de mostrar un
mensaje de texto, crearemos una nueva actividad y la mostraremos. A modo de recordatorio, las
actividades (Activity) se corresponden con las pantallas que tendr nuestra aplicacin. En la
navegacin por pantallas, Android trata las actividades mediante una pila de actividades, de
forma que siempre estaremos visualizando la actividad superior de dicha pil, la que se encuentre
en la cima. Cuando arranca una nueva actividad siempre se pone en la cima de la pila, en primer
plano. Cuando pulsamos el botn atrs estaremos realizando una accin equivalente a
desapilar , cerraremos la actividad actual y mostraremos la actividad que est en la cima de la
pila. Si no hay ninguna actividad ms, saldremos de la aplicacin.
142
Volviendo a la lgica de la actividad Main, tendremos una clase Main.java con esta apariencia:
new
Intent(this,
Wifilist.class);
144
Como podemos ver, disponemos de un LinearLayout que alberga dos TextView, el primero hace
referencia al ssid de la red y el segundo a la seguridad que tiene configurada. Y con esto ya
tendramos diseada la interfaz de nuestra actividad Wifilist.
Definiendo la funcionalidad de la actividad Wifilist:
Lo primero que vamos a hacer para definir la funcionalidad de Wifilist es crearnos una clase bsica
en Java llamada Element. Como hemos dicho anteriormente nuestra lista no va a contener items
simples sino que contendr items compuestos por dos TextView, esto debemos modelarlo en una
clase. La clase Element estar ubicada en el paquete com.fluproject.Ejercicio2 y tendr la
siguiente apariencia:
145
En la clase Element tendremos dos atributos uno ser title que har referencia en un futuro al SSID
de la red, y el otro subtitle que har referencia a la seguridad de la red. Adems tendremos dos
mtodos para obtener tanto el atributo title como el subtitle.
A continuacin, vamos a intentar explicar el cdigo que debe tener la clase Wifilist.java en tres
partes para intentar aclarar la funcionalidad.
146
Empezaremos nuestro cdigo Wifilist.java definiendo tres atributos de clase: nets -> array de
objetos Element que se encargar de guardar las redes descubiertas y posteriormente pasarle la
informacin a un ArrayAdapter para que la lista pueda ser construida; manWifi -> Objeto de la
clase WifiManager que nos permitir acceder a la interfaz Wifi de nuestro dispositivo mvil y
utilizar su funcionalidad; wifiList -> Objeto de la clase List donde guardaremos los Strings en bruto
resultado de un escner wifi.
Punto 1: En este punto llamamos a la interfaz wifi de nuestro dispositivo mvil y guardamos el
resultado en el atributo manWifi. Posteriormente realizamos el escner de redes mediante el
mtodo startScan() de la clase WifiManager y por ltimo guardamos el resultado en bruto en
nuestro atributo wifiList por medio del mtodo getScanResults().
Punto 2: En este punto vamos a parsear la informacin que nos interesa del resultado del escner
guardado en bruto en el atributo wifiList. Recorreremos la lista wifiList, rescataremos la
informacin que nos interesa de cada red (ssid y security) e iremos creando objetos Element y
guardndolos en nuestro atributo nets. Una vez parseada y guardada toda la informacin resultante
del escner cargaremos a nuestra actividad la interfaz correspondiente wifilist.xml. Despus
crearemos un array adaptador AdapterElements de objetos Elements para nuestra lista que
definiremos en el Punto 3.
Punto 3: Nos definimos una clase llamada AdapterElements que herede de ArrayAdapter. Esta
clase nos va a servir para construir nuestra lista a partir del atributo nets. Esta clase tendr un slo
atributo context que indicar el contexto donde se va a construir la lista, en la actividad presente.
147
148
Despus de haber aprendido la estructura de un proyecto Android y de haber hecho nuestra primera
aplicacin, vamos ahora a ponernos con cosas un poquito ms serias. En esta tercera entrada,
propondremos la realizacin de una aplicacin que haga una bsqueda de las redes Wifi que
tenemos a nuestro alrededor y que nos muestre sus parmetros, como por ejemplo el ssid y qu
seguridad utilizan. La aplicacin resultante debe tener la siguiente apariencia.
Nos ponemos manos a la obra y creamos un proyecto en Android cuyo nombre sea Ejercicio2,
como paquete com.fluproject.Ejercicio2, su target Android 2.2 y no nos olvidamos de indicarle
que queremos una clase principal llamada Main (si alguien no recuerda como se hace todo este
proceso que le eche un vistazo a las dos entradas anteriores).
Diseando la interfaz de la actividad Main:
Una vez tenemos nuestro proyecto creado nos vamos a poner a modelar la interfaz de la aplicacin.
Vamos a empezar por la primera actividad (clase Main) que, tal y como observamos en la imagen
anterior, tendr como elementos una imagen (ImageView) y un botn con funcionalidad (Button).
Lo primero que debemos hacer es meter las imgenes del archivo resources, que os adjuntamos en
la entrada, a la carpeta /res/drawable-hdpi/. Vamos ahora al fichero que define la interfaz de
nuestra actividad Main main.xml y lo dejamos con esta pinta:
149
Como podemos ver en el cdigo del main.xml, tenemos un LinearLayout principal que contendr
la imagen del banner de fluproject y otro LinearLayout. El segundo LinearLayout contendr un
TextView con el texto Escanea Wifi y un Button con forma de imagen. El motivo de separar la
interfaz en dos LinearLayout es conseguir darle gravedad slo al segundo LinearLayout
(android:gravity=center) de forma que slo se centren en la pantalla el TextView y el Button.
Una vez definida la interfaz, pasamos ahora a darle lgica.
Definiendo la funcionalidad de la actividad Main:
La funcionalidad de esta actividad es bastante sencilla, exactamente igual que la que utilizamos el
otro da para nuestra primera aplicacin. La nica diferencia es que aqu, adems de mostrar un
mensaje de texto, crearemos una nueva actividad y la mostraremos. A modo de recordatorio, las
actividades (Activity) se corresponden con las pantallas que tendr nuestra aplicacin. En la
navegacin por pantallas, Android trata las actividades mediante una pila de actividades, de
forma que siempre estaremos visualizando la actividad superior de dicha pil, la que se encuentre
en la cima. Cuando arranca una nueva actividad siempre se pone en la cima de la pila, en primer
plano. Cuando pulsamos el botn atrs estaremos realizando una accin equivalente a
desapilar , cerraremos la actividad actual y mostraremos la actividad que est en la cima de la
pila. Si no hay ninguna actividad ms, saldremos de la aplicacin.
150
Volviendo a la lgica de la actividad Main, tendremos una clase Main.java con esta apariencia:
new
Intent(this,
Wifilist.class);
152
Como podemos ver, disponemos de un LinearLayout que alberga dos TextView, el primero hace
referencia al ssid de la red y el segundo a la seguridad que tiene configurada. Y con esto ya
tendramos diseada la interfaz de nuestra actividad Wifilist.
Definiendo la funcionalidad de la actividad Wifilist:
Lo primero que vamos a hacer para definir la funcionalidad de Wifilist es crearnos una clase bsica
en Java llamada Element. Como hemos dicho anteriormente nuestra lista no va a contener items
simples sino que contendr items compuestos por dos TextView, esto debemos modelarlo en una
clase. La clase Element estar ubicada en el paquete com.fluproject.Ejercicio2 y tendr la
siguiente apariencia:
153
En la clase Element tendremos dos atributos uno ser title que har referencia en un futuro al SSID
de la red, y el otro subtitle que har referencia a la seguridad de la red. Adems tendremos dos
mtodos para obtener tanto el atributo title como el subtitle.
A continuacin, vamos a intentar explicar el cdigo que debe tener la clase Wifilist.java en tres
partes para intentar aclarar la funcionalidad.
154
Empezaremos nuestro cdigo Wifilist.java definiendo tres atributos de clase: nets -> array de
objetos Element que se encargar de guardar las redes descubiertas y posteriormente pasarle la
informacin a un ArrayAdapter para que la lista pueda ser construida; manWifi -> Objeto de la
clase WifiManager que nos permitir acceder a la interfaz Wifi de nuestro dispositivo mvil y
utilizar su funcionalidad; wifiList -> Objeto de la clase List donde guardaremos los Strings en bruto
resultado de un escner wifi.
Punto 1: En este punto llamamos a la interfaz wifi de nuestro dispositivo mvil y guardamos el
resultado en el atributo manWifi. Posteriormente realizamos el escner de redes mediante el
mtodo startScan() de la clase WifiManager y por ltimo guardamos el resultado en bruto en
nuestro atributo wifiList por medio del mtodo getScanResults().
Punto 2: En este punto vamos a parsear la informacin que nos interesa del resultado del escner
guardado en bruto en el atributo wifiList. Recorreremos la lista wifiList, rescataremos la
informacin que nos interesa de cada red (ssid y security) e iremos creando objetos Element y
guardndolos en nuestro atributo nets. Una vez parseada y guardada toda la informacin resultante
del escner cargaremos a nuestra actividad la interfaz correspondiente wifilist.xml. Despus
crearemos un array adaptador AdapterElements de objetos Elements para nuestra lista que
definiremos en el Punto 3.
Punto 3: Nos definimos una clase llamada AdapterElements que herede de ArrayAdapter. Esta
clase nos va a servir para construir nuestra lista a partir del atributo nets. Esta clase tendr un slo
atributo context que indicar el contexto donde se va a construir la lista, en la actividad presente.
155
156
En esta cuarta entrada del curso de introduccin a Android, veremos como podemos aprovechar el
Ejercicio2, que implementamos en la entrada anterior, para realizar un pequeo crackeador de redes
Wifi del estilo WLAN_XXXX o JAZZTEL_XXXX cuya seguridad sea WPA. La aplicacin
resultante deber tener la siguiente apariencia.
La aplicacin resultante har un escner de las redes Wifi que tengamos a nuestro alrededor y nos
mostrar en una lista las redes encontradas con una pequea descripcin de cada una. Cuando
seleccionemos una red de la lista podremos observar una descripcin ms detallada de ella,
pudiendo obtener tambin su clave si la red es del estilo WLAN_XXXX o JAZZTEL_XXXX.
Vamos entonces a crearnos un nuevo proyecto cuyo nombre sea FluWifiCracker, como paquete
com.fluproject.FluWifiCracker, su target Android 2.2 y como clase principal Main (si alguien no
recuerda como se hace todo este proceso que le eche un vistazo a las dos primeras entradas).
Diseando la interfaz de la actividad Main:
Nuestra primera actividad Main ser idntica a la propuesta en el Ejercicio2 de la entrada anterior.
Recordamos que esta actividad consta de un ImageView que se corresponde con el banner de Flu
Project y de un Button con imagen de fondo. Podemos entonces copiarnos el mismo fichero
main.xml que utilizamos en el Ejercicio2 a nuestra carpeta /res/layout y sustituirlo por el
existente. Tampoco se nos debe olvidar hacer lo propio con los recursos de la imagen del banner y
la imagen del botn.
157
El diseo de esta actividad cambia un poco con respecto al anterior ejercicio. En este caso hemos
querido dar ms informacin de cada red y aadirle adems una imagen que nos indique la potencia
de seal recibida de cada una. El fichero elements.xml que define cada item de la lista tendra el
siguiente aspecto:
En vez de utilizar un LinearLayout como contenedor de objetos, hacemos uso ahora del
contenedor TableLayout que alinea vistas en forma de tabla. Nuestro TableLayout estar
compuesto de filas llamadas TableRow. Cada TableRow tendr dos objetos, la primera y la
segunda fila tendrn dos TextView consecutivos y la ltima fila tendr un TextView y un
ImageView.
Definiendo la funcionalidad de la actividad Wifilist:
158
Para manejar eventos de la lista tenemos que implementar la interfaz OnItemClickListener (1) y
poner la instancia de ListView a escuchar mediante el mtodo setOnItemClickListener (2). Al
implementar la interfaz OnItemClickListener tendremos que rescribir el mtodo onItemClick.
Al cargar el aspecto de cada item de la lista, en el mtodo getView, se ha introducido un icono que
indica la potencia de seal recibida por cada red descubierta. Hemos introducido una comparacin
del valor numrico de la seal y hemos asociado un icono de cobertura para distintos rangos (3).
Volviendo a la captura de eventos de la lista, al implementar de OnItemClickListener rescribimos
el mtodo onItemClick (4). Cuando rescribimos el mtodo observamos que disponemos de un
argumento position. Dicho argumento nos servir para indexar en nuestro array de redes y sacar
toda su informacin para posteriormente envirsela a una nueva actividad.
Vamos a definirnos una nueva clase llamada WifiInfo.java. Para pasar elementos a la actividad que
representa dicha clase nos vamos a apoyar en el mtodo putExtra que nos ofrece la clase Intent.
Dicho mtodo enva un objeto representado por un tag textual para que luego pueda ser recogido en
159
Esta actividad tendr un diseo muy sencillo donde volveremos a apoyarnos en un TableLayout
como contenedor de objetos con el fin de alinearlos de forma ordenada. A continuacin mostramos
el fichero wifiinfo.xml que define el diseo de la actividad.
160
161
162