Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Instalaremos en primera instancia la versin del SDK 2.3.3 (la lnea 2 est orientada al desarrollo
de aplicaciones para celulares y la lnea 3 est orientada a tablet). Seleccionamos Available
packages y luego del lado derecho solo dejamos tildado la versin del SDK 2.3.3 (ms adelante
podemos instalar otras versiones de Android) Por ltimo procedemos a presionar el botn "Install
Selected":
En este dilogo asignamos un nombre a nuestro AVD, lo enlazamos con la versin de SDK
respectivo, fijamos un tamao al SD Card:
En este dilogo especificamos el nombre del proyecto y el nombre del paquete java donde se
almacenarn los archivos java que creemos.
El plugin de Android nos genera todos los directorios y archivos bsicos para iniciar nuestro
proyecto:
No haremos en este momento un anlisis del significado y objetivo de cada uno de estos
directorios y archivos generados, sino a medida que avancemos con este curso iremos viendo en
forma puntual y profunda.
La interfaz visual de nuestro programa para Android se almacena en un archivo XML en la
carpeta res, subcarpeta layout y el archivo se llama main.xml. En esta carpeta tenemos creada
nuestra primer pantalla.
Al seleccionar este archivo el plugin de Android nos permite visualizar el contenido en "vista de
diseo (Graphical Layout)":
El plugin Android ya insert un control de tipo LinealLayout que especifica que todos los controles
visuales que se inserten se dispondrn uno debajo del otro ya que la propiedad orientation est
inicializada con el valor vertical (orientation="vertical")
Ya veremos que podemos modificar todo este archivo para que se adapte a la aplicacin que
queremos desarrollar.
Luego contenido en el control LinealLayout hay otro control de tipo TextView que es bsicamente
una etiqueta o label que mostrar en pantalla el valor almacenado en la propiedad text.
Podemos modificar directamente el archivo xml o en "vista de diseo" modificar los valores de las
propiedades. Elegimos nuevamente la pestaa "Graphical Layout" y seleccionamos el TextView
con el mouse y presionamos el botn derecho del mouse, buscamos la propiedad text y la
cambiamos por la etiqueta: "Mi primer programa para Android":
Con esto ya podemos probar nuestra primer aplicacin para un dispositivo Android. Presionamos
Run desde el men o el cono respectivo. Seleccionamos que se ejecute como aplicacin
"Android Application". Ahora se abrir el AVD(Android Virtual Device) esto tarda bastante tiempo,
es muy importante recordar que luego de ver ejecutndose el programa NO debemos cerrar el
AVD para que la prxima ejecucin se inicie ms rpido (podemos minimizar el AVD)
Ahora podemos ver nuestra primer aplicacin corriendo en el emulador de Android:
Como hemos visto el plugin de Eclipse nos genera en forma automtica todas las carpetas y
archivos bsicos que necesitamos en un principio. En el siguiente concepto podremos empezar a
programar verdaderamente. El nico objetivo de este ejercicio es recordar los pasos para crear
un proyecto.
Final del proyecto001.
Realizar la carga de dos nmeros en controles de tipo EditText. Mostrar un mensaje que solicite
la carga de los valores. Disponer un Button para sumar los dos valores ingresados. Mostrar el
resultado en un tercer TextView.
La interfaz visual debe quedar algo semejante a esto:
Veamos paso a paso como creamos la interfaz visual de nuestro programa. Primero borramos el
TextView que aparece por defecto cuando se crea un proyecto con el plugin de Android. Ahora
desde la ventana "Palette" seleccionamos de la pestaa "Form Widgets" el control "TextView" y lo
arrastramos a la ventana de diseo de nuestra interfaz:
Tambin vamos a especificar la propiedad "Id", la misma parece primera en el men contextual:
Le asignaremos como nombre a este objeto: tv1 (recordemos que se trata de un objeto de la
clase TextView)
Presionando el botn derecho sobre el control EditText configuramos la propiedad Id... con el
nombre et1 (este nombre haremos referencia posteriormente desde Java)
Efectuamos los mismos pasos para crear el segundo TextView y EditText (inicializamos las
propiedades respectivas) Definimos los id con los nombres tv2 y et2, el resultado visual debe ser
algo semejante a esto:
Inicializamos la propiedad text con el texto "Sumar" y la propiedad id la dejamos con el valor ya
creado llamado "button1".
Para terminar con nuestra interfaz visual arrastramos un tercer objeto de tipo TextView y
definimos la propiedad id con el valor "tv3" y la propiedad text con el texto "resultado",
recordemos que la interfaz final debe ser semejante a esta:
La clase Proyecto002Activity hereda de la clase Activity. La clase Activity representa una ventana
de Android y tiene todos los mtodos necesarios para crear y mostrar los objetos que hemos
dispuesto en el archivo xml.
El cdigo fuente de la clase Proyecto002Activity.java es:
package android.proyecto002;
import android.app.Activity;
import android.os.Bundle;
public class Proyecto002Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Como mnimo se debe sobrescribir el mtodo onCreate heredado de la clase Activity donde
procedemos a llamar la mtodo setContentView pasando como referencia un valor almacenado
en una constante llamada main contenida en una clase llamada layout que a su vez la contiene
una clase llamada R (veremos ms adelante que el plugin de Eclipse para Android se encarga de
crear la clase R en forma automtica y sirve como puente entre el archivo xml y nuestra clase
Proyecto002Activity)
Captura de eventos.
Ahora viene la parte donde definimos variables en java donde almacenamos las referencias a los
objetos definidos en el archivo XML.
Definimos tres variables, dos de tipo EditText y finalmente una de tipo TextView (estas dos clases
se declaran en el paquete android.widget, es necesario importar dichas clases para poder definir
las variables de dichas clases):
package android.proyecto002;
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.widget.EditText;
android.widget.TextView;
No definimos TextView para los dos mensajes "Ingrese el primer valor" e "Ingrese el segundo
valor" ya que no necesitaremos interactuar con ellos. Tambin veremos que el objeto de la clase
Button no es necesario definir un atributo sino que desde el archivo XML inicializaremos la
propiedad OnClick.
En el mtodo onCreate debemos enlazar estas variables con los objetos definidos en el archivo
XML, esto se hace llamando al mtodo findViewById:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et1=(EditText)findViewById(R.id.et1);
et2=(EditText)findViewById(R.id.et2);
tv3=(TextView)findViewById(R.id.tv3);
}
Al mtodo findViewById debemos pasar la constante creada en la clase R (recordemos que se
crea automticamente esta clase) el nombre de la constante si debe ser igual con el nombre de la
propiedad del objeto creado en el archivo XML. Como la clase findViewById retorna una clase de
tipo View luego debemos utilizar el operador cast (es decir le antecedemos entre parntesis el
nombre de la clase)
Ya tenemos almacenados en las variables las referencias a los tres objetos que se crean al
llamar al mtodo:setContentView(R.layout.main); .
Ahora planteamos el mtodo que se ejecutar cuando se presione el botn (el mtodo debe
recibir como parmetro un objeto de la clase View) En nuestro ejemplo lo llam sumar:
package android.proyecto002;
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.EditText;
android.widget.TextView;
Finalmente implementaremos la lgica para sumar los dos valores ingresados en los controles
EditText:
public void sumar(View view) {
String valor1=et1.getText().toString();
String valor2=et2.getText().toString();
int nro1=Integer.parseInt(valor1);
int nro2=Integer.parseInt(valor2);
int suma=nro1+nro2;
String resu=String.valueOf(suma);
tv3.setText(resu);
}
Extraemos el texto de los dos controles de tipo EditText y los almacenamos en dos variables
locales de tipo String. Convertimos los String a tipo entero, los sumamos y el resultado lo
enviamos al TextView donde se muestra la suma (previo a convertir la suma a String)
La clase completa queda entonces como:
package android.proyecto002;
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.EditText;
android.widget.TextView;
Realizar la carga de dos nmeros en controles de tipo EditText. Mostrar un mensaje que solicite
la carga de los valores. Disponer dos controles de tipo RadioButton para seleccionar si queremos
sumar o restar dichos valores. Finalmente mediante un control de tipo Button efectuamos la
operacin respectiva. Mostramos el resultado en un TextView.
El problema es similar al anterior. Para disponer los controles de tipo RadioButton debemos en
realidad primero insertar un control de tipo RadioGroup (este control se encuentra en la paleta de
componentes en la pestaa FormWidgets):
Nuestro problema solo requiere dos controles de tipo RadioButton. Para borrarlo lo podemos
hacer directamente del formulario seleccionndolo y presionando la tecla delete o
seleccionndolo desde la ventana "Outline" y luego presionando la tecla delete
Ahora a los dos controles de tipo RadioButton definimos sus id (los llamaremos r1 y r2
respectivamente).
Cambiamos sus propiedades text por los textos "sumar" y "restar".
No olvidemos tambin cambiar los id de los controles EditText por et1 y et2 (igual que en el
problema anterior)
Por ltimo agreguemos un botn y un TextView
Inicializamos las propiedades del botn con los valores:
para
mostrar
el
resultado
id : button1
text : operar
Y el tercer TextView con los valores:
id : tv3
text : resultado
Podemos controlar en la ventana "Outline" el id definido para cada control (tv1, et1, tv2, et2,
radioGroup1, r1, r2, button1, tv3) Tambin podemos observar de que clase es cada control visual
y el texto de la propiedad text para aquellos controles que tienen sentido su inicializacin.
android.view.View;
android.widget.EditText;
android.widget.RadioButton;
android.widget.TextView;
5 - Control CheckBox
El objetivo de este concepto es practicar lo visto hasta ahora e incorporar el control visual
CheckBox
Problema:
Realizar la carga de dos nmeros en controles de tipo EditText. Mostrar un mensaje que solicite
la carga de los valores. Disponer dos controles de tipo CheckBox para seleccionar si queremos
sumar y/o restar dichos valores. Finalmente mediante un control de tipo Button efectuamos la
operacin respectiva. Mostramos el o los resultados en un TextView.
Lo nuevo en este problema es la insercin de dos objetos de la clase CheckBox que se
encuentra en la pestaa "FormWidgets":
Luego la interfaz grfica final para este problema y los nombres de los controles los podemos ver
en la ventana "Outline":
No olvidemos inicializar la propiedad OnClick del objeto button1 con el valor "operar" (es el
nombre del mtodo a ejecutarse cuando se presione el botn y lo implementa la clase que
hacemos)
Cdigo fuente:
package android.proyecto004;
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.CheckBox;
android.widget.EditText;
android.widget.TextView;
et2=(EditText)findViewById(R.id.et2);
tv3=(TextView)findViewById(R.id.tv3);
checkBox1=(CheckBox)findViewById(R.id.checkBox1);
checkBox2=(CheckBox)findViewById(R.id.checkBox2);
}
//Este mtodo se ejecutar cuando se presione el botn
public void operar(View view) {
String valor1=et1.getText().toString();
String valor2=et2.getText().toString();
int nro1=Integer.parseInt(valor1);
int nro2=Integer.parseInt(valor2);
String resu="";
if (checkBox1.isChecked()==true) {
int suma=nro1+nro2;
resu="La suma es: "+ suma;
}
if (checkBox2.isChecked()==true) {
int resta=nro1-nro2;
resu=resu + " La resta es: "+ resta;
}
tv3.setText(resu);
}
}
Definimos dos objetos de la clase CheckBox como atributos de la clase:
private CheckBox checkBox1,checkBox2;
En el mtodo onCreate los inicializamos con los objetos definidos en el archivo XML:
checkBox1=(CheckBox)findViewById(R.id.checkBox1);
checkBox2=(CheckBox)findViewById(R.id.checkBox2);
En el mtodo operar debemos definir dos if a la misma altura ya que los dos controles de tipo
CheckBox pueden estar seleccionados simultaneamente. Definimos una variable de tipo String y
la inicializamos con cadena vaca para el caso en que los dos CheckBox no estn seleccionados:
String resu="";
if (checkBox1.isChecked()==true) {
int suma=nro1+nro2;
resu="La suma es: "+ suma;
}
if (checkBox2.isChecked()==true) {
int resta=nro1-nro2;
resu=resu + " La resta es: "+ resta;
}
tv3.setText(resu);
Final del proyecto004.
6 - Control Spinner
El objetivo de este concepto es practicar lo visto hasta ahora e incorporar el control visual Spinner
El control Spinner muestra una lista de String y nos permite seleccionar uno de ellos. Cuando se
lo selecciona se abre y muestra todos sus elementos para permitir seleccionar uno de ellos.
Problema:
Realizar la carga de dos nmeros en controles de tipo EditText. Mostrar un mensaje que solicite
la carga de los valores. Disponer un control de tipo Spinner que permita seleccionar si queremos
sumar, restar, multiplicar o dividir dichos valores. Finalmente mediante un control de tipo Button
efectuamos la operacin respectiva. Mostramos el resultado en un TextView.
Lo nuevo en este problema es la insercin de un control de tipo Spinner que se encuentra en la
pestaa "FormWidgets":
No olvidemos inicializar la propiedad OnClick del objeto button1 con el valor "operar" (dicho
nombre es el mtodo que debemos implementar)
Cdigo fuente:
package android.proyecto005;
import
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.ArrayAdapter;
android.widget.EditText;
android.widget.Spinner;
android.widget.TextView;
String []opciones={"sumar","restar","multiplicar","dividir"};
new
Luego mediante una serie de if anidados verificamos si debemos sumar, restar, multiplicar o
dividir:
if (selec.equals("sumar")) {
int suma=nro1+nro2;
String resu=String.valueOf(suma);
tv3.setText(resu);
} else
if (selec.equals("restar")) {
int resta=nro1-nro2;
String resu=String.valueOf(resta);
tv3.setText(resu);
}
else
if (selec.equals("multiplicar")) {
int multi=nro1*nro2;
String resu=String.valueOf(multi);
tv3.setText(resu);
}
else
if (selec.equals("dividir")) {
int divi=nro1/nro2;
String resu=String.valueOf(divi);
tv3.setText(resu);
}
Final del proyecto005.
7 - Control ListView
El control ListView a diferencia del Spinner que se cierra luego de seleccionar un elemento
permanecen visibles varios elementos (se lo utiliza cuando hay que mostrar muchos elementos)
Si la lista no entra en el espacio que hemos fijado para el ListView nos permite hacer scroll de los
mismos.
El control ListView se encuentra en la pestaa "compositive".
Problema:
Disponer un ListView con los nombres de paises de sudamrica. Cuando se seleccione un pas
mostrar en un TextView la cantidad de habitantes del pas seleccionado.
La interfaz visual a implementar es la siguiente (primero disponemos un TextView (llamado tv1) y
un ListView (llamado listView1)):
Cdigo fuente:
package android.proyecto006;
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.AdapterView;
android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class Proyecto006Activity extends Activity {
private
paises={"Argentina","Chile","Paraguay","Bolivia","Peru",
String[]
"Ecuador","Brasil","Colombia","Venezuela","Uruguay"};
private
String[]
habitantes={"40000000","17000000","6500000","10000000","30000000",
"14000000","183000000","44000000","29000000","3500000"};
private TextView tv1;
private ListView lv1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv1=(TextView)findViewById(R.id.tv1);
lv1 =(ListView)findViewById(R.id.listView1);
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,
paises);
lv1.setAdapter(adapter);
lv1.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int posicion,
long id) {
tv1.setText("Poblacin de "+ lv1.getItemAtPosition(posicion) + "
es "+ habitantes[posicion]);
}
});
}
}
Primero definimos dos vectores paralelos donde almacenamos en uno los nombres de paises y
en el otro almacenamos la cantidad de habitantes de dichos paises:
private
paises={"Argentina","Chile","Paraguay","Bolivia","Peru",
String[]
"Ecuador","Brasil","Colombia","Venezuela","Uruguay"};
private
String[]
habitantes={"40000000","17000000","6500000","10000000","30000000",
"14000000","183000000","44000000","29000000","3500000"};
Definimos un objeto de tipo TextView y otro de tipo ListView donde almacenaremos las
referencias a los objetos que definimos en el archivo XML:
private TextView tv1;
private ListView lv1;
En el mtodo onCreate obtenemos la referencia a los dos objetos:
tv1=(TextView)findViewById(R.id.tv1);
lv1 =(ListView)findViewById(R.id.listView1);
Creamos un objeto de la clase ArrayAdapter de forma similar a como lo hicimos cuando vimos la
clase Spinner:
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, paises);
lv1.setAdapter(adapter);
Llamamos al mtodo setOnItemClicListener de la clase ListView y le pasamos como parmetro
una clase annima que implementa la interfaz OnItemClickListener (dicha interfaz define el
mtodo onItemClick que se dispara cuando seleccionamos un elemento del ListView):
lv1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int
posicion, long id) {
tv1.setText("Poblacin
de
"+
lv1.getItemAtPosition(posicion) + " es "+ habitantes[posicion]);
}
});
Dentro del mtodo onItemClick modificamos el contenido del TextView con el nombre del pas y
la cantidad de habitantes de dicho pas. Este mtodo recibe en el tercer parmetro la posicin del
item seleccionado del ListView.
Cuando ejecutamos el proyecto podemos ver una interfaz en el emulador similar a esta:
8 - Control ImageButton
Hemos visto la creacin de objetos de la clase Button, ahora veremos otra clase muy similar a la
anterior llamada ImageButton que tiene la misma filosofa de manejo con la diferencia que puede
mostrar una imagen en su superficie.
Problema:
Disponer un objeto de la clase ImageButton que muestre una imagen de un telfono. Cuando se
presione mostrar en un control TextView el mensaje "Llamando".
Primero crearemos un proyecto llamado proyecto007 y luego debemos buscar una imagen en
formato png que represente un telefono de 50*50 pxeles.
Nombre del archivo: telefono.png Ahora copiamos el archivo a la carpeta de recursos de nuestro
proyecto : res\drawable-mdpi Desde el Eclipse en la ventana "Package Explorer" navegamos
hasta la carpeta res y entramos al directorio drawable-mdpi y vemos que todava no est el
archivo que acabamos de copiar. Para que se actualice el proyecto presionamos el botn
derecho del mouse sobre esta carpeta y seleccionamos la opcin "Refresh":
Aparece un dilogo de donde seleccionamos el archivo telefono. Luego de esto podemos ver que
la superficie del objeto de la clase ImageButton muestra la imagen que almacenamos
previamente en la carpeta de res.
Si queremos cambiar el archivo a mostrar debemos modificar la propiedad src (aparece
nuevamente el dilogo que nos permite seleccionar la imagen) Inicializamos la propiedad ID con
el nombre bi1
Cdigo fuente:
package android.proyecto007;
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.TextView;
Confeccionar un programa que muestre en la ventana principal un botn que al ser presionado
muestre otra ventana (Activity) mostrando un TextView con el nombre del programador de la
aplicacin y un botn para cerrar la ventana.
1 - Primero creamos un nuevo proyecto que lo llamaremos proyecto008 y en la ventana principal
creamos la siguiente interfaz:
Es decir que nosotros queremos que cuando se presione el botn "Acerca De" nos abra otra
ventana (Activity) y nos muestre el nombre del programador.
2 - Ahora tenemos que crear el segundo Activity. Crearemos primero el archivo XML.
Presionamos el botn derecho sobre la carpeta layout y seleccionaremos la opcin New ->
Android XML File
Aqu tenemos que definir el nombre del archivo XML (debe estar en minsculas), lo llamaremos
acercade:
Implementamos ahora la interfaz visual de esta segunda ventana (Activity) disponiendo un objeto
de la clase TextView donde mostramos el nombre del autor de este programa y un Button para
cerrar la ventana.
3 - Tenemos ahora que crear el archivo Java donde dispondremos la funcionalidad de la segunda
ventana (Activity)
Creamos una nueva clase al proyecto desde el men contextual(presionamos el botn derecho
del mouse sobre el paquete android.proyecto008):
android.app.Activity;
android.content.Intent;
android.os.Bundle;
android.view.View;
}
public void lanzar(View view) {
Intent i = new Intent(this, AcercaDe.class );
startActivity(i);
}
}
En el mtodo lanzar creamos un objeto de la clase Intent y le pasamos como parmetros la
referencia del objeto de esta clase (this) y la referencia del otro Activity (Acerca.class).
Llamamos posteriormente al mtodo startActivity pasando el objeto de la clase Intent (con esto ya
tenemos en pantalla la ventana del segundo Activity:
public void lanzar(View view) {
Intent i = new Intent(this, AcercaDe.class );
startActivity(i);
}
Si ejecutamos el programa podemos ver que cuando presionamos el botn "Acerca De" aparece
la segunda ventana donde se muestra el TextView con el valor "Autor de este programa: Diego" y
un botn con el texto "Finalizar" (si presionamos este botn no sucede nada, esto debido a que
no hemos asociado ningn evento a dicho botn).
6 - Debemos codificar el evento OnClick de la segunda actividad. Seleccionemos el botn
"Finalizar" y definamos en la propiedad OnClick el nombre de mtodo que se ejecutar al
presionarse el botn (en nuestro caso lo llamaremos finalizar"):
El cdigo fuente de la actividad AcercaDe queda:
package android.proyecto008;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
public class AcercaDe extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.acercade);
}
public void cerrar(View view) {
finish();
}
}
Cuando se presiona el botn finalizar llamando al mtodo finish() que tiene por objetivo liberar el
espacio de memoria de esta actividad y pedir que se active la actividad anterior.
Segundo Activity:
Problema propuesto
Realizar un programa que contenga dos Activity. En el primero que solicite el ingreso de una clave (control
Password) Si ingresa la clave "abc123" activar el segundo Activity mostrando en un TextView un mensaje
de bienvenida (mostrar en un TextView si se ingrese la clave incorrecta). Llamar al proyecto: proyecto009.
En tiempo de ejecucin los dos Activity deben mostrarse algo similar a esto:
Tenemos un control de tipo TextView (tv1), otro de tipo EditText y finalmente otro de tipo Button
(button1) debemos inicializar las propiedades de cada uno de estos tres objetos.
El cdigo fuente de esta Activity es:
package android.proyecto010;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class Proyecto010Activity extends Activity {
private EditText et1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et1=(EditText)findViewById(R.id.et1);
}
public void ejecutar(View view) {
Intent i = new Intent(this, Actividad2.class );
i.putExtra("direccion", et1.getText().toString());
startActivity(i);
}
}
Como podemos ver la diferencia con el concepto anterior es que llamamos al mtodo putExtra de
la clase Intent. Tiene dos parmetros de tipo String, en el primero indicamos el nombre del dato y
en el segundo el valor del dato:
public void ejecutar(View view) {
Intent i = new Intent(this, Actividad2.class );
i.putExtra("direccion", et1.getText().toString());
startActivity(i);
}
La segunda interfaz visual (recordemos que debemos presionar el botn derecho sobre la
carpeta layout y seleccionar la opcin New -> Android XML File) la llamaremos actividad2.xml:
En esta interfaz disponemos primero un control de tipo Button (button1) y un objeto de la clase
WebView (se encuentra en la pestaa "Composite") y lo dejamos con el ID por defecto llamado
webView1
Tenemos que crear el archivo Java donde dispondremos la funcionalidad de la segunda ventana
(Activity) Creamos una nueva clase al proyecto desde el men contextual(presionamos el botn
derecho del mouse sobre el paquete android.proyecto010) Al nombre de la clase la llamamos
Actividad2 y debemos especificar que hereda de la clase Activity Ahora tenemos que modificar el
archivo Java generado con esto:
package android.proyecto010;
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.webkit.WebView;
Bundle bundle=getIntent().getExtras();
webView1.loadUrl("http://"+bundle.getString("direccion"));
}
public void finalizar(View view) {
finish();
}
}
En esta clase definimos una variable de tipo Bundle y la inicializamos llamando al mtodo
getExtras() de la clase Intent (esto lo hacemos para recuperar el o los parmetros que envi la
otra actividad (Activity)):
Bundle bundle=getIntent().getExtras();
webView1.loadUrl("http://"+bundle.getString("direccion"));
El mtodo loadUrl de la clase WebView permite visualizar el contenido de un sitio web.
Otro paso fundamental es registrar el Activity en el archivo "AndroidManifest.xml" que se
encuentra en la raiz principal del proyecto.
Seleccionamos el archivo y activamos la pestaa : "Application", presionamos el botn "add" y
seleccionamos "Activity".
Por ltimo seleccionamos en "Application Nodes" la actividad creada y definimos la propiedad
Name con el nombre de la clase que la implementa (en nuestro caso se llama Actividad2)
Como nuestra aplicacin debe acceder a internet debemos hacer otra configuracin en el archivo
"AndroidManifest.xml", debemos ir a la pestaa "Permissions" presionar el botn "Add" y
seleccionar "Uses Permissions":
No ser raro que una aplicacin utilice ms de uno de estos mtodos para el almacenamiento de
datos.
Cuando tenemos que almacenar una cantidad limitada de datos es adecuado utilizar la clase
SharedPreferences. Por ejemplo configuraciones de la aplicacin como pueden ser colores de
pantalla, nivel actual en un juego, datos iniciales de controles de entrada de dato etc.
Problema:
Confeccionar un programa que solicite el ingrese del mail de una persona. Guardar el mail
ingresado utilizando la clase SharedPreferences. Cada vez que se inicie la aplicacin almacenar
en el control EditText el ltimo mail ingresado. Disponer un botn para almacenar el mail
ingresado y finalizar el programa.
Crearemos un nuevo proyecto llamado proyecto011 y lo almacenaremos en el package name:
android.proyecto011.
La interfaz visual a implementar y los Id de los controles visuales son los siguientes:
Es decir:
Disponemos un TextView y definimos su ID con el nombre tv1
la propiedad Text con "Ingrese el mail:".
Disponemos un EditText y definimos su ID con el nombre et1.
Disponemos un Button y definimos su propiedad Id con el nombre button1
su
propiedad
Text
con
el
valor
confirmar
su propiedad OnClic con el valor
ejecutar
El cdigo java es:
package android.proyecto011;
import
import
import
import
import
import
import
android.app.Activity;
android.content.Context;
android.content.SharedPreferences;
android.content.SharedPreferences.Editor;
android.os.Bundle;
android.view.View;
android.widget.EditText;
Comentarios extras.
solo
la
aplicacin
puede
acceder
al
archivo
de
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;
java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
}catch (IOException e)
{
}
Toast
t=Toast.makeText(this,"Los
Toast.LENGTH_SHORT);
t.show();
finish();
}
}
datos
fueron
grabados",
Veamos primero como grabamos datos en un archivo de texto. Esto se hace en el mtodo grabar
que se ejecuta cuando presionamos el botn "grabar" (recordemos de inicializar la propiedad
"OnClick" del botn):
public void grabar(View v) {
try {
OutputStreamWriter
archivo
=
new
OutputStreamWriter(openFileOutput("notas.txt",Activity.MODE_PRIVATE));
Creamos un objeto de la clase OutputStreamWriter y al constructor de dicha clase le enviamos el
dato que retorna el mtodo openFileOutput propio de la clase Activity que le pasamos como
parmetro el nombre del archivo de texto y el modo de apertura.
Seguidamente si el archivo se cre correctamente procedemos a llamar al mtodo write y le
pasamos el String a grabar, en este caso extraemos los datos del EditText:
archivo.write(et1.getText().toString());
Luego de grabar con el mtodo write llamamos al mtodo flush para que vuelque todos los datos
que pueden haber quedado en el buffer y procedemos al cerrado del archivo:
archivo.flush();
archivo.close();
Todo esto est cerrado en un try/catch para verificar si sucede algn error en la apertura del
archivo.
Finalmente mostramos un mensaje temporal en pantalla utilizando la clase Toast:
Toast
t=Toast.makeText(this,"Los
Toast.LENGTH_SHORT);
t.show();
finish();
datos
fueron
grabados",
Para crear un objeto de la clase Toast llamamos al mtodo makeText de la clase Toast y le
pasamos la referencia del Activity actual, el String a mostrar y el tiempo de duracin del mensaje.
Con el objeto devuelto por el mtodo makeText procedemos a llamar seguidamente al mtodo
show para que se muestre el mensaje.
Es comn llamar al mtodo show de la clase Toast en una sola lnea como esta:
Toast.makeText(this,"Los
Toast.LENGTH_SHORT).show();
datos
fueron
grabados",
El mtodo onCreate tiene por objetivo verificar si existe el archivo de texto, proceder a su lectura
y mostrar su contenido en el EditText.
Primero obtenemos la lista de todos los archivos creados por la Activity. En nuestro ejemplo
puede ser cero o uno:
String []archivos=fileList();
Llamamos a un mtodo que verifica si en el vector de tipo String existe el archivo "notas.txt":
if (existe(archivos,"notas.txt"))
En el caso que me retorne true procedemos a crear un objeto de la clase InputStreamReader y al
constructor de dicha clase le pasamos el dato devuelto por el mtodo openFileInput:
InputStreamReader archivo=new
InputStreamReader(openFileInput("notas.txt"));
Creamos un objeto de la clase BufferedReader y le pasamos al constructor la referencia del
objeto de la clase InputStreamReader:
BufferedReader br=new BufferedReader(archivo);
Leemos la primer lnea del archivo de texto:
String linea=br.readLine();
Inicializamos un String vaco:
String todo="";
Mientras el mtodo readLine de la clase BufferedReader devuelva un String:
while (linea!=null)
{
Lo concatenamos al String junto a un salto de lnea:
todo=todo+linea+"\n";
Leemos la prxima lnea:
linea=br.readLine();
}
Llamamos al mtodo close de la clase BufferedReader y al del InputStreamReader:
br.close();
archivo.close();
Cargamos el EditText con el contenido del String que contiene todos los datos del archivo de
texto:
et1.setText(todo);
El mtodo existe llega un vector de tipo String y otro String a buscar. Dentro de un for verificamos
el String a buscar con cada uno de los String del vector, si lo encontramos retornamos true. Si
recorre todo el for sin encontrarlo fuera del for retornamos false:
private boolean existe(String[] archivos,String archbusca)
{
for(int f=0;f<archivos.length;f++)
if (archbusca.equals(archivos[f]))
return true;
return false;
}
Final del proyecto013.
Debemos presionar el botn "Add" seleccionar "Uses Permision" y luego en name seleccionar
"android.permission.WRITE_EXTERNAL_STORAGE".
El cdigo fuente es:
package android.proyecto014;
import
import
import
import
import
import
import
java.io.BufferedReader;
java.io.File;
java.io.FileInputStream;
java.io.FileOutputStream;
java.io.IOException;
java.io.InputStreamReader;
java.io.OutputStreamWriter;
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.os.Environment;
android.view.View;
android.widget.EditText;
android.widget.Toast;
}
catch (IOException ioe)
{
}
}
public void recuperar(View v) {
String nomarchivo = et1.getText().toString();
File tarjeta = Environment.getExternalStorageDirectory();
File file = new File(tarjeta.getAbsolutePath(), nomarchivo);
try {
FileInputStream fIn = new FileInputStream(file);
InputStreamReader archivo=new InputStreamReader(fIn);
BufferedReader br=new BufferedReader(archivo);
String linea=br.readLine();
String todo="";
while (linea!=null)
{
todo=todo+linea+"\n";
linea=br.readLine();
}
br.close();
archivo.close();
et2.setText(todo);
} catch (IOException e)
{
}
}
}
El mtodo para grabar los datos en un archivo de texto localizado en una tarjeta SD comienza
obteniendo el directorio raiz de la tarjeta a travs del mtodo getExternalStorageDirectory(), el
mismo retorna un objeto de la clase File.
public void grabar(View v) {
String nomarchivo = et1.getText().toString();
String contenido=et2.getText().toString();
try
{
File tarjeta = Environment.getExternalStorageDirectory();
Creamos un nuevo objeto de la clase File indicando el camino de la unidad SD y el nombre del
archivo a crear:
File file = new File(tarjeta.getAbsolutePath(), nomarchivo);
Por ltimo similar al acceso de un archivo interno creamos un objeto de la clase
OutputStreamWriter:
Confeccionar un programa que permita almacenar los datos de votantes de una eleccin. Crear
la tabla votantes y definir los campos dni (documento de identidad), nombre del votante, colegio
donde vota y nmero de mesa donde vota.
El programa debe permitir:
1
2
3
4
Carga de personas.
Consulta por el dni (para saber donde vota)
Borrado de personas
Modificacin de datos.
Lo primero que haremos es crear una clase que herede de SQLiteOpenHelper. Esta clase nos
permite crear la base de datos y actualizar la estructura de tablas y datos iniciales.
Debemos implementar el constructor y sobreescribir los mtodos onCreate y onUpgrade.
El mtodo onCreate se le llama cuando la base de datos se crea por primera vez. Aqu es donde
se define la estructura de las tablas y se cargan eventualmente los datos iniciales
En el mtodo onUpgrade se llama cuando la base de datos debe ser actualizada. Tiene por
objetivo eliminar tablas, aadir tablas, o hacer cualquier otra cosa que necesita para actualizarse.
En nuestro problema implementaremos una nueva clase llamada AdminSQLiteOpenHelper que
herede de la clase SQLiteOpenHelper:
package android.proyecto015;
import
import
import
import
android.content.Context;
android.database.sqlite.SQLiteDatabase;
android.database.sqlite.SQLiteDatabase.CursorFactory;
android.database.sqlite.SQLiteOpenHelper;
public
AdminSQLiteOpenHelper(Context
context,
CursorFactory factory, int version) {
super(context, nombre, factory, version);
}
String
nombre,
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table votantes(dni integer primary key,
nombre text, colegio text, nromesa integer)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int versionAnte, int
versionNue) {
db.execSQL("drop table if exists votantes");
db.execSQL("create table votantes(dni integer primary key,
nombre text, colegio text, nromesa integer)");
}
}
En el constructor solo llamamos al constructor de la clase padre pasando los datos que llegan en
los parmetros:
public AdminSQLiteOpenHelper(Context context, String nombre,
CursorFactory factory, int version) {
super(context, nombre, factory, version);
}
En el mtodo onCreate procedemos a crear la tabla votantes con los cuatro campos respectivos y
definiendo el campo dni como primary key:
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table votantes(dni integer primary key,
nombre text, colegio text, nromesa integer)");
}
En el mtodo onUpgrade procedemos a borrar la tabla votantes y crear nuevamente la tabla (en
este caso con la misma estructura pero podra ser otra en un caso ms real:
public void onUpgrade(SQLiteDatabase db, int versionAnte, int
versionNue) {
db.execSQL("drop table if exists votantes");
db.execSQL("create table votantes(dni integer primary key,
nombre text, colegio text, nromesa integer)");
}
Ahora veamos la otra clase que implementar las altas, bajas, modificaciones y consultas:
package android.proyecto015;
import
import
import
import
import
import
import
import
android.app.Activity;
android.content.ContentValues;
android.database.Cursor;
android.database.sqlite.SQLiteDatabase;
android.os.Bundle;
android.view.View;
android.widget.EditText;
android.widget.Toast;
AdminSQLiteOpenHelper
admin=new
AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase bd=admin.getWritableDatabase();
String dni=et1.getText().toString();
Cursor fila=bd.rawQuery("select nombre,colegio,nromesa
from
votantes where dni="+dni+"",null);
if (fila.moveToFirst())
{
et2.setText(fila.getString(0));
et3.setText(fila.getString(1));
et4.setText(fila.getString(2));
}
else
Toast.makeText(this, "No existe una persona con dicho dni",
Toast.LENGTH_SHORT).show();
bd.close();
}
public void baja(View v) {
AdminSQLiteOpenHelper
admin=new
AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase bd=admin.getWritableDatabase();
String dni=et1.getText().toString();
int cant=bd.delete("votantes", "dni="+dni+"",null);
bd.close();
et1.setText("");
et2.setText("");
et3.setText("");
et4.setText("");
if (cant==1)
Toast.makeText(this,
"Se
borr
la
persona
con
dicho
documento", Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, "No existe una persona con dicho
documento", Toast.LENGTH_SHORT).show();
}
public void modificacion(View v) {
AdminSQLiteOpenHelper
admin=new
AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase bd=admin.getWritableDatabase();
String dni=et1.getText().toString();
String nombre=et2.getText().toString();
String colegio=et3.getText().toString();
String nromesa=et4.getText().toString();
ContentValues registro=new ContentValues();
registro.put("nombre",nombre);
registro.put("colegio",colegio);
registro.put("nromesa",nromesa);
int cant = bd.update("votantes", registro, "dni="+dni, null);
bd.close();
if (cant==1)
Toast.makeText(this,
"se
modificaron
los
datos",
Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, "no existe una persona con dicho
documento", Toast.LENGTH_SHORT).show();
}
}
Como en problemas anteriores definimos los cuatro EditText como atributos y en el mtodo
onCreate obtenemos la referencia de los mismos:
public class Proyecto015Activity extends Activity {
private EditText et1,et2,et3,et4;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et1=(EditText)findViewById(R.id.editText1);
et2=(EditText)findViewById(R.id.editText2);
et3=(EditText)findViewById(R.id.editText3);
et4=(EditText)findViewById(R.id.editText4);
}
1 - Alta de datos.
Cuando se presiona el botn alta se ejecuta el mtodo "alta" recordemos inicializar la propiedad
"OnClick" del botn desde la ventana de visualizacin del archivo XML.
Lo primero que hacemos en este mtodo es crear un objeto de la clase que planteamos
anteriormente y le pasamos al constructor this (referencia del Activity actual), "administracion" (es
el nombre de la base de datos que crearemos en el caso que no exista) luego pasamos null y un
uno indicando que es la primer versin de la base de datos (en caso que cambiemos la estructura
o agreguemos tablas por ejemplo podemos pasar un dos en lugar de un uno para que se ejecute
el mtodo onUpgrade donde indicamos la nuestra estructura de la base de datos)
Luego de crear un objeto de la clase AdminSqLiteOpenHelper procedemos a crear un objeto de
la clase SQLiteDataBase llamando al mtodo getWritableDatabase (la base de datos se abre en
modo lectura y escritura).
Creamos un objeto de la clase ContentValues y mediante el mtodo put inicializamos todos tos
campos a cargar.
Seguidamente llamamos al mtodo insert de la clase SQLiteDatabase pasando en el primer
parmetro el nombre de la tabla, como segundo parmetro un null y por ltimo el objeto de la
clase ContentValues ya inicializado (este mtodo es el que provoca que se inserte una nueva fila
en la tabla votantes en la base de datos llamada administracion)
Borramos seguidamente los EditText y mostramos un mensaje para que conozca el operador que
el alta de datos se efectu en forma correcta:
public void alta(View v) {
AdminSQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase bd=admin.getWritableDatabase();
String dni=et1.getText().toString();
String nombre=et2.getText().toString();
String colegio=et3.getText().toString();
String nromesa=et4.getText().toString();
ContentValues registro=new ContentValues();
registro.put("dni",dni );
registro.put("nombre",nombre );
registro.put("colegio",colegio );
registro.put("nromesa",nromesa );
bd.insert("votantes", null, registro);
bd.close();
et1.setText("");
et2.setText("");
et3.setText("");
et4.setText("");
Toast.makeText(this, "Se cargaron los datos de la persona",
Toast.LENGTH_SHORT).show();
}
2 - Consulta de datos.
Cuando se presiona el botn "Consulta por DNI" se ejecuta el mtodo consulta:
public void consulta(View v) {
AdminSQLiteOpenHelper
admin=new
AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase bd=admin.getWritableDatabase();
String dni=et1.getText().toString();
Cursor fila=bd.rawQuery("select nombre,colegio,nromesa
from
votantes where dni="+dni+"",null);
if (fila.moveToFirst())
{
et2.setText(fila.getString(0));
et3.setText(fila.getString(1));
et4.setText(fila.getString(2));
}
else
Toast.makeText(this, "No existe una persona con dicho dni",
Toast.LENGTH_SHORT).show();
bd.close();
}
En el mtodo consulta lo primero que hacemos es crear un objeto de la clase
AdminSQLiteOpenHelper y obtener una referencia de la base de datos llamando al mtodo
getWritableDatabase.
Seguidamente definimos una variable de la clase Cursor y la inicializamos con el valor devuelto
por el mtodo llamado rawQuery.
La clase Cursos almacena en este caso una fila o cero filas (una en caso que hayamos ingresado
un dni existente en la tabla votantes), llamamos al mtodo moveToFirst() de la clase Cursos y
retorna true en caso de existir una persona con el dni ingresado, en caso contrario retorna cero.
Para recuperar los datos propiamente dichos que queremos consultar llamamos al mtodo
getString y le pasamos la posicin del campo a recuperar (comienza a numerarse en cero, en
este ejemplo la columna cero representa el campo nombre, la columna 1 representa el campo
colegio y la columna 2 representa el campo nromesa)
3 - Baja o borrado de datos.
Para borrar uno o ms registros la clase SQLiteDatabase tiene un mtodo que le pasamos en el
primer parmetro el nombre de la tabla y en el segundo la condicin que debe cumplirse para que
se borre la fila de la tabla. El mtodo delete retorna un entero que indica la cantidad de registros
borrados:
public void baja(View v) {
AdminSQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase bd=admin.getWritableDatabase();
String dni=et1.getText().toString();
int cant=bd.delete("votantes", "dni="+dni+"",null);
bd.close();
et1.setText("");
et2.setText("");
et3.setText("");
et4.setText("");
if (cant==1)
Toast.makeText(this, "Se borr la persona con dicho
documento", Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, "No existe una persona con dicho
documento", Toast.LENGTH_SHORT).show();
}
4 - Modificacin de datos.
En la modificacin de datos debemos crear un objeto de la clase ContentValues y mediante el
mtodo put almacenar los valores para cada campo que ser modificado. Luego se llama al
mtodo update de la clase SQLiteDatabase pasando el nombre de la tabla, el objeto de la clase
ContentValues y la condicin del where (el cuanto parmetro en este ejemplo no se lo emplea)
public void modificacion(View v) {
AdminSQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase bd=admin.getWritableDatabase();
String dni=et1.getText().toString();
String nombre=et2.getText().toString();
String colegio=et3.getText().toString();
String nromesa=et4.getText().toString();
ContentValues registro=new ContentValues();
registro.put("nombre",nombre);
registro.put("colegio",colegio);
registro.put("nromesa",nromesa);
int cant = bd.update("votantes", registro, "dni="+dni, null);
bd.close();
if (cant==1)
Toast.makeText(this, "se modificaron los datos",
Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, "no existe una persona con dicho
documento", Toast.LENGTH_SHORT).show();
}
Final del proyecto015.
Otra forma de acceder a estas propiedades es la apertura de la ventana de properties, para esto
desde el men de Eclipse procedemos a seleccionar la opcin: Window -> Show View -> Other...:
Ahora cuando disponemos objetos sobre el formulario o lienzo de nuestra aplicacin podemos
ver todas las propiedades del objetos seleccionado y modificarlas desde esta ventana:
Por ejemplo si queremos definir la propiedad On Click de un objeto Button debemos seleccionarlo
y en la ventana de propiedades cargamos el valor para dicha propiedad:
16 - Layout (LinearLayout)
Android organiza las componentes visuales (Button, EditText, TextView etc.) en pantalla
mediante contenedores llamados Layout.
Hasta ahora no nos a preocupado como organizar una pantalla, sino nos hemos centrado en la
funcionalidad de cada programa que implementamos.
Ahora comenzaremos a preocuparnos como organizar y disponer las componentes dentro de la
pantalla.
- LinearLayout.
LinearLayout es uno de los diseos ms simples y ms empleado. Simplemente establece los
componentes visuales uno junto al otro, ya sea horizontal o verticalmente (nosotros hemos
empleado hasta ahora el LinearLayout disponiendo los componentes verticalmente)
Una de las propiedades ms importantes del contenedor LinearLayout es Orientation.
Si fijamos la propiedad Orientation con el valor Vertical luego las componentes contenidas en el
Layout se disponen una debajo de otra (Cuando disponemos un contenedor LinearLayout por
defecto se inicializa la propiedad Orientation en Vertical):
Otra propiedad pero en este caso perteneciente a los controles visuales (Button, EditText,
TextView etc.) y que tiene sentido emplearla cuando utilizamos un LinearLayout es la propiedad
Layout_weight (Define la cantidad de espacio extra en el diseo que debe ser asignado al
control) Por ejemplo si queremos disponer un control de tipo EditText y un Button en un
LinearLayout y que el EditText se apropie el 70% del espacio restante y el botn el 30% restante
debemos fijar los valores de las propiedades Layout_weight con los nmeros 0.7 y 0.3
respectivamente:
Para implementar este interfaz hemos agregado de la pestaa "Layouts" dos controles de tipo
uno de tipo "LinearLayout (Vertical)" en la parte superior y uno de tipo "LinearLayout (Horizontal)"
en la parte inferior:
Para que el segundo LinearLayout quede en la parte inferior de la pantalla inicializamos las
propiedades "Layout_weight" con 1 para el superior y con 0 para el inferior:
Finalmente actualizamos el segundo EditText con lo que tenemos como resultado la interfaz:
Propiedad Gravity.
Otra propiedad muy utilizada es Gravity. Esta propiedad nos permite alinear a la izquierda, a la
derecha, a la parte superior, a la parte superior derecha etc.
Para implementar la siguiente interfaz:
17 - Layout (TableLayout)
El Layout de tipo TableLayout agrupa componentes en filas y columnas. Un TableLayout contiene
un conjunto de componentes de tipo TableRow que es el que agrupa componentes visuales por
cada fila (cada fila puede tener distinta cantidad de componentes visuales)
Cuando disponemos un control de Layouts de tipo TableLayout automticamente crea cuatro
componentes de tipo TableRow que los podemos ver en la ventana "Outline". Podemos borrar o
agregar componentes de tipo TableRow segn las necesidades de nuestro TableLayout:
Luego de borrar un control de tipo TableRow y agregar componentes de tipo Button la interfaz
visual queda como sigue:
Otra propiedad que nos puede ser til inicializar en los controles que se disponen dentro de un
TableLayout es layout_span. Esta propiedad permite que un control se expanda ms de una
celda.
En el siguiente ejemplo el objeto de la clase Button de la segunda fila hemos dispuesto la
propiedad layout_span con el valor 2:
18 - Layout (RelativeLayout)
Hay varias posibilidades cuando empleamos el RelativeLayout. Primero podemos alinear un
control con respecto al Layout que lo contiene. Para probar esto dispondremos un control de tipo
RelativeLayout y fijaremos la propiedad Layout_weight con el valor 1 (esto hace que el
RelativeLayout ocupe completamente la pantalla) Luego dispondremos un botn en cada vrtice
y veremos que propiedades son afectadas e inicializadas:
Como podemos ver cada control que agregamos se inicializan alguna de las propiedades:
alignParentLeft
alignParentRight
alignParentTop
alignParentBottom
centerHorizontal
centerVertical
centerInParent
Con este tipo de layout podemos disponer un control en forma relativa a otro control que haya
dentro del RelativeLayout. Veamos un ejemplo:
En este ejemplo hemos dispuesto el segundo botn debajo (below) del botn 1 y alineado a la
izquierda (luego si desplazamos el botn 1 se desplazar el botn 2)
La posicin relativa con respecto a otro control puede ser:
above (por encima)
below (debajo)
toLeftOf (a la izquierda de)
toRightOf (a la derecha)
19 - Layout (FrameLayout)
El control de tipo FrameLayout dispone dentro del contenedor todos los controles visuales
alineados al vrtice superior izquierdo. Es decir si disponemos dos o ms controles los mismos
se apilan.
Por ejemplo si disponemos dentro de un FrameLayout un ImageView y un Button luego el botn
se superpone a la imagen:
Otra aplicacin del control FrameLayout es disponer una serie de controles visuales no visibles e
ir alternando cual se hace visible.
Problema:
Seleccionamos el control ImageView y fijarmos la propiedad Visibility con el valor invisible (esto
hace que la imagen no se muestre en pantalla)
Luego inicializamos la propiedad On click del control Button indicando el nombre del mtodo que
se ejecutar al ser presionado:
package android.proyecto016;
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.Button;
android.widget.ImageView;
Luego dispongamos numerosos botones que superen la cantidad de espacio del dispositivo.
Numerar los botones con los nmeros del 1 en adelante:
Luego si ejecutamos el programa veremos que podemos desplazar (scroll) todo el contenido del
visor con el dedo:
Esto hace que en tiempo de ejecucin quede fijo el LinearLayout y podamos desplazar con el
dedo el ScrollView que aparece en la parte inferior:
21 - Icono de la aplicacin
Cuando creamos un proyecto para implementar una aplicacin con el plugin de Android nos crea
un cono por defecto:
Los conos e imgenes se almacenan en la carpeta res (resources) y en esta hay tres carpetas
llamadas:
drawable-mdpi
drawable-ldpi
drawable-hdpi
Y en cada una de estas hay un archivo llamado icon.png:
Como las resoluciones de los dispositivos Android pueden ser muy distintos (un celular, una
tablet, un televisor etc.) se recomienda proporcionar mltiples copias de cada imagen de recursos
a diferentes resoluciones y almacenarlos en las carpetas nombradas respetando las siguientes
reglas:
res/drawable-mdpi/
El cono debe ser de 48*48 pxeles.
res/drawable-ldpi/
75% del tamao de las imgenes almacenadas en la carpeta drawablemdpi
El cono debe ser de 36*36 pxeles.
res/drawable-hdpi/
150% del tamao de las imgenes almacenadas en la carpeta drawablemdpi
El cono debe ser de 72*72 pxeles.
En las versiones ms actuales de Android se propone crear una cuarta carpeta llamada:
res/drawable-xhdpi/
200% del tamao de las imgenes almacenadas en la carpeta drawablemdpi
Problema:
Crear una aplicacin, dibujar y almacenar tres archivos llamados icon.png. Tener en cuenta que
el archivo que se almacena en la carpeta drawable-mdpi debe ser de 48 pxeles, el de la carpeta
drawable-mdpi de 36 pxeles y el de la carpeta drawable-hdpi debe ser de 72 pxeles de ancho y
alto. Ejecutar la aplicacin y ver el cono nuevo.
Disponer dos botones con las etiquetas: Gato y Len, luego cuando se presione reproducir el
archivo de audio respectivo. Los archivos de sonidos almacenarlos en la misma aplicacin.
Luego de crear el proyecto procedemos a crear una carpeta llamada raw que dependa de la
carpeta res, almacenamos los dos archivos mp3 en dicha carpeta:
Luego de copiar los archivos a la carpeta debemos refrescar los archivos contenidos en el
proyecto presionando el botn derecho del mouse y seleccionando la opcin "Refresh":
android.app.Activity;
android.media.MediaPlayer;
android.os.Bundle;
android.view.View;
}
Cuando copiamos los archivos mp3 se genera luego en la clase R la referencia a los dos archivos
y posteriormente los podemos rescatar cuando creamos un objeto de la clase MediaPlayer:
MediaPlayer mp=MediaPlayer.create(this,R.raw.gato);
Seguidamente llamamos al mtodo start:
mp.start();
Final del proyecto019.
Confeccionar una aplicacin que permita Iniciar un archivo mp3, detener, continuar, detener en
forma definitiva y activacin o no de la reproduccin en forma circular.
Crear un archivo mp3 con el programa Audacity contando del 1 al 30.
Primero creamos un proyecto y definimos los 5 botones y mtodos a ejecutar cuando se
presionen los botones respectivos:
android.app.Activity;
android.media.MediaPlayer;
android.os.Bundle;
android.view.View;
android.widget.Button;
}
El mtodo pausar verifica que el objeto de la clase MediaPlayer este creado y en ejecucin, en
caso afirmativo recuperamos la posicin actual de reproduccin y llamamos seguidamente al
mtodo pause:
public void pausar(View v) {
if(mp != null && mp.isPlaying()) {
posicion = mp.getCurrentPosition();
mp.pause();
}
}
El mtodo continuar verifica que el objeto de la clase MediaPlayer este creado y la propiedad
isPlaying retorne false para proceder a posicionar en que milisegundo continuar la reproduccin:
public void continuar(View v) {
if(mp != null && mp.isPlaying()==false) {
mp.seekTo(posicion);
mp.start();
}
}
El mtodo detener interrumpe la ejecucin del mp3 e inicializa el atributo posicion con cero:
public void detener(View v) {
if(mp != null) {
mp.stop();
posicion = 0;
}
}
Cuando se presiona el botn que cambia si la reproduccin se efecta en forma circular o no
procedemos a extraer su texto y segn dicho valor almacenamos el valor opuesto:
public void circular(View v) {
detener(null);
String op=b1.getText().toString();
if (op.equals("No reproducir en forma circular"))
b1.setText("reproducir en forma circular");
else
b1.setText("No reproducir en forma circular");
}
Final del proyecto020.
Disponer un botn con la etiqueta: "Gato", luego cuando se presione reproducir el archivo de
audio respectivo. El archivo de sonido almacenarlo en la tarjeta SD.
Luego de crear el proyecto debemos ejecutar la aplicacin en modo depuracin para poder
acceder a la tarjeta SD que crea el emulador Android. Para ejecutar la aplicacin en modo
"Debug" presionamos el botn derecha del mouse sobre el proyecto y seleccionamos la opcin
"Debug A" "Android Aplication":
Una vez que se este ejecutando la aplicacin (no importa que todava no hemos implementado
su funcionalidad) procedemos a abrir la ventana "File Explorer" de Android. Seleccionamos del
men de opciones de Eclipse: Window -> Show View -> Other :
Ahora podemos ver la ventana donde administramos los archivos contenidos en la tarjeta SD que
emula el "Android Virtual Device":
En la carpeta sdcard debemos subir el archivo mp3 (debemos seleccionar esta carpeta con el
mouse)
Esto lo hacemos mediante un botn que aparece en la parte derecha de esta ventana "Push a file
onto device", luego de esto tenemos el archivo montado en la tarjeta SD:
Ahora implementemos la interfaz de nuestra aplicacin (un solo botn) que cuando se presione
llame al mtodo ejecutar:
android.app.Activity;
android.media.MediaPlayer;
android.net.Uri;
android.os.Bundle;
android.os.Environment;
android.view.View;
Creamos un objeto de la clase Uri llamando al mtodo parse donde indicamos el path y nombre
del archivo a recuperar:
Uri datos =
Uri.parse(Environment.getExternalStorageDirectory().getPath()
+"/gato.mp3");
Creamos el objeto de la clase MediaPlayer pasando ahora la referencia del objeto de la clase Uri:
MediaPlayer mp=MediaPlayer.create(this, datos);
Iniciamos la reproduccin del mp3:
mp.start();
Final del proyecto021.
Recordar que para ejecutar este proyecto se debe subir un archivo mp3 llamado "gato.mp3" a la
tarjeta SD.
Disponer un botn con la etiqueta: "Gato", luego cuando se presione reproducir el archivo de
audio
respectivo.
El
archivo
de
sonido
se
encuentra
almacenado
en
http://www.codigofuenteya.com.ar/recursos/gato.mp3
El primer paso es modificar el archivo AndroidManifest.xml donde autorizamos a la aplicacin a
acceder a recursos localizados en internet:
Creamos la interfaz de la aplicacin e inicializamos el evento On click del Button con el mtodo
que implementaremos:
android.app.Activity;
android.media.MediaPlayer;
android.os.Bundle;
android.view.View;
android.app.Activity;
android.media.MediaPlayer;
android.media.MediaPlayer.OnPreparedListener;
android.os.Bundle;
android.view.View;
android.widget.Toast;
public
class
Proyecto023Activity
extends
Activity
OnPreparedListener {
MediaPlayer mp;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
implements
Para poder capturar el evento que el archivo se termin de recuperar debemos implementar la
interface OnPreparedListener:
public class Proyecto023Activity extends Activity implements
OnPreparedListener {
Con esto decimos que nuestra clase implementar el mtodo onPrepared donde iniciamos la
ejecucin del mp3:
public void onPrepared(MediaPlayer mp) {
mp.start();
}
En el evento click del botn creamos el objeto de la clase MediaPlayer, le pasamos al mtodo
setOnPreparedListener la direccin del objeto que capturar el evento de que el recurso est
completo. Luego llamamos a los mtodos setDataSource y prepareAsync para inicializar la carga
del mp3. Finalmente mostramos un mensaje para informar al usuario que el archivo se est
descargando:
public void ejecutar(View v) {
mp=new MediaPlayer();
mp.setOnPreparedListener(this);
try {
mp.setDataSource("http://www.codigofuenteya.com.ar/recursos/gato.mp3");
mp.prepareAsync();
}catch(IOException e) {
}
Toast t=Toast.makeText(this,"Espere un momento mientras se
carga el mp3", Toast.LENGTH_SHORT);
t.show();
}
Final del proyecto023.
Disponer un botn con la etiqueta: "Ejecutar mp3 con el reproductor propio de Android", luego
cuando se presione reproducir el archivo de audio respectivo con el reproductor de Android via
Intent. El archivo de sonido almacenarlo en la tarjeta SD.
Luego de crear el proyecto debemos ejecutar la aplicacin en modo depuracin para poder
acceder a la tarjeta SD que crea el emulador Android. Para ejecutar la aplicacin en modo
"Debug" presionamos el botn derecha del mouse sobre el proyecto y seleccionamos la opcin
"Debug A" "Android Aplication":
Una vez que se este ejecutando la aplicacin (no importa que todava no hemos implementado
su funcionalidad) procedemos a abrir la ventana "File Explorer" de Android. Seleccionamos del
men de opciones de Eclipse: Window -> Show View -> Other :
Ahora podemos ver la ventana donde administramos los archivos contenidos en la tarjeta SD que
emula el "Android Virtual Device":
En la carpeta sdcard debemos subir el archivo mp3 (debemos seleccionar esta carpeta con el
mouse)
Esto lo hacemos mediante un botn que aparece en la parte derecha de esta ventana "Push a file
onto device", luego de esto tenemos el archivo montado en la tarjeta SD:
android.app.Activity;
android.content.Intent;
android.net.Uri;
android.os.Bundle;
android.view.View;
Disponer dos objetos de la clase Button con las etiquetas "Grabar" y "Reproducir". Cuando se
presione el primer botn proceder a activar la grabadora provista por Android. Cuando se
presione el segundo botn reproducir el audio grabado.
Crear la interfaz e inicializar los eventos On click de cada botn:
android.app.Activity;
android.content.Intent;
android.media.MediaPlayer;
android.media.MediaPlayer.OnCompletionListener;
android.net.Uri;
android.os.Bundle;
android.provider.MediaStore;
android.view.View;
new
new
Debemos pasar al mtodo startActivityForResult adems de la referencia del Intent una variable
con un valor 0 o positivo (luego este valor retornar al mtodo onActivityResult)
Cuando finalizamos la grabacin se ejecuta el mtodo onActivityResult, donde almacenamos en
la variable url1 la referencia al archivo de audio creado:
protected void onActivityResult (int requestCode, int resultCode,
Intent data) {
if (resultCode == RESULT_OK && requestCode == peticion) {
url1 = data.getData();
}
Por ltimo para ejecutar el contenido de la grabacin utilizamos la clase ya vista MediaPlayer:
public void reproducir(View v) {
MediaPlayer mediaPlayer = MediaPlayer.create(this, url1);
mediaPlayer.start();
}
Final del proyecto025.
Disponer tres objetos de la clase Button con las etiquetas "Grabar", "Detener Grabacin" y
"Reproducir Grabacin". Disponer adems un TextView para informar del estado actual.
Cuando se presione el botn "Grabar" permitir registrar todos los sonidos hasta que se presione
el botn "Detener Grabacin". Cuando se presione el botn "Reproducir Grabacin" emitir el
archivo de audio previamente generado.
La interfaz visual a implementar es la siguiente:
Tener en cuenta de no olvidar definir los tres mtodos para los tres botones: grabar, detener y
reproducir.
Tambin debemos modificar el archivo AndroidManifest.xml donde debemos indicar que nuestra
aplicacin acceder a la grabadora de sonido y a la tarjeta SD donde se almacenar el archivo de
sonido.
java.io.File;
java.io.IOException;
android.app.Activity;
android.media.MediaPlayer;
android.media.MediaRecorder;
android.media.MediaPlayer.OnCompletionListener;
android.os.Bundle;
android.os.Environment;
android.view.View;
android.widget.Button;
android.widget.TextView;
public
class
Proyecto026Activity
OnCompletionListener {
TextView tv1;
MediaRecorder recorder;
MediaPlayer player;
File archivo;
Button b1,b2,b3;
extends
Activity
implements
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
File
path
=
new
File(Environment.getExternalStorageDirectory().getPath());
try {
archivo = File.createTempFile("temporal", ".3gp", path);
} catch (IOException e) {
}
recorder.setOutputFile(archivo.getAbsolutePath());
try {
recorder.prepare();
} catch (IOException e) {
}
recorder.start();
tv1.setText("Grabando");
b1.setEnabled(false);
b2.setEnabled(true);
}
tv1.setText("Listo");
}
}
Declaramos un objeto de la clase MediaRecorder para grabar audio:
MediaRecorder recorder;
Declaramos un objeto de la clase MediaPlayer para reproducir el archivo de sonido generado:
MediaPlayer player;
Declaramos un objeto de la clase File que hace referencia al archivo que se crear:
File archivo;
Declaramos las variables que harn referencia a los tres botones y al TextView:
TextView tv1;
Button b1,b2,b3;
En el mtodo onCreate obtenemos la referencia de los cuatro objetos creados en el archivo XML:
tv1 = (TextView) this.findViewById(R.id.tv1);
b1=(Button)findViewById(R.id.button1);
b2=(Button)findViewById(R.id.button2);
b3=(Button)findViewById(R.id.button3);
El mtodo ms importante de este concepto es el grabar:
public void grabar(View v) {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
File path = new
File(Environment.getExternalStorageDirectory().getPath());
try {
archivo = File.createTempFile("temporal", ".3gp", path);
} catch (IOException e) {
}
recorder.setOutputFile(archivo.getAbsolutePath());
try {
recorder.prepare();
} catch (IOException e) {
}
recorder.start();
tv1.setText("Grabando");
b1.setEnabled(false);
b2.setEnabled(true);
}
Creamos un objeto de la clase MediaRecorder:
recorder = new MediaRecorder();
Seguidamente definimos el micrfono como fuente de audio:
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Luego llamamos al mtodo setOutputFormat especificando que el archivo ser almacenado con
la especificacin 3GPP y con extensin .3gp
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
Especificamos el codec a emplear llamando al mtodo setAudioEncoder:
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
Obtenemos el path de la tarjeta SD y creamos un archivo temporal con extensin 3gp:
File path = new
File(Environment.getExternalStorageDirectory().getPath());
try {
archivo = File.createTempFile("temporal", ".3gp", path);
} catch (IOException e) {
}
Con el mtodo setOutputFile de la clase MediaRecorder le indicamos el archivo donde debe
almacenarse la grabacin:
recorder.setOutputFile(archivo.getAbsolutePath());
Llamamos al mtodo prepare y finalmente al mtodo start para comenzar la grabacin:
try {
recorder.prepare();
} catch (IOException e) {
}
recorder.start();
El mtodo detener:
public void detener(View v) {
recorder.stop();
recorder.release();
player = new MediaPlayer();
player.setOnCompletionListener(this);
try {
player.setDataSource(archivo.getAbsolutePath());
} catch (IOException e) {
}
try {
player.prepare();
} catch (IOException e) {
}
b1.setEnabled(true);
b2.setEnabled(false);
b3.setEnabled(true);
tv1.setText("Listo para reproducir");
}
Llamamos primero al mtodo stop de la clase MediaRecorder y liberamos los recursos
consumidos llamando a release:
recorder.stop();
recorder.release();
Creamos un objeto de la clase MediaPlayer para poder reproducir el archivo de audio que
acabamos de grabar. Indicamos mediante el mtodo setOnCompletionListener la referencia de la
clase que ser informada cuando el audio finalice:
player = new MediaPlayer();
player.setOnCompletionListener(this);
Referenciamos el archivo a que debe reproducir:
try {
player.setDataSource(archivo.getAbsolutePath());
} catch (IOException e) {
}
Finalmente llamamos al mtodo prepare de la clase MediaPlayer:
try {
player.prepare();
} catch (IOException e) {
}
El mtodo reproducir simplemente llama al mtodo start de la clase MediaPlayer para iniciar la
reproduccin del archivo previamente grabado:
public void reproducir(View v) {
player.start();
b1.setEnabled(false);
b2.setEnabled(false);
b3.setEnabled(false);
tv1.setText("Reproduciendo");
}
El mtodo onCompletion se ejecuta cuando termina de reproducirse el archivo de audio:
29 - Men de opciones
En Android la implementacin de un men de opciones permite mostrar opciones de una forma
estandarizada entre aplicaciones (esto hace que todos los programas tengan una vista de un
men muy parecidos)
Los mens aparecen en la parte inferior de la pantalla cuando el usuario presiona el botn Men
del celular.
La implementacin del men se puede hacer de forma similar a la interfaz visual de la aplicacin
mediante la creacin de un archivo XML y la construccin del mismo empleando las herramientas
que provee el plugin de Eclipse para Android.
Problema:
Confeccionar una aplicacin que muestre un men con dos opciones: una que visualice el
"Acerca de..." (nombre de la aplicacin, programador etc.) del programa y otra que finalice el
programa.
Lo primero que hacemos es crear el archivo XML que contendr el men de opciones
(presionamos el botn derecho del mouse sobre la carpeta res de nuestro proyecto y
seleccionamos New -> Android XML File):
Aparece un dilogo donde debemos indicar el nombre del archivo de recursos a crear (lo
llamamos menu1, este es el nombre del archivo XML que se crear en una carpeta llamada
menu que depende de la carpeta res) y seleccionamos el RadioButton de menu:
La intefaz del editor de menu que nos provee el plugin de Android para Eclipse es:
Luego nos queda inicializar como mnimo el ttulo de que mostrar dicha opcin:
Ahora nuevamente presionamos el botn "Add" para aadir la segunda opcin. En el dilogo que
aparece seleccionamos "Create a new element at the top level, in Menu", seguidamente
seleccionamos "Item" y confirmamos:
Paso
seguido
debemos
sobreescribir
los
onOptionsItemSelected heredados de la clase Activity.
mtodos
onCreateOptionsMenu
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.view.MenuInflater;
android.view.MenuItem;
android.widget.Toast;
Diego
Confeccionar una aplicacin que muestre un men con dos opciones: una que visualice el texto
"Sitios interesantes..." y al ser seleccionado muestre otro submen con una serie de buscadores.
y otra opcin en el men principal para que finalice el programa.
Creamos el archivo "Android XML File" siguiendo los mismos pasos indicados en el concepto
anterior, procedemos a crear el primer Item y luego creamos el submen para dicho menuitem
como lo indica la siguiente imagen:
Luego aadimos varios Menu Item al Sub-Menu (uno por cada sitio web a enlazar):
android.app.Activity;
android.content.Intent;
android.net.Uri;
android.os.Bundle;
android.view.Menu;
android.view.MenuInflater;
android.view.MenuItem;
android.widget.Toast;
Confeccionar una aplicacin que muestre un men con dos opciones: una que active el
navegador con YouTube y otra que active Facebook. Disponer un cono para cada MenuItem.
Luego de crear el proyecto procedemos a buscar dos conos representativos de Youtube y
Facebook (dos archivos png de 48 pxeles de ancho y alto) y los almacenamos en la carpeta
drawable-mdpi.
Luego de refrescar la carpeta debemos tener en nuestro proyecto en dicha carpeta tres archivos:
Procedemos seguidamente a crear el archivo Android XML File (recordemos que lo hacemos
presionando el botn derecho del mouse sobre la carpeta res y seleccionando New -> Android
XML File)
Creamos un menu llamado menu1 y seleccionamos el RadioButton Menu.
Ahora tenemos que crear los dos Item y especificar las propiedades Title (con el texto que
queremos que se muestre) y la propiedad Icon.
Para configurar cada icon procedemos a asignar los valores @drawable/youtube y
@drawable/facebook (los nombres coinciden con los nombres de archivos que copiamos a la
carpeta drawable)
Nos queda agregar solo la funcionalidad de cada MenuItem:
package android.proyecto029;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import
import
import
import
android.os.Bundle;
android.view.Menu;
android.view.MenuInflater;
android.view.MenuItem;
new
new
Luego cuando lo ejecutamos podemos observar el cono que se muestra en cada MenuItem:
32 - Men contextuales
Otra variante de men de opciones son los men contextuales que se pueden asociar a distintos
componentes visuales del formulario (TextView, EditText, ListView etc.)
Un men contectual aparece cuando el usuario presiona por un tiempo ms o menos prolongado
el control visual.
Problema:
Confeccionar una aplicacin que muestre un EditText y asociarle un men contextual que permita
cambiar el color de fondo del mismo. El men debe permitir seleccionar entre el rojo, verde y
azul.
Primero creamos un proyecto y creamos una interfaz con un control de tipo EditText:
Luego creamos el archivo XML que contendr el men de opciones (presionamos el botn
derecho del mouse sobre la carpeta res de nuestro proyecto y seleccionamos New -> Android
XML File):
Aparece un dilogo donde debemos indicar el nombre del archivo de recursos a crear (lo
llamamos menu1, este es el nombre del archivo XML que se crear en una carpeta llamada
menu que depende de la carpeta res) y seleccionamos el RadioButton de men
Ya tenemos una nueva carpeta llamada menu y un archivo llamado menu1.
Ahora veamos como asociar el archivo XML donde definimos el men con el cdigo Java:
package android.proyecto030;
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.graphics.Color;
android.os.Bundle;
android.view.ContextMenu;
android.view.ContextMenu.ContextMenuInfo;
android.view.MenuInflater;
android.view.MenuItem;
android.view.View;
android.widget.EditText;
public
void
onCreateContextMenu(ContextMenu
v,ContextMenuInfo menuInfo)
{
menu.setHeaderTitle("Elija el color de fondo:");
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu1, menu);
}
menu,
View
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:et1.setBackgroundColor(Color.rgb(255, 0, 0)) ;
break;
case R.id.item2:et1.setBackgroundColor(Color.rgb(0, 255, 0)) ;
break;
case R.id.item3:et1.setBackgroundColor(Color.rgb(0, 0, 255)) ;
break;
}
return true;
}
}
En el mtodo onCreateContextMenu asociamos el archivo XML llamando al mtodo inflate de la
clase MenuInflate.
Podemos tambin llamar al mtodo setHeaderTitle para mostrar un ttulo en el men emergente.
@Override
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo
menuInfo)
{
menu.setHeaderTitle("Elija el color de fondo:");
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu1, menu);
}
33 - AlertDialog simple
El dilogo ms simple que podemos crear con Android en una ventana con un ttulo, un mensaje
y un botn para cerrarlo.
Muy til si tenemos que informar al usuario y no queremos que la ventana desaparezca hasta
que el usuario presione un botn para ocultar el dilogo.
Problema:
Confeccionar una aplicacin que muestre un dilogo cada vez que se inicie la aplicacin
informando que el programa que est ejecutando es un programa de prueba y no el completo.
Primero creamos un proyecto llamado: proyecto031
Lo almacenamos en el paquete: android.proyecto031
El cdigo fuente de la aplicacin queda como sigue:
package android.proyecto021;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
public class Proyecto031Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Importante");
builder.setMessage("Este es un programa solo de prueba y no la
versin completa");
builder.setPositiveButton("OK",null);
builder.create();
builder.show();
}
}
Como queremos que el dilogo aparezca inmediatamente se arranque la aplicacin procedemos
a incorporar el cdigo en el mtodo onCreate.
Primero debemos importar la clase AlertDialog:
import android.app.AlertDialog;
La clase AlertDialog contiene otra clase llamada Builder que es la que encapsula la creacin de
objetos de la clase AlertDialog. Procedemos a definir y crear un objeto de la clase Builder
contenida en la clase AlertDialog:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Una vez creado el objeto procedemos a llamar al mtodo que define el ttulo a mostrar en el
dilogo:
builder.setTitle("Importante");
El mensaje propiamente dicho lo configuramos llamando al mtodo setMessage:
builder.setMessage("Este es un programa solo de prueba y no la
versin completa");
Mostramos un botn para poder cerrar el dilogo:
builder.setPositiveButton("OK",null);
Finalmente llamamos al mtodo que crea el dilogo y el que lo visualiza:
builder.create();
builder.show();
Confeccionar una aplicacin que muestre un dilogo cada vez que se inicie la aplicacin
informando: "Acepta la ejecucin de este programa en modo prueba?" y dos botones para
confirmar o rechazar. En caso que se rechace finalizar la ejecucin del programa.
Primero creamos un proyecto llamado: proyecto032
Lo almacenamos en el paquete: android.proyecto032
El cdigo fuente de la aplicacin queda como sigue:
package android.proyecto032;
import
import
import
import
import
android.app.Activity;
android.app.AlertDialog;
android.content.DialogInterface;
android.os.Bundle;
android.widget.Toast;
new
new
Definimos los mtodos del Activity que se llamaran desde las clases annimas:
public void aceptar() {
Toast t=Toast.makeText(this,"Bienvenido a probar el programa.",
Toast.LENGTH_SHORT);
t.show();
}
public void cancelar() {
finish();
}
La interfaz del dilogo es similar a esta:
Confeccionar una aplicacin que muestre una serie de botones y active mensajes de
notificaciones con la clase Toast.
Primero creamos un proyecto llamado: proyecto033.
Lo almacenamos en el paquete: android.proyecto033
La interfaz visual a implementar son tres botones:
No olvidemos inicializar la propiedad On Click de cada botn con los mtodos: prueba1, prueba2
y prueba3.
android.app.Activity;
android.os.Bundle;
android.view.Gravity;
android.view.LayoutInflater;
android.view.View;
android.widget.Toast;
"Mensaje
1",
2",
null);
}
Para el evento click del primer botn mostramos el mensaje con las estructura ms simple que
nos provee la clase Toast. Definimos un objeto de la clase Toast y llamamos al mtodo makeText
pasando como parmetro la referencia del Activity, el mensaje a mostrar y una constante
indicando si queremos que el mensaje aparezca por un perodo corto o largo de tiempo en la
pantalla. Por ltimo llamamos al mtodo show para que se muestre el mensaje:
Si queremos ubicar en otra parte de la pantalla debemos llamar al mtodo setGravity e indicar en
el primer parmetro una constante (en este ejemplo lo centramos verticalmente)
En el segundo y tercer parmetro de setGravity podemos desplazarlo una cantidad de pxeles
hacia derecha o izquierda, arriba o abajo segn indiquemos valores positivos o negativos.
Luego el mtodo completo para este segundo Toast es:
2",
Para generar un Toast customizado debemos crear un archivo XML donde creamos visualmente
los controles a mostrar, en este ejemplo creamos el siguiente archivo (crear un archivo llamado
toast1.xml):
Ahora codificamos la clase donde se encuentra toda la lgica para encender el pxel:
package android.proyecto034;
import
import
import
import
import
import
import
android.app.Activity;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.os.Bundle;
android.view.View;
android.widget.LinearLayout;
LinearLayout
linearLayout
(LinearLayout)findViewById(R.id.linearLayout1);
Lienzo fondo=new Lienzo(this);
linearLayout.addView(fondo);
}
Pintar el fondo de color amarillo y dibujar una serie de lneas con distintos estilos.
Creamos un proyecto llamado: proyecto035
Lo almacenamos en el paquete: android.proyecto035
Borramos el TextView que agrega automticamente el plug-in de Eclipse y procedemos a insertar
un objeto de la clase LinearLayout (vertical):
Ahora codificamos la clase donde se encuentra toda la lgica para pintar el fondo y dibujar las
lneas:
package android.proyecto035;
import
import
import
import
import
import
import
android.app.Activity;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.os.Bundle;
android.view.View;
android.widget.LinearLayout;
LinearLayout
linearLayout
(LinearLayout)findViewById(R.id.linearLayout1);
Lienzo fondo=new Lienzo(this);
linearLayout.addView(fondo);
}
La siguiente lnea la dibujamos en la fila 60 pero previamente cambiamos el grosor del pincel
llamando al mtodo setTrokeWidth indicando que sern 4 pxeles el grosor:
pincel1.setStrokeWidth(4);
canvas.drawLine(0, 60, ancho, 60, pincel1);
Problema propuesto
Confeccionar una aplicacin que muestre una hoja en la pantalla similar a esta:
38 - Dibujar: rectngulos
Problema:
Pintar el fondo de color blanco y dibujar una serie de rectngulos con distintos estilos.
1 - Creamos un proyecto llamado: proyecto037
Lo almacenamos en el paquete: android.proyecto037
Borramos el TextView que agrega automticamente el plug-in de Eclipse y procedemos a insertar
un objeto de la clase LinearLayout (vertical):
android.app.Activity;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.graphics.Paint.Style;
android.os.Bundle;
android.view.View;
android.widget.LinearLayout;
linearLayout.addView(fondo);
}
Para el siguiente rectngulo configuramos el pincel para que solo pinte el permetro llamando al
mtodo setStyle y pasando la constante STROKE:
pincel1.setStyle(Style.STROKE);
canvas.drawRect(10,60,ancho-10,90,pincel1);
Por ltimo dibujamos otro rectngulo que solo se pinta el permetro pero cambiamos el grosor del
lapiz llamando al mtodo setStrokeWidth:
pincel1.setStrokeWidth(3);
canvas.drawRect(10,110,ancho-10,140,pincel1);
La vista previa de la aplicacin es:
39 - Dibujar: crculos
Problema:
Pintar el fondo de color blanco y dibujar 10 crculos crecientes desde el medio de la pantalla.
Creamos un proyecto llamado: proyecto038
Lo almacenamos en el paquete: android.proyecto038
Borramos el TextView que agrega automticamente el plug-in de Eclipse y procedemos a insertar
un objeto de la clase LinearLayout (vertical):
android.app.Activity;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.graphics.Paint.Style;
android.os.Bundle;
android.view.View;
android.widget.LinearLayout;
linearLayout.addView(fondo);
}
40 - Dibujar: valos
Problema:
android.app.Activity;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.graphics.Paint.Style;
android.graphics.RectF;
android.os.Bundle;
android.view.View;
android.view.Window;
android.view.WindowManager;
android.widget.LinearLayout;
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout
linearLayout
(LinearLayout)findViewById(R.id.linearLayout1);
Lienzo fondo=new Lienzo(this);
linearLayout.addView(fondo);
}
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout
linearLayout
(LinearLayout)findViewById(R.id.linearLayout1);
Lienzo fondo=new Lienzo(this);
linearLayout.addView(fondo);
}
int menor;
if (ancho<alto)
menor=ancho;
else
menor=alto;
Configuramos ahora el pincel para dibujar el crculo y lo dibujamos:
pincel1.setStyle(Style.FILL);
pincel1.setARGB(255, 255, 255, 0);
canvas.drawCircle(ancho/2, alto/2, menor/2, pincel1);
}
41 - Dibujar: texto
Otra recurso que nos permite la clase Canvas es el de graficar texto.
Creamos un proyecto llamado: proyecto040
Lo almacenamos en el paquete: android.proyecto040
Borramos el TextView que agrega automticamente el plug-in de Eclipse y procedemos a insertar
un objeto de la clase LinearLayout (vertical):
android.app.Activity;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.graphics.Typeface;
android.os.Bundle;
android.view.View;
android.view.Window;
android.view.WindowManager;
android.widget.LinearLayout;
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout
linearLayout
(LinearLayout)findViewById(R.id.linearLayout1);
Lienzo fondo=new Lienzo(this);
linearLayout.addView(fondo);
}
pincel1.setTextSize(30);
El estilo de la letra:
pincel1.setTypeface(Typeface.SERIF);
La interfaz del programa es:
Procedemos ahora a descargar una fuente del sitio Creamundo y copiamos el archivo de la
fuente a la carpeta assets como se muestra:
import
import
import
import
import
import
import
android.graphics.Paint;
android.graphics.Typeface;
android.os.Bundle;
android.view.View;
android.view.Window;
android.view.WindowManager;
android.widget.LinearLayout;
Typeface
face
=
Typeface.createFromAsset(getAssets(),
"Action Man Shaded.ttf");
pincel1.setTypeface(face);
La interfaz del programa es:
android.app.Activity;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.graphics.Path;
android.os.Bundle;
android.view.View;
android.view.Window;
android.view.WindowManager;
android.widget.LinearLayout;
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout
linearLayout
(LinearLayout)findViewById(R.id.linearLayout1);
Lienzo fondo=new Lienzo(this);
linearLayout.addView(fondo);
}
camino.lineTo(160,
camino.lineTo(220,
camino.lineTo(280,
camino.lineTo(340,
alto/2-120);
alto/2-150);
alto/2-180);
alto/2-210);
Mostrar el contenido de un archivo jpg centrado en la pantalla sabiendo que tiene un tamao de
250 pxeles de ancho por 200 de alto.
Creamos un proyecto llamado: proyecto043
Lo almacenamos en el paquete: android.proyecto043
Borramos el TextView que agrega automticamente el plug-in de Eclipse y procedemos a insertar
un objeto de la clase LinearLayout (vertical):
Descargar de internet una imagen y redimensionarla a 250*200 pxeles. Copiar dicho archivo a la
carpeta res/drawable-hdpi de nuestro proyecto (actualizar desde el Eclipse dicha carpeta):
android.app.Activity;
android.content.Context;
android.graphics.Bitmap;
android.graphics.BitmapFactory;
android.graphics.Canvas;
android.os.Bundle;
android.view.View;
android.view.Window;
android.view.WindowManager;
android.widget.LinearLayout;
Para recuperar la imagen del archivo de la carpeta res/drawable-hdpi debemos utilizar el mtodo
decodeResource:
Bitmap bmp=BitmapFactory.decodeResource(getResources(),
R.drawable.imagen1);
Una vez que tenemos creado el objeto de la clase Bitmap procedemos a posicionar la imagen en
forma centrada en la pantalla del dispositivo:
canvas.drawBitmap(bmp, (ancho-250)/2,(alto-200)/2, null);
La vista previa de la aplicacin es:
Ahora codificamos la clase donde se encuentra toda la lgica para capturar el evento onTouch:
package android.proyecto044;
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.os.Bundle;
android.view.MotionEvent;
android.view.View;
android.view.View.OnTouchListener;
android.widget.LinearLayout;
public
class
Proyecto044Activity
extends
Activity
OnTouchListener{
private int corx,cory;
private Lienzo fondo;
/** Called when the activity is first created. */
implements
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout
linearLayout
(LinearLayout)findViewById(R.id.linearLayout1);
corx=100;
cory=100;
fondo=new Lienzo(this);
fondo.setOnTouchListener(this);
linearLayout.addView(fondo);
}
&&
yy>=this.y
&&
Y la clase:
package android.buscaminas;
import
import
import
import
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.graphics.Typeface;
android.os.Bundle;
android.view.MotionEvent;
android.view.View;
android.view.View.OnTouchListener;
android.view.Window;
android.view.WindowManager;
android.widget.LinearLayout;
android.widget.Toast;
public
class
BuscaMinasActivity
OnTouchListener {
extends
Activity
implements
for(int f=0;f<8;f++) {
for(int c=0;c<8;c++) {
casillas[f][c]=new Casilla();
}
}
this.disponerBombas();
this.contarBombasPerimetro();
activo=true;
fondo.invalidate();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (activo)
for(int f=0;f<8;f++) {
for(int c=0;c<8;c++) {
if
(casillas[f][c].dentro((int)event.getX(),(int)event.getY()))
{
casillas[f][c].destapado=true;
if (casillas[f][c].contenido==80)
{
Toast.makeText(this,"Booooooooommmmmmmmmmmm", Toast.LENGTH_LONG).show();
activo=false;
}
else
if (casillas[f][c].contenido==0)
recorrer (f, c);
fondo.invalidate();
}
}
}
if (gano() && activo)
{
Toast.makeText(this,"Ganaste", Toast.LENGTH_LONG).show();
activo=false;
}
return true;
}
class Tablero extends View {
public Tablero(Context context) {
super(context);
}
protected void onDraw(Canvas canvas) {
canvas.drawRGB(0, 0,0 );
int ancho=0;
if (canvas.getWidth()<canvas.getHeight())
ancho=fondo.getWidth();
else
ancho=fondo.getHeight();
int anchocua=ancho/8;
Paint paint=new Paint();
paint.setTextSize(20);
Paint paint2=new Paint();
paint2.setTextSize(20);
paint2.setTypeface(Typeface.DEFAULT_BOLD);
paint2.setARGB(255, 0,0, 255);
Paint paintlinea1=new Paint();
paintlinea1.setARGB(255,255,255,255);
int filaact=0;
for(int f=0;f<8;f++) {
for(int c=0;c<8;c++) {
casillas[f][c].fijarxy(c*anchocua,filaact,anchocua);
if (casillas[f][c].destapado==false)
paint.setARGB(153, 204,204,204);
else
paint.setARGB(255, 153,153, 153);
canvas.drawRect(c*anchocua,
filaact,
c*anchocua+anchocua-2,filaact+anchocua-2,paint);
//linea blanca
canvas.drawLine(c*anchocua,
filaact,
c*anchocua+anchocua, filaact, paintlinea1);
canvas.drawLine(c*anchocua+anchocua-1,
filaact,
c*anchocua+anchocua-1, filaact+anchocua, paintlinea1);
if
(casillas[f][c].contenido>=1
casillas[f][c].contenido<=8 && casillas[f][c].destapado)
&&
canvas.drawText(String.valueOf(casillas[f][c].contenido),
c*anchocua+(anchocua/2)-8, filaact+anchocua/2, paint2);
if
(casillas[f][c].contenido==80
casillas[f][c].destapado)
{
Paint bomba=new Paint();
bomba.setARGB(255,255,0,0);
canvas.drawCircle(c*anchocua+(anchocua/2),
filaact+(anchocua/2), 8, bomba);
}
}
filaact=filaact+anchocua;
}
}
}
&&
}
if (fila - 1 >= 0)
{
if (casillas [fila - 1] [columna].contenido == 80)
total++;
}
if (fila - 1 >= 0 && columna + 1 < 8)
{
if (casillas [fila - 1] [columna + 1].contenido == 80)
total++;
}
if (columna + 1 < 8)
{
if (casillas [fila] [columna + 1].contenido == 80)
total++;
}
if (fila + 1 < 8 && columna + 1 < 8)
{
if (casillas [fila + 1] [columna + 1].contenido == 80)
total++;
}
if (fila + 1 < 8)
{
if (casillas [fila + 1] [columna].contenido == 80)
total++;
}
if (fila + 1 < 8 && columna - 1 >= 0)
{
if (casillas [fila + 1] [columna - 1].contenido == 80)
total++;
}
if (columna - 1 >= 0)
{
if (casillas [fila] [columna - 1].contenido == 80)
total++;
}
return total;
}
recorrer
recorrer
recorrer
recorrer
recorrer
recorrer
recorrer
(fil, col
(fil + 1,
(fil - 1,
(fil - 1,
(fil - 1,
(fil + 1,
(fil + 1,
- 1);
col);
col);
col col +
col +
col -
1);
1);
1);
1);
}
else
if (casillas [fil] [col].contenido>=1 &&
[fil][col].contenido<=8)
{
casillas [fil] [col].destapado=true;
}
}
}
}
La interfaz visual de la aplicacin es:
casillas
47 - Archivo strings.xml
El archivo strings.xml se utiliza para almacenar todas las constantes de cadenas de caracteres que se
necesitan en un programa (por ejemplo las etiquetas de los objetos Button, los textos fijos de los controles
TextView y todos los controles que muestran un texto fijo en el dispositivo)
La idea fundamental es tener todos los mensajes que muestra nuestra aplicacin en un archivo
(strings.xml)
Ya veremos en el prximo concepto que uno de las ventajas que presenta esta agrupacin de
string es la posibilidad de facilitar la implementacin de aplicaciones en mltiples idiomas.
Problema:
Crear un proyecto que solicite la carga de dos valores. Mediante dos RadioButton permitir
seleccionar si queremos sumar o restar. Cuando se presione un botn mostrar en un TextView el
resultado de la operacin.
Creamos un proyecto llamado: proyecto045
Lo almacenamos en el paquete: android.proyecto045
El Plugin de Eclipse nos crea automticamente el archivo strings.xml en la carpeta values que se
encuentra en la carpeta res:
Si vemos en su interior podemos ver que ya define dos string llamados app_name y hello:
Lo que se encuentra entre las marcas string es lo que se visualizar, por ejemplo en la constante
hello se almacena el valor "Hello World, Proyecto045Activity!". En este archivo crearemos todas
las constantes a incluir en nuestro programa. Si vemos en la parte inferior de la ventana donde se
visualiza el archivo xml hay una pestaa llamada Resource que nos permite ingresar las distintas
constantes de una forma visual:
Creamos primero la interfaz visual disponiendo dos controles de tipo EditText, un RadioGroup
con dos RadioButton, un Button y un TextView donde se muestra el resultado de la operacin:
Ahora si crearemos los mensajes que mostrarn los dos RadioButton y el Button. Para esto
seleccionamos el archivo strings y procedemos a crear las tres constantes:
Una vez que tenemos abierto el archivo strings.xml en modo "Resources" procedemos a
presionar el botn "Add..." y seleccionamos "String":
Creamos los nombres de las constantes y los valores, por ejemplo para el mensaje que mostrar
el primer RadioButton llamamos la constante con el nombre "radiosuma" y el valor que almacena
es "Sumar"
De forma similar creamos las constantes "radioresta" con el valor "Restar" y el boton para operar
lo llamamos "botonoperacion" con el valor "Operar". Si seleccionamos la pestaa strings.xml
luego podemos ver las tres constantes que hemos creado (podemos borrar la constante que cre
el plugin de Eclipse "hello" ya que no lo utilizaremos):
Ahora debemos asociar estas constantes a los controles visuales. Seleccionamos el archivo
main.xml y seleccionamos primero el primer RadioButton y buscamos la propiedad Text,
presionamos el botn que aparece a la derecha:
Ahora tenemos asociada la constante "radiosuma" con la propiedad text del control RadioButton.
Lo mismo podramos haber hecho esto escribiendo en la propiedad @string/radiosuma (@string
lo utilizamos para indicar que el siguiente dato despus de la barra se trata de una constante
definida en el archivo strings.xml)
Utilizar el dilogo de seleccin de recursos nos facilita no tener que recordar todas las
constantes.
Lo mismo hacemos para asociar las constantes para el segundo RadioButton y el Button de
operar. Es decir las propiedades text del radio1 debe quedar con el valor "@string/radioresta" y el
valor de la propiedad text del objeto button1 debe ser "@string/botonoperacion"
Como vemos cuando asociamos las propiedades text de los controles con las constantes
automticamente vemos en pantalla que los textos de los controles se actualizan con los valores
almacenados en dichas constantes.
Para que funcione nuestro programa inicializamos la propiedad On click del Button con el mtodo
que sumar o restar:
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.EditText;
android.widget.RadioButton;
android.widget.TextView;
RadioButton rb1,rb2;
TextView tv1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et1=(EditText)findViewById(R.id.editText1);
et2=(EditText)findViewById(R.id.editText2);
rb1=(RadioButton)findViewById(R.id.radio0);
rb2=(RadioButton)findViewById(R.id.radio1);
tv1=(TextView)findViewById(R.id.textView1);
}
public void operar(View v) {
int v1=Integer.parseInt(et1.getText().toString());
int v2=Integer.parseInt(et2.getText().toString());
if (rb1.isChecked()){
int suma=v1+v2;
tv1.setText(String.valueOf(suma));
}
else
if (rb2.isChecked()) {
int resta=v1-v2;
tv1.setText(String.valueOf(resta));
}
}
}
El resultado final del programa en el dispositivo es:
48 - Internacionalizacin y archivo
strings.xml
La internacionalizacin de un programa en Android se resuelve implementando varios archivos
strings.xml (uno por cada idioma que necesitemos implementar)
Problema:
Modificar el proyecto025 de tal manera que muestre su interfaz en castellano o ingles segn la
configuracin del idioma seleccionado en el dispositivo.
Crearemos primero una nueva carpeta llamada values-en (las abreviaturas para los distintos
lenguajes los podemos ver en la pgina ISO 639-1 Code (segunda columna)
Es decir creamos otra carpeta con el mismo nombre (values) ms un guin y la extensin del
lenguaje a implementar:
Creamos un archivo xml llamado strings.xml en la carpeta que acabamos de crear y copiamos
todo el archivo strings.xml de la otra carpeta values. Procedemos a traducir los valores
almacenados en cada string:
Solamente con esto ya tenemos nuestra aplicacin funcionando en dos idiomas. Para probar
debemos acceder al emulador de Android y configurarlo en ingls (tecla home -> tecla menu ->
configuracin > Idioma y teclado > Seleccionar idioma -> "English (United Stated)
Luego de esto lanzamos la aplicacin y deberemos ver la interfaz con los string que configuramos
en el archivo strings.xml de la carpeta values-en:
Modificar el proyecto025 de tal manera que muestre su interfaz no solo para el idioma por defecto
(espaol) e ingles, sino para el portugus de Brasil y el portugus de Portugal.
Las abreviaturas para los distintos lenguajes los podemos ver en la pgina ISO 639-1 Code
(segunda columna) y para obtener las distintas regiones utilizamos la tabla ISO 3166-1-alpha-2
Luego debemos crear una carpeta con el nombre values, luego un guin y el cdigo de
internacionalizacin, finalmente otro guin el caracter r y finalmente el cdigo de regin.
En nuestro problemas crearemos dos directorios llamados:
values-pt-rBR
values-pt-rPT
Luego de crear estos dos directorios copiaremos el archivo strings.xml de la carpeta values y
procederemos a traducirlo al portugus de Brasil y al portugus de Portugal.
Luego de crear las dos carpetas copiar el archivo strings.xml y proceder a traducirlo primero al
portugus de Brasil y luego en la otra carpeta traducirlo al portugus de Portugal, solo nos resta
compilar y probar la aplicacin.
Para probar debemos acceder al emulador de Android y configurarlo en portugus de Brasil (tecla
home -> tecla menu -> configuracin > Idioma y teclado > Seleccionar idioma -> "Portugus
(Brasil)
Seguidamente ejecutar la aplicacin y ver como resultado que tenemos los mensajes que
definimos en el archivo strings.xml asociado con el portugus de Brasil:
Lo mismo podemos luego configurar el idioma portugus de Portugal y obtener como resultado
en una nueva ejecucin del programa: