Академический Документы
Профессиональный Документы
Культура Документы
creada en 2001 bajo el lema Educacin en Tecnologa y Tecnologa en Educacin con el fin
de aunar los ideales e intereses de perso- nas y organizaciones que infieran que la tecnologa
es un aporte imprescindible para la educacin de un pas.
Lo realiza a travs de institutos que ha creado al efecto como los de Estudios e investigaciones
en Programacin, Teletrabajo, Seguridad en TICs, Tecnologa y Medio Ambiente, E learning,
Innovacin y Calidad.
Objetivo General
Unir los intereses e ideales de los profesores, investigadores y las partes interesadas que
interpretan que la educacin en materias de iniciacin en la lgica de diseo y programacin,
son los elementos necesarios para lograr que los jvenes puedan tener rpido acceso a la era
digital.
Objetivo particular
Prximamente
CURSOS y la edicin del libro "Programacin y Algoritmia, un enfoque prctico y
didctico para diseo de algoritmos" escrito por el Dr. Oscar R. Bruno
Instalacin de Android http://www.javaya.com.ar/androidya/detalleconcepto.php?codigo=132...
2 - El segundo paso es la descarga del ADT (que contiene todo lo necesario para comenzar el desarrollo de aplicaciones
en Android), lo hacemos del sitio (descargar el de 32 o 64 bit segn el JDK de Java que ya tenemos instalado del paso
anterior):
Android SDK.
eclipse
sdk
Nos pide seguidamente la carpeta donde deseamos ir almacenando los proyectos que desarrollemos:
Ahora ya estamos en el entorno que tiene una vista similar a esta (recordemos que es el Eclipse con algunos cambios
desarrollados por Google), la primera vez que ingresamos nos aparece una pantalla de bienvenida pero podemos
cerrarla haciendo clic en la cruz de la pestaa y ya tenemos el entorno de trabajo:
7 - Por ltimo debemos crear el AVD (Android Virtual Device) para ello nos dirigimos a la opcin Window -> Android
Virtual Device Manager.
En este dilogo debemos crear el emulador de Android (presionamos el botn New...):
En este dilogo asignamos un nombre a nuestro AVD, elegimos un dispositivo (que no sea tan grande ya que no entrara
en pantalla, podemos probar con WVGA(480,800)), lo enlazamos con la versin de SDK respectivo, fijamos un tamao al
SD Card:
Retornar
Ya tenemos todo lo necesario instalado para implementar el primer proyecto. Desde el men de opciones: File -> New ->
Android Application Project
En este dilogo especificamos el nombre de la aplicacin y proyecto (pueden ser iguales) y el nombre del paquete java
donde se almacenarn los archivos java que creemos (normalmente la url de su empresa al revs).
Ahora empezaremos a presionar el botn next para pasar a otras configuraciones de nuestra aplicacin, por el momento
dejaremos todos los valores por defecto en cada una de los dilogos que aparece (son 5 dilogos actualmente), en el
ltimo dilogo debe aparecer el botn "Finish" el cual presionamos.
El ADT 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 activity_main.xml. En esta carpeta tenemos creada nuestra primer pantalla.
Al seleccionar este archivo el ADT nos permite visualizar el contenido en "vista de diseo (Graphical Layout)":
El ADT ya insert un control de tipo RelativeLayout que permite ingresar controles visuales alineados a los bordes y a
otros controles que haya en la ventana (ms adelante analizaremos este layout)
Ya veremos que podemos modificar todo este archivo para que se adapte a la aplicacin que queremos desarrollar.
Luego contenido en el control RelativeLayout 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 vemos que en la parte derecha
de la pantalla aparece una ventana llamada "properties":
Y estando seleccionado el TextView buscamos la propiedad Text y cargamos: "Mi primer programa para Android" y
presionamos enter, podemos ver que se actualiza la vista:
Con esto ya podemos probar nuestra primer aplicacin para un dispositivo Android. SELECCIONAMOS con el mouse en
la ventana de la izquierda (Package Explorer) el proyecto001 y presionamos el cono de Run (tringulo verde) o desde el
men. 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)
Como hemos visto el ADT 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.
Retornar
Problema:
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.
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 ADT. 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:
Ahora lo seleccionamos y en la ventana de propiedades especificamos la propiedad text (como habamos visto
anteriormente) disponemos el texto "Ingrese el primer valor:":
Tambin vamos a especificar la propiedad "Id", la misma aparece primera en la paleta de propiedades y le asignaremos
el valor @+id/tv1 (el nombre es el que se indica luego de la barra es decir cambiamos textView1 por tv1) Cuidado de no
borrar @+id/
Hemos entonces asignado como nombre a este objeto: tv1 (recordemos que se trata de un objeto de la clase TextView)
Ahora de la paleta de componentes seleccionamos la pestaa "Text Fields" y arrastramos el primero (el que tiene la
etiqueta abc)
En la ventana de properties estando seleccionado el 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:
Si en este momento ejecutamos la aplicacin aparece la interfaz visual correctamente pero cuando presionemos el botn
no mostrar la suma.
Es fundamental una vez finalizada la interfaz visual proceder a grabarla (icono de los diskettes) o la opcin
File->Save para que se actualicen los archivos que se generan automticamente.
Hasta ahora hemos trabajado solo con el archivo xml (activity_main.xml) donde se definen los controles visuales de la
ventana que estamos creando.
La clase MainActivity 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.
package com.javaya.proyecto002;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Como mnimo se debe sobrescribir el mtodo onCreate heredado de la clase Activity donde procedemos a llamar la
mtodo setContentView pasando como referencia una valor almacenado en una constante llamada activity_main
contenida en una clase llamada layout que a su vez la contiene una clase llamada R (veremos ms adelante que el ADT
se encarga de crear la clase R en forma automtica y sirve como puente entre el archivo xml y nuestra clase MainActivity)
Luego veremos el otro mtodo onCreateOptionsMenu.
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 com.javaya.proyecto002;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.EditText;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
La forma ms fcil de importar las clases EditText y TextView es tipear las dos lneas:
import android.widget.EditText;
import android.widget.TextView;
Los nombres que le d a los objetos en este caso coinciden con la propiedad id (no es obligatorio):
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:
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 com.javaya.proyecto002;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1=(EditText)findViewById(R.id.et1);
et2=(EditText)findViewById(R.id.et2);
tv3=(TextView)findViewById(R.id.tv3);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Ahora debemos ir al archivo XML e inicializar la propiedad OnClick del objeto button1 con el nombre del mtodo que
acabamos de crear (este paso es fundamental para que el objeto de la clase Button pueda llamar al mtodo sumar que
acabamos de crear):
Finalmente implementaremos la lgica para sumar los dos valores ingresados en los controles EditText:
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)
package com.javaya.proyecto002;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1=(EditText)findViewById(R.id.et1);
et2=(EditText)findViewById(R.id.et2);
tv3=(TextView)findViewById(R.id.tv3);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Si ejecutamos nuestro programa podemos ver ahora que luego de cargar dos valores al presionar el botn aparece en el
tercer TextView el resultado de la suma de los dos EditText:
Retornar
El objetivo de este concepto es practicar la implementacin de un programa que requiera controles de tipo RadioButton
para seleccionar una actividad. Aprenderemos como agrupar un conjunto de RadioButton y verificar cual est
seleccionado.
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 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 Form Widgets):
Cuando arrastramos el control RadioGroup al formulario se generan automticamente 3 objetos de la clase RadioButton
contenidos dentro del RadioGroup, podemos fcilmente identificar que los controles RadioButton pertenecen a dicho
RadioGroup viendo la ventana de "Outline" del Eclipse (donde nos muestra todos los controles insertados hasta el
momento):
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)
id : button1
text : operar
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.
Si nuestro problema requera ms de 3 RadioButton deberamos arrastrar dentro del RadioGroup otros controles de tipo
RadioButton que se encuentran tambin en la pestaa de "Form Widgets"
Captura del evento clic del button e identifiacin del RadioButton seleccionado.
package com.javaya.proyecto003;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1=(EditText)findViewById(R.id.et1);
et2=(EditText)findViewById(R.id.et2);
tv3=(TextView)findViewById(R.id.tv3);
r1=(RadioButton)findViewById(R.id.r1);
r2=(RadioButton)findViewById(R.id.r2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Primero debemos enlazar el objeto button1 con el mtodo operar. Para esto similar al problema anterior seleccionamos el
control button1 y cambiamos la propiedad OnClick por el valor operar (si no hacemos esto nunca se ejecutar el mtodo
operar de la clase MainActivity)
Como podemos ver el cdigo fuente es igual al problema anterior. Tenemos dos objetos ms que debemos inicializar en
el mtodo onCreate:
r1=(RadioButton)findViewById(R.id.r1);
r2=(RadioButton)findViewById(R.id.r2);
Las variables r1 y r2 son de la clase RadioButton y son necesarios en el mtodo operar para verificar cual de los dos
RadioButton estn seleccionados. La clase RadioButton tiene un mtodo llamado isChecked que retorna true si dicho
elemento est seleccionado:
Retornar
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 "Form
Widgets":
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 com.androiya.proyecto004;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1=(EditText)findViewById(R.id.et1);
et2=(EditText)findViewById(R.id.et2);
tv3=(TextView)findViewById(R.id.tv3);
checkBox1=(CheckBox)findViewById(R.id.checkBox1);
checkBox2=(CheckBox)findViewById(R.id.checkBox2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
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);
Retornar
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 "Form Widgets":
En la siguiente imagen en la ventana "Outline" de Eclipse podemos observar los objetos dispuestos en el formulario, sus
Id, sus textos y de que clase son cada uno:
No olvidemos inicializar la propiedad OnClick del objeto button1 con el valor "operar" (dicho nombre es el mtodo que
debemos implementar)
Cdigo fuente:
package com.javaya.proyecto005;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1=(EditText)findViewById(R.id.et1);
et2=(EditText)findViewById(R.id.et2);
tv3=(TextView)findViewById(R.id.tv3);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
else
if (selec.equals("dividir")) {
int divi=nro1/nro2;
String resu=String.valueOf(divi);
tv3.setText(resu);
}
}
spinner1=(Spinner)findViewById(R.id.spinner1);
String []opciones={"sumar","restar","multiplicar","dividir"};
Al constructor le pasamos como primer parmetro la referencia de nuestro Activity (this), el segundo parmetro indica el
tipo de Spinner, pudiendo ser las constantes:
android.R.layout.simple_spinner_item
android.R.layout.simple_spinner_dropdown_item
Luego llamamos al mtodo setAdapter de la clase Spinner pasando la referencia del objeto de la clase ArrayAdapter que
acabamos de crear:
spinner1.setAdapter(adapter);
En el mtodo operar que se ejecuta cuando presionamos el botn procedemos a extraer el contenido seleccionado del
control Spinner:
String selec=spinner1.getSelectedItem().toString();
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);
}
Retornar
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.
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 com.javaya.proyecto006;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1=(TextView)findViewById(R.id.tv1);
lv1 =(ListView)findViewById(R.id.listView1);
ArrayAdapter <String> adapter = new ArrayAdapter<String>(this,android.R.lay
lv1.setAdapter(adapter);
lv1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int posicion, lo
tv1.setText("Poblacin de "+ lv1.getItemAtPosition(posicion) + " es
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is pre
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
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:
Definimos un objeto de tipo TextView y otro de tipo ListView donde almacenaremos las referencias a los objetos que
definimos en el archivo XML:
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:
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[pos
}
});
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:
Retornar
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":
Vemos que se actualiz el contenido de la carpeta y aparece la imagen que copiamos previamente.
Ahora insertaremos el objeto de la clase ImageButton en el formulario de nuestra aplicacin. La clase ImageButton se
encuentra en la pestaa "Image & Media":
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
Agreguemos un TextView a nuestra aplicacin y configuremos sus propiedades ID (con tv1) y text. Luego la interfaz visual
debe ser similar a:
Cdigo fuente:
package com.javaya.proyecto007;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
tv1=(TextView)findViewById(R.id.tv1);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
TextView tv1;
tv1=(TextView)findViewById(R.id.tv1);
No olvidemos inicializar la propiedad OnClick del objeto ib1 con el nombre del mtodo "llamar" (recordemos que esto lo
hacemos accediendo a la propiedad On Click en la ventana de "Properties")
drawable-mdpi
drawable-ldpi
drawable-hdpi
El objetivo de estas otras carpetas es guardar las mismas imgenes pero con una resolucin mayor si la guardamos en
drawable-hdpi y con una resolucin menor al guardarla en drawable-ldpi.
Esto se hace si queremos que nuestra aplicacin sea ms flexible si se ejecuta en un celular, en un tablet, en un
televisor etc.
En la carpeta res/drawable-mdpi/
(guardamos la imagen con el tamao original)
En la carpeta res/drawable-ldpi/
(guardamos la imagen con el tamao del 75% con respecto al de la carpeta drawable-mdpi)
En la carpeta res/drawable-hdpi/
(guardamos la imagen con el tamao del 150% con respecto al de la carpeta drawable-mdpi)
Retornar
Hemos visto en el concepto anterior que un programa puede tener ms de una ventana representando cada ventana con
una clase que hereda de Activity.
Una situacin muy comn es que la primer ventana necesite enviar datos a la segunda para que a partir de estos
proceda a efectuar una accin.
Problema:
Confeccionar un programa que solicite el ingrese de una direccin de un sitio web y seguidamente abrir una segunda
ventana que muestre dicha pgina.
Para resolver este problema utilizaremos el control visual WebView que nos permite mostrar el contenido de un sitio web.
1 - Nuestro primer Activity tendr la siguiente interfaz visual (ver controles y ID de los controles):
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.
package com.androidya.proyecto010;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
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:
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 com.androidya.proyecto010)
Al nombre de la clase la llamamos Actividad2 y debemos especificar que hereda de la clase android.app.Activity
Ahora tenemos que modificar el archivo Java generado agregando del mtodo onCreate con esto:
package com.androidya.proyecto010;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad2);
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"));
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":
Retornar
Veremos que la plataforma de Android nos da varias facilidades para el almacenamiento permanente de datos (es decir
que los mismos no se borran cuando se apaga la aplicacin)
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.
La interfaz visual a implementar y los Id de los controles visuales son los siguientes:
Es decir:
package com.javaya.proyecto011;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1=(EditText)findViewById(R.id.et1);
SharedPreferences prefe=getSharedPreferences("datos",Context.MODE_PRIVATE);
et1.setText(prefe.getString("mail",""));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
et1=(EditText)findViewById(R.id.et1);
Obtenemos una referencia de un objeto de la clase SharedPreferences a travs del mtodo getSharedPreferences. El
primer parmetro es el nombre del archivo de preferencias y el segundo la forma de creacin del archivo
(MODE_PRIVATE indica que solo esta aplicacin puede consultar el archivo XML que se crea)
SharedPreferences prefe=getSharedPreferences("datos",Context.MODE_PRIVATE);
Para extraer los datos del archivo de preferencias debemos indicar el nombre a extraer y un valor de retorno si dicho
nombre no existe en el archivo de preferencias (en nuestro ejemplo la primera vez que se ejecute nuestro programa
como es lgico no existe el archivo de preferencias lo que hace que Android lo cree, si tratamos de extraer el valor de
mail retornar el segundo parmetro es decir el String con una cadena vaca:
et1.setText(prefe.getString("mail",""));
Cuando se presiona el botn "Confirmar" lo que hacemos es grabar en el archivo de preferencias el contenido del
EditText en una variable llamada "mail":
Debemos crear un objeto de la clase Editor y obtener la referencia del objeto de la clase SharedPreferences que
acabamos de crear. Mediante el mtodo putString almacenamos en mail el valor del String cargado en el EditText. Luego
debemos llamar al mtodo commit de la clase editor para que el dato quede almacenado en forma permanente en el
archivo de preferencias. Esto hace que cuando volvamos a arrancar la aplicacin se recupere el ltimo mail ingresado.
Recordemos que el mtodo finish de la clase Activity finaliza la actividad actual (como tenemos una aplicacin con una
sola actividad finalizar completamente nuestro programa.
Comentarios extras.
Cuando guardamos datos en el archivo de preferencias podemos almacenar distintos tipos de datos segn el mtodo
que llamemos en el momento de grabar:
editor.putInt("edad",3);
editor.putBoolean("activo", true);
editor.putFloat("altura", 2.3f);
Cuando los recuperamos debemos indicar tambin que tipo de datos extraemos:
Problema propuesto
1. Realizar un programa que genere un nmero aleatorio entre 1 y 50, pedir que el operador lo adivine, informar si gan
o si el nmero es mayor o menor al ingresado. Cuando el operador lo adivine incrementar en uno el puntaje de
juego. Cada vez que se ingrese a la aplicacin mostrar el puntaje actual, es decir recordar el puntaje en un archivo
de preferencias.
Retornar
Otra posibilidad de almacenar datos en nuestro dispositivo Android es el empleo de un archivo de texto que se guardar
en el almacenamiento interno del equipo (la otro posibilidad es almacenarlo en una tarjeta SD Card)
Problema:
Confeccionar un programa que permita almacenar notas en un control EditText y cuando se presione un botn
almacenar los datos del EditText en un archivo de texto llamado "notas.txt".
Cada vez que se ingrese al programa verificar si existe el archivo de textos "notas.txt" proceder a su lectura y
almacenamiento de datos en el EditText.
Crear un proyecto en Eclipse de tipo "Android Project" y definir como nombre: proyecto013 y localizarlo en el paquete
com.androidya.proyecto013.
package com.javaya.proyecto013;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (existe(archivos, "notas.txt"))
try {
InputStreamReader archivo = new InputStreamReader(
openFileInput("notas.txt"));
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();
et1.setText(todo);
} catch (IOException e) {
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
archivo.flush();
archivo.close();
} catch (IOException e) {
}
Toast t = Toast.makeText(this, "Los datos fueron grabados",
Toast.LENGTH_SHORT);
t.show();
finish();
}
}
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):
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.
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:
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:
Creamos un objeto de la clase BufferedReader y le pasamos al constructor la referencia del objeto de la clase
InputStreamReader:
String linea=br.readLine();
String todo="";
while (linea!=null)
{
todo=todo+linea+"\n";
linea=br.readLine();
}
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:
Retornar
En el concepto anterior vimos como crear y leer un archivo de texto en la memoria interna del equipo Android. En
algunas situaciones podra ser til almacenar los datos en una tarjeta SD, esto debido a su mayor capacidad o la
facilidad de compartir los archivos con otras personas entregando la tarjeta SD.
Problema:
Confeccionar un programa que permita ingresar el nombre de un archivo y el contenido. Permitir grabar los datos
ingresados al presionar un botn. Disponer un segundo botn que permita recuperar los datos del archivo de texto.
El primer paso es modificar el archivo AndroidManifest.xml para permitir el acceso a la tarjeta SD desde nuestra
aplicacin esto lo hacemos desde el editor visual del archivo AndroidManifest.xml:
Debemos presionar el botn "Add" seleccionar "Uses Permision" y luego en name seleccionar
"android.permission.WRITE_EXTERNAL_STORAGE".
package com.javaya.proyecto014;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
} 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.
Creamos un nuevo objeto de la clase File indicando el camino de la unidad SD y el nombre del archivo a crear:
Por ltimo similar al acceso de un archivo interno creamos un objeto de la clase OutputStreamWriter:
osw.write(contenido);
Cerramos el archivo:
osw.flush();
osw.close();
Toast.makeText(this,"Los datos fueron grabados correctamente",Toast.LENGTH_SHORT).show();
et1.setText("");
et2.setText("");
}
catch (IOException ioe)
{
}
}
Para la lectura del archivo nuevamente obtenemos la referencia de la tarjeta SD para obtener el path de la unidad de
almacenamiento, el resto del algoritmo es similar al visto con un archivo interno:
} catch (IOException e)
{
}
}
Retornar
Hemos visto hasta ahora dos modos de almacenar datos en forma permanente (archivos de texto y la clase
SharedPreferences), ahora veremos otra herramienta nativa de Android para almacenar datos en una base de datos
llamada SQLite.
SQLite es una base de datos Open Source, es muy popular en muchos dispositivos pequeos, como Android.
Las ventajas que presenta utilizar SQLite es que no requiere configuracin, no tiene un servidor de base de datos
ejecutndose en un proceso separado y es relativamente simple su empleo.
Problema:
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 - Carga de personas.
2 - Consulta por el dni (para saber donde vota)
3 - Borrado de personas
4 - 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.
El mtodo onCreate se le llama cuando la base de datos se crea por primera vez. Aqu es donde se define la estructura
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 com.javaya.proyecto015;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table votantes(dni integer primary key, nombre text, colegio t
}
@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 t
}
}
En el constructor solo llamamos al constructor de la clase padre pasando los datos que llegan en los parmetros:
En el mtodo onCreate procedemos a crear la tabla votantes con los cuatro campos respectivos y definiendo el campo
dni como primary key:
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:
Ahora veamos la otra clase que implementar las altas, bajas, modificaciones y consultas:
package com.javaya.proyecto015;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
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:
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.
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)
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:
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)
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();
}
Retornar
Normalmente uno cuando desarrolla aplicaciones en Android hace toda la programacin, depuracin y pruebas en un
dispositivo virtual en la pc.
Ahora vamos a ver los pasos para probar la aplicacin en un dispositivo Android real.
La primera forma que veremos de probar nuestra aplicacin es copiar el archivo con extensin APK a nuestro dispositivo.
1. Primero en el cono de configuracin de nuestro telfono o tablet android seleccionamos la opcin "Aplicaciones" -> y
marcamos la opcin "Origen desconocido (Permitir la instalacin de aplicaciones no pertenecientes al mercado)"
2. Desde nuestro equipo de escritorio enviamos un mail a nuestro celular adjuntando el archivo con extensin apk que
se encuentra en el directorio bin de nuestro proyecto (por ejemplo adjuntemos el archivo proyecto015.apk)
3. Abramos el mail desde nuestro celular y seleccionemos el archivo adjunto. Confirmamos que queremos instalarlo.
Retornar
Android organiza las componentes visuales (Button, EditText, TextView etc.) en pantalla mediante contenedores llamados
Layout.
Hasta ahora no nos a preocupada 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.
Creemos un proyecto llamado ProyectoLayout1, borremos el TextView que agrega por defecto el ADT.
Para cambiar nuestro layout por defecto que es el RelativeLayout que crea el ADT debemos presionar el botn derecho
del mouse en la ventana Outline donde dice RelativeLayout y seleccionar Change Layout (Debemos seleccionar en el
dilogo que lo queremos cambiar por un layout de tipo LinearLayout vertical):
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 con orientacin vertical y disponemos una serie de
botones luego podemos ver algo similar a:
En cambio si fijamos la propiedad Orientation con el valor Horizontal el resultado es la disposicin de las componentes
en forma horizontal:
Podemos disponer ms de una componente de tipo LinearLayout para implementar nuestra interfaz visual. Veamos los
objetos y propiedades a configurar si queremos la siguiente interfaz:
Para implementar este interfaz hemos agregado de la pestaa "Layouts" dos controles 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:
Seleccionamos el EditText del primer LinearLayout y fijamos Layout Height con el valor Match Parent (para que ocupe
todo el espacio del contenedor) y para la propiedad gravity asignamos el valor top
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 el LinearLayout superior definimos la propiedad Layout_weight con valor 0 y el segundo LinearLayout la misma
propiedad Layout_weight con valor 1. Los dos botones que ubicamos en el segundo LinearLayout aparecen en la parte
inferior derecha ya que inicializamos la propiedad Gravity del segundo LinearLayout con los valores:
Retornar
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
(muchas veces es ms fcil agregar los controles visuales en la ventana Outline para disponerlos dentro de cada
tableRow):
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:
Si la propiedad no aparece en la ventana "Properties" cuando seleccionamos el objeto debemos entrar al archivo XML y
agregar manualmente dicha propiedad:
Retornar
El layout RelativeLayout es el que dispone el ADT por defecto cuando creamos un proyecto en Android. Hay varias
posibilidades cuando empleamos el RelativeLayout. Primero podemos alinear un control con respecto al Layout que lo
contiene. Para probarlo 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)
Retornar
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:
Disponer un ImageView y un Button dentro de un layout FrameLayout. Cuando se inicia la aplicacin mostrar solo el
botn y al ser presionado ocultar el botn y hacer visible la imagen que muestra el ImageView.
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 com.androidya.proyecto016;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1 = (Button) findViewById(R.id.button1);
iv1 = (ImageView) findViewById(R.id.imageView1);
}
@Override
Retornar
El ScrollView junto con un LinearLayout nos permite disponer una cantidad de componentes visuales que superan la
cantidad de espacio del visor del celular o tablet. Luego el usuario puede desplazar con el dedo la interfaz creada.
Problema:
Disponer un control de tipo ScrollView (que se encuentra en la pestaa Composite). Como veremos automticamente se
crea una componente de tipo LinearLayout y fijemos la propiedad Orientation del LinearLayout con el valor vertical:
Luego dispongamos numerosos botones que superen la cantidad de espacio del dispositivo. Numerar los botones con
los nmeros del 1 en adelante (recordar que podemos ir arrastrando los botones a la ventana Outline):
Luego si ejecutamos el programa veremos que podemos desplazar (scroll) todo el contenido del visor con el dedo:
Otra posibilidad para la implementacin de una interfaz en Android es disponer un LinearLayout en la parte superior y un
ScrollView en la parte inferior:
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:
Retornar
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 cuatro carpetas llamadas:
drawable-ldpi
drawable-mdpi
drawable-hdpi
drawable-xhdpi
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-ldpi/
75% del tamao de las imgenes almacenadas en la carpeta drawable-mdpi
El cono debe ser de 36*36 pxeles.
res/drawable-mdpi/
El cono debe ser de 48*48 pxeles.
res/drawable-hdpi/
150% del tamao de las imgenes almacenadas en la carpeta drawable-mdpi
El cono debe ser de 72*72 pxeles.
res/drawable-xhdpi/
200% del tamao de las imgenes almacenadas en la carpeta drawable-mdpi
El cono debe ser de 96*96 pxeles.
Problema:
Crear una aplicacin, dibujar y almacenar tres archivos llamados icon.png. Tener en cuenta que el archivo que se
Retornar
Veremos los pasos para reproducir un archivo mp3 (otros formatos soportados por Android son: Ogg, Wav)
Problema:
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 (para crear la carpeta presionamos el botn derecho del mouse sobre la carpeta
res y seleccionamos new -> folder):
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":
Creamos una interfaz con dos botones e inicializamos las propiedades Text y On Click de cada botn:
package com.androidya.proyecto019;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
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);
mp.start();
Retornar
Problema:
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.
Primero creamos un proyecto y definimos los 5 botones y mtodos a ejecutar cuando se presionen los botones
respectivos:
Creamos la carpeta raw y almacenamos en la misma el archivo mp3 creado previamente. Refrescamos la carpeta raw
para actualizar el archivo mp3:
package com.androidya.proyecto020;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1 = (Button) findViewById(R.id.button5);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
mp = MediaPlayer.create(this, R.raw.numeros);
mp.start();
String op = b1.getText().toString();
if (op.equals("No reproducir en forma circular"))
mp.setLooping(false);
else
mp.setLooping(true);
}
Primero definimos tres atributos uno de la clase MediaPlayer para administrar el archivo mp3, un entero donde se
almacena la posicin actual de reproduccin en milisegundos (para poder continuarla en el futuro) y la referencia de un
objeto de la clase Button:
MediaPlayer mp;
Button b1;
int posicion=0;
El mtodo destruir verifica con un if si el objeto de la clase MediaPlayer est creado procede a liberar recursos del mismo
llamando al mtodo release:
El mtodo iniciar que se ejecuta al presionar el botn "Iniciar" primero llama al mtodo destruir (para el caso que el mp3
este en ejecucin actualmente) seguidamente creamos un objeto de la clase MediaPlayer llamando al mtodo create (en
este hacemos referencia al archivo que copiamos a la carpeta raw) Llamamos al mtodo start. Por ltimo extraemos el
texto del quinto botn y verificamos si la reproduccin debe ejecutarse en forma circular (en forma indefinida una y otra
vez):
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:
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:
El mtodo detener interrumpe la ejecucin del mp3 e inicializa el atributo posicion con cero:
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:
Retornar
El objetivo de este concepto es acceder a un archivo mp3 almacenado en la tarjeta SD de nuestro equipo.
Problema:
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:
package com.androidya.proyecto021;
import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.View;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
.getPath() + "/gato.mp3");
MediaPlayer mp = MediaPlayer.create(this, datos);
mp.start();
}
Creamos un objeto de la clase Uri llamando al mtodo parse donde indicamos el path y nombre del archivo a recuperar:
Creamos el objeto de la clase MediaPlayer pasando ahora la referencia del objeto de la clase Uri:
mp.start();
Recordar que para ejecutar este proyecto se debe subir un archivo mp3 llamado "gato.mp3" a la tarjeta SD.
Retornar
Ahora vamos a ver los pasos para reproducir un archivo almacenado en un servidor de internet.
Problema:
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:
package com.androidya.proyecto022;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
try {
mp.setDataSource("http://www.codigofuenteya.com.ar/recursos/gato.mp3");
mp.prepare();
mp.start();
} catch (IOException e) {
}
}
Para recuperar un archivo mp3 de internet procedemos de la siguiente manera, primero creamos un objeto de la clase
MediaPlayer:
Luego llamamos al mtodo setDataSource indicando la direccin de internet donde se almacena el archivo mp3:
mp.setDataSource("http://www.codigofuenteya.com.ar/recursos/gato.mp3");
mp.prepare();
mp.start();
Todo esto lo hacemos en un bloque try/catch para capturar excepciones de tipo IOException.
Esta primera aproximacin para ejecutar un mp3 localizado en internet bloquea la aplicacin hasta que se carga por
completo el archivo, es decir queda ejecutndose el mtodo mp.prepare() hasta que finaliza la recuperacin en forma
completa.
Problema:
Confeccionar otra aplicacin similar a la anterior pero que no se congele la interfaz de la aplicacin mientras se carga el
mp3. Mostrar un mensaje que el archivo se est cargando.
package com.androidya.proyecto023;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Para poder capturar el evento que el archivo se termin de recuperar debemos implementar la interface
OnPreparedListener:
Con esto decimos que nuestra clase implementar el mtodo onPrepared donde iniciamos la ejecucin del mp3:
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:
Retornar
Otra forma de ejecutar un archivo mp3 es mediante el reproductor interno de Android. Esta aplicacin reproduce todos
los formatos soportados por Android y tiene una interfaz que le ser familiar al usuario de nuestra aplicacin.
Problema:
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:
package com.androidya.proyecto024;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
startActivity(intent);
}
}
Creamos un objeto de la clase Intent y un objeto de la clase Uri referenciando al archivo mp3 almacenado en la tarjeta
SD. Indicamos mediante el mtodo setDataAndType el Uri y el tipo de archivo a reproducir. Activamos la aplicacin
mediante startActivity.
Retornar
La forma ms sencilla de capturar audio en Android es mediante el grabador que provee el sistema operativo Android.
Invocamos la aplicacin de grabacin (tiene como ventana que la interfaz le es familiar al usuario, ya que muchas
aplicaciones utilizan esta caracterstica) y luego recuperamos el audio grabado.
Problema:
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.
package com.javaya.proyecto025;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.View;
int peticion = 1;
Uri url1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Cuando se presiona el botn de grabar el audio mediante un Intent activamos la aplicacin de grabacin propia de
Android.
Seguidamente llamamos al mtodo startActivityForResult para poder recuperar la grabacin luego de finalizada a travs
del mtodo onActivityResult:
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:
Por ltimo para ejecutar el contenido de la grabacin utilizamos la clase ya vista MediaPlayer:
Retornar
Otra forma de grabar audio en Android es el empleo de la clase MediaRecorder. Esta clase nos da ms libertades a la
hora de construir una aplicacin que requiere grabar audio.
Problema:
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.
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.
Esto lo hacemos seleccionando el archivo AndroidManifest.xml y en la pestaa Permissions registramos los dos
permisos:
package com.androidya.proyecto026;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
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);
}
MediaRecorder recorder;
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:
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);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
} catch (IOException e) {
}
Con el mtodo setOutputFile de la clase MediaRecorder le indicamos el archivo donde debe almacenarse la grabacin:
recorder.setOutputFile(archivo.getAbsolutePath());
try {
recorder.prepare();
} catch (IOException e) {
}
recorder.start();
El mtodo detener:
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:
try {
player.setDataSource(archivo.getAbsolutePath());
} catch (IOException e) {
}
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:
Retornar
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 ADT.
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.
El ADT ya creo el archivo XML para el activity principal y se encuentra localizado en la carpeta res/menu y se llama
activity_main.xml
La intefaz del editor de menu que nos provee el plugin de Android para Eclipse es:
Procedemos a insertar la primera opcin presionando el botn "Add", seguidamente seleccionamos "Item":
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 mtodos onCreateOptionsMenu (que ya lo tenemos codificado en el archivo
Java) y onOptionsItemSelected heredados de la clase Activity.
package com.javaya.proyecto027;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:
Toast.makeText(this, "Programador: Diego (23/08/2011)",
Toast.LENGTH_SHORT).show();
break;
case R.id.item2:
finish();
}
return true;
}
En el mtodo onCreateOptionsMenu creamos un objeto de la clase MenuInflater y mediante el mtodo inflate vinculamos
el identificador del archivo de recursos: R.menu.activity_main y el objeto de la clase menu que llega como parmetro.
Debemos retornar true:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
En el mtodo onOptionsItemSelected debemos disponer un switch para identificar cual de las opciones del men fue
seleccionado. El parmetro item de la clase MenuItem tiene la referencia del objeto que fue pulsado. Luego obtenemos
su Id llamando al mtodo getItemId y a travs del switch verificamos con el recurso que coincide y procedemos a efectuar
la actividad respectiva (si se selecciona la primer opcin mostramos un mensaje mediante la clase Toast, si se seleccion
la segunda opcin llamamos al mtodo finish para finalizar el programa:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:
Toast.makeText(this, "Programador: Diego (23/08/2011)",
Toast.LENGTH_SHORT).show();
break;
case R.id.item2:
finish();
}
return true;
}
Retornar
Ahora veremos que podemos desplegar un submen cuando se selecciona una opcin del men principal.
Problema:
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.
Modificaremos el archivo activity_main.xml de la carpeta res/menu. Podemos eliminar el item que crea por defecto el ADT
(menu_settings(Item)
Primero insertamos un item que mostrar el mensaje "Sitios interesantes..." para esto presionamos el botn "Add" y
seleccionamos "Item" en Title disponemos "Sitios interesantes..."
Luego aadimos varios Menu Item al Sub-Menu (uno por cada sitio web a enlazar):
package com.androidya.proyecto028;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent i;
switch (item.getItemId()) {
case R.id.item2:
i = new Intent("android.intent.action.VIEW",
Uri.parse("http://www.google.com"));
startActivity(i);
break;
case R.id.item3:
i = new Intent("android.intent.action.VIEW",
Uri.parse("http://www.yahoo.com"));
startActivity(i);
break;
case R.id.item4:
i = new Intent("android.intent.action.VIEW",
Uri.parse("http://www.bing.com"));
startActivity(i);
break;
case R.id.item5:
finish();
}
return true;
}
Retornar
Problema:
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:
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)
package com.androidya.proyecto029;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent i;
switch (item.getItemId()) {
case R.id.item1:
i = new Intent("android.intent.action.VIEW",
Uri.parse("http://www.youtube.com"));
startActivity(i);
break;
case R.id.item2:
i = new Intent("android.intent.action.VIEW",
Uri.parse("http://www.facebook.com"));
startActivity(i);
}
return true;
}
}
Luego cuando lo ejecutamos podemos observar el cono que se muestra en cada MenuItem:
Retornar
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 menu
Ahora veamos como asociar el archivo XML donde definimos el men con el cdigo Java:
package androidya.proyecto030;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
et1=(EditText)findViewById(R.id.editText1);
registerForContextMenu(et1);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuIn
{
menu.setHeaderTitle("Elija el color de fondo:");
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu1, menu);
}
@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);
}
Para la captura de eventos de los MenuItem debemos implementar el mtodo onContextItemSelected donde mediante un
switch verificamos cual de los MenuItem fue seleccionado y cambiamos el color de fondo del control EditText:
@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;
}
Retornar
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.
package androidya.proyecto021;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
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:
Una vez creado el objeto procedemos a llamar al mtodo que define el ttulo a mostrar en el dilogo:
builder.setTitle("Importante");
builder.setPositiveButton("OK",null);
builder.create();
builder.show();
Retornar
Problema:
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.
package androidya.proyecto032;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;
dialogo1.setTitle("Importante");
Evitamos que el dilogo sea salteado por cualquier medio distinto a presionar alguno de los dos botones:
dialogo1.setCancelable(false);
Llamamos al mtodo setPositiveButton indicando el texto a mostrar en el botn y la clase annima que capturar el
evento clic del botn:
Mostramos el dilogo:
dialogo1.show();
Definimos los mtodos del Activity que se llamaran desde las clases annimas:
Retornar
La clase Toast nos permite mostrar un mensaje superpuesto a la ventana por un perodo de tiempo pero sin congelar la
aplicacin. Este mensaje no permite interactuar con el usuario (no se pueden ingresar datos, seleccionar botones ni
obligar a que se cierre)
Problema:
Confeccionar una aplicacin que muestre una serie de botones y active mensajes de notificaciones con la clase Toast.
No olvidemos inicializar la propiedad On Click de cada botn con los mtodos: prueba1, prueba2 y prueba3.
package androidya.proyecto033;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;
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.
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):
Mediante la clase LayoutInflate procedemos a leer el contenido del archivo XML creado anteriormente y lo enlazamos con
el toast mediante el mtodo:
toast.setView(layout);
Retornar
Problema:
Para poder hacer esta simple tarea debemos seguir una serie de pasos:
Borramos el TextView que agrega automticamente el plug-in de Eclipse y a definir un id para el RelativeLayout (le
asignamos como Id el valor @+Id/layout1) y grabamos las modificaciones:
Ahora codificamos la clase donde se encuentra toda la lgica para encender el pxel:
package com.androidya.proyecto034;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.RelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Debemos crear una clase que herede de la clase View (todos los controles visuales en Android heredan de esta clase) y
sobreescribir el mtodo onDraw. El mtodo onDraw se ejecuta cuando tiene que graficarse. Para acceder a las primitivas
grficas hay una clase llamada Canvas que encapsula todo lo relacionado a pintar pxeles, lneas, rectngules etc.:
Lo primero que hacemos en el mtodo onDraw es obtener el ancho y alto en pxeles del dispositivo mediante los mtodos
getWidth() y getHeight() que nos provee la clase Canvas. Seguidamente creamos un objeto de la clase Paint. Llamamos
al mtodo setARGB para definir el color del pincel (el primer parmetro indica el valor de transparencia con 255
indicamos que no hay transparencia, luego indicamos la cantidad de rojo, verde y azul.
Por ltimo debemos llamar al mtodo drawPoint que dibuja el pxel en la columna, fila y pincel que le pasamos como
parmetros.
Como podemos observar la clase Lienzo hereda de View e implementa el constructor donde llegar la referencia del
Activity donde se inserta:
Por ltimo en el mtodo onCreate del Activity obtenemos la referencia del RelativeLayout que tiene el Activity. Creamos
un objeto de la clase Lienzo (llamado fondo) y agregamos el objeto fondo al RelativeLayout llamando al mtodo addView:
Retornar
Problema:
Pintar el fondo de color amarillo y dibujar una serie de lneas con distintos estilos.
Borramos el TextView que agrega automticamente el plug-in de Eclipse y difinimos el id del RelativeLayout con el valor:
@+id/layout1:
Ahora codificamos la clase donde se encuentra toda la lgica para pintar el fondo y dibujar las lneas:
package com.androidya.proyecto035;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.RelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Veamos el mtodo onDraw donde pintamos el fondo de la componente llamando al mtodo drawRGB donde indicamos
la cantidad de rojo, verde a azul:
Creamos un objeto de la clase paint y definimos el color rojo (recordemos que el primer parmetro indica el valor de la
transparencia, si vale 255 es totalmente opaco, con un valor menor el trazo de la lnea tendr transparencia.
El mtodo para graficar una lnea se llama drawLine y tiene como parmetros la columna y fila del punto inicial y el tercer
y cuarto parmetro indica la columna y fila del punto final de la lnea (en este ejemplo se dibujar una lnea horizontal en
la fila 30 y tendr un ancho que coincide con el ancho del dispositivo), el ltimo parmetro es el objeto de la clase Paint
que indica el color de la lnea:
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);
Problema propuesto
1. Confeccionar una aplicacin que muestre una hoja en la pantalla similar a esta:
Retornar
Problema:
Pintar el fondo de color blanco y dibujar una serie de rectngulos con distintos estilos.
Borramos el TextView que agrega automticamente el plug-in de Eclipse y difinimos el id del RelativeLayout con el valor:
@+id/layout1:
package com.androidya.proyecto037;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.RelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
pincel1.setARGB(255,255,0,0);
canvas.drawRect(10,10,ancho-10,40,pincel1);
pincel1.setStyle(Style.STROKE);
canvas.drawRect(10,60,ancho-10,90,pincel1);
pincel1.setStrokeWidth(3);
canvas.drawRect(10,110,ancho-10,140,pincel1);
}
}
canvas.drawRGB(255,255,255);
int ancho=canvas.getWidth();
pincel1.setARGB(255,255,0,0);
Dibujamos un rectngulo desde la coordenada columna:10 y fila 10 hasta la columna que coincide con el ancho de la
pantalla menos 10 pxeles y la fila 40. Adems le pasamos el pincel a utilizar:
canvas.drawRect(10,10,ancho-10,40,pincel1);
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);
Retornar
Problema:
Pintar el fondo de color blanco y dibujar 10 crculos crecientes desde el medio de la pantalla.
Borramos el TextView que agrega automticamente el plug-in de Eclipse y difinimos el id del RelativeLayout con el valor:
@+id/layout1:
package com.androidya.proyecto038;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.RelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Creamos un objeto de la clase Paint, fijamos el color rojo y mediante setStyle indicamos que solo se debe pintar el
permetro:
Disponemos un for para dibujar los 10 crculos concntricos (indicamos en los dos primeros parmetros el punto central
del crculo y en el tercer parmetro el radio del crculo:
for(int f=0;f<10;f++) {
Retornar
Problema:
Borramos el TextView que agrega automticamente el plug-in de Eclipse y difinimos el id del RelativeLayout con el valor:
@+id/layout1:
package com.androidya.proyecto039;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
int menor;
if (ancho < alto)
menor = ancho;
else
menor = alto;
pincel1.setStyle(Style.FILL);
pincel1.setARGB(255, 255, 255, 0);
canvas.drawCircle(ancho / 2, alto / 2, menor / 2, pincel1);
}
}
Para ocultar la barra del ttulo y la barra superior debemos hacer lo siguiente en el mtodo onCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Seguidamente creamos el objeto de la clase Paint y configuramos el color, grosor de lnea y estilo:
Creamos un objeto de la clase RectT pasando como dato la coordenada superior izquierda del valo y la coordenada
inferior derecha del mismo (teniendo en cuenta que el valo se dibujar en ese rectngulo imaginario que indicamos con
dichas coordenadas):
int menor;
if (ancho<alto)
menor=ancho;
else
menor=alto;
pincel1.setStyle(Style.FILL);
pincel1.setARGB(255, 255, 255, 0);
canvas.drawCircle(ancho/2, alto/2, menor/2, pincel1);
}
Retornar
Borramos el TextView que agrega automticamente el plug-in de Eclipse y difinimos el id del RelativeLayout con el valor:
@+id/layout1:
package com.androidya.proyecto040;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Para graficar texto disponemos del mtodo drawText que nos permite imprimir un String en una determinada columna,
fila con un determinado pincel que podemos definir su color:
El tamao de la letra:
pincel1.setTextSize(30);
El estilo de la letra:
pincel1.setTypeface(Typeface.SERIF);
Retornar
Podemos confeccionar aplicaciones e incorporar fuentes True Type externas. Para ello implementaremos una aplicacin
que muestre un texto con una fuente externa.
Borramos el TextView que agrega automticamente el plug-in de Eclipse y difinimos el id del RelativeLayout con el valor:
@+id/layout1:
Procedemos ahora a descargar una fuente del sitio Creamundo y copiamos el archivo de la fuente a la carpeta assets
como se muestra:
package com.androidya.proyecto041;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
En el mtodo onDraw procedemos a crear una fuente llamando al mtodo createFromAsset e indicando el nombre del
archivo que descargamos de internet (disponga en el segundo parmetro el nombre del archivo que eligi y descarg de
internet):
Retornar
Si queremos disponer texto no no est horizontal debemos crear un camino indicando los puntos donde pasar el texto.
Borramos el TextView que agrega automticamente el plug-in de Eclipse y difinimos el id del RelativeLayout con el valor:
@+id/layout1:
package com.androidya.proyecto042;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Creamos un objeto de la clase Path e indicamos el primer punto del camino llamando al mtodo moveTo:
Luego indicamos todos los otros puntos en forma consecutiva llamando al mtodo lineTo:
camino.lineTo(40, alto/2-30);
camino.lineTo(80, alto/2-60);
camino.lineTo(120, alto/2-90);
camino.lineTo(160, alto/2-120);
camino.lineTo(220, alto/2-150);
camino.lineTo(280, alto/2-180);
camino.lineTo(340, alto/2-210);
Luego para graficar el texto llamamos al mtodo drawTextOnPath y le pasamos en el segundo parmetro la referencia
del objeto de tipo Path:
proyecto042.zip
Retornar
Para mostrar un archivo jpg, png etc. disponemos en la clase Canvas de un mtodo llamado drawBitmap.
Problema:
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.
Borramos el TextView que agrega automticamente el plug-in de Eclipse y difinimos el id del RelativeLayout con el valor:
@+id/layout1:
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):
package com.androidya.proyecto043;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Para recuperar la imagen del archivo de la carpeta res/drawable-hdpi debemos utilizar el mtodo decodeResource:
Una vez que tenemos creado el objeto de la clase Bitmap procedemos a posicionar la imagen en forma centrada en la
pantalla del dispositivo:
Retornar
Una actividad fundamental es poder detectar cuando el usuario selecciona o toca la pantalla tctil.
Problema:
Desarrollar un programa que dibuje un crculo en la coordenada 100,100. Cuando se presione otra parte de la pantalla
tctil proceder a trasladar el crculo a dicha coordenada.
Borramos el TextView que agrega automticamente el plug-in de Eclipse y difinimos el id del RelativeLayout con el valor:
@+id/layout1:
Ahora codificamos la clase donde se encuentra toda la lgica para capturar el evento onTouch:
package com.androidya.proyecto044;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.RelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
corx = 100;
cory = 100;
RelativeLayout layout1 = (RelativeLayout) findViewById(R.id.layout1);
fondo = new Lienzo(this);
fondo.setOnTouchListener(this);
layout1.addView(fondo);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
La clase que captura el evento onTouch debe implementar la interface OnTouchListener (con esto indicamos que la clase
debe implementar el mtodo onTouch:
Definimos como atributos la coordenada donde se debe dibujar el crculo y la referencia al objeto de la clase Lienzo:
En el mtodo onCreate del Activity inicializamos los tres atributos de la clase y mediante el mtodo setOnTouchListener
indicamos que la propia clase capturar el evento onTouch del objeto fondo:
corx=100;
cory=100;
fondo=new Lienzo(this);
fondo.setOnTouchListener(this);
linearLayout.addView(fondo);
El mtodo onTouch es el que implementamos de la clase OnTouchListener. En este mtodo mediante el objeto event
obtenemos la coordenada x e y donde el usuario seleccion con el dedo y procedemos a llamar al mtodo invalidate para
que vuelva a pintarse el control fondo (el mtodo invalidate borra el contendio del objeto de la clase Lienzo y vuelve a
ejecutarse el mtodo onDraw):
El mtodo onDraw pinta el fondo de amarillo, crea un objeto de la clase Paint y procede a dibujar un crculo en las
coordenadas indicadas por los atributos corx y cory:
Retornar
Problema:
Borramos el TextView que agrega automticamente el plug-in de Eclipse y disponemos un Button y un LinearLayout:
package com.androidya.buscaminas;
Y la clase:
package com.androidya.buscaminas;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.Toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
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;
}
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;
}
}
}
cant++;
if (cant == 56)
return true;
else
return false;
}
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;
}
casillas[fil][col].contenido = 50;
recorrer(fil, col + 1);
recorrer(fil, col - 1);
recorrer(fil + 1, col);
recorrer(fil - 1, col);
recorrer(fil - 1, col - 1);
recorrer(fil - 1, col + 1);
recorrer(fil + 1, col + 1);
recorrer(fil + 1, col - 1);
} else if (casillas[fil][col].contenido >= 1
&& casillas[fil][col].contenido <= 8) {
casillas[fil][col].destapado = true;
}
}
}
Retornar
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.
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 tres string llamados app_name, hello_world y menu_settings:
Lo que se encuentra entre las marcas string es lo que se visualizar, por ejemplo en la constante hello_world se
almacena el valor "Hello world!". 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 botn para operar lo llamamos
"botonoperacion" con el valor "Operar". Si seleccionamos la pestaa strings.xml luego podemos ver las tres constantes
Ahora debemos asociar estas constantes a los controles visuales. Seleccionamos el archivo activity_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:
package com.androidya.proyecto045;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_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);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
Retornar
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:
Seleccionamos el archivo strings.xml de la carpeta values presionamos el botn derecho y elegimos copiar, ahora nos
vamos a la otra carpeta (values-en) y elegimos copiar. 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:
Retornar
Hemos visto si queremos tener traducida nuestra aplicacin a varios idiomas debemos utilizar el concepto de
internacionalizacin. Pero hay muchos casos donde queremos hilar ms fino. Por ejemplo el ingles de Estados Unidos
no es exactamente igual que el ingles de Inglaterra o de Autralia. Para estas situaciones podemos crear varios archivos
strings.xml para distintas localidades que tienen el mismo idioma.
Problema:
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.
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:
Retornar