Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Android Manual PDF
Android Manual PDF
Temas
1 - Instalacin de Android
5 - Control CheckBox
6 - Control Spinner
7 - Control ListView
8 - Control ImageButton
11
Almacenamiento
de
datos
mediante
la
clase
SharedPreferences
1 - Instalacin de Android
deseamos
ir
Device
Manager.
En este dilogo debemos crear el emulador de Android
(presionamos
el
botn
New...):
10
11
12
13
14
15
16
17
18
19
20
21
la
interfaz
final
debe
ser
semejante
esta:
22
23
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@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_ma
in, 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.
24
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
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.widget.EditText;
android.widget.TextView;
25
getMenuInflater().inflate(R.menu.activity_ma
in, menu);
return true;
}
}
La forma ms fcil de importar las clases EditText y TextView es
tipear las dos lneas:
private EditText et1,et2;
private TextView tv3;
y luego presionar las teclas Control-Shift-O
Esto hace que se escriban automticamente los dos import:
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):
private EditText et1,et2;
private TextView tv3;
No definimos TextView para los dos mensajes "Ingrese el primer
valor" e "Ingrese el segundo valor" ya que no necesitaremos
interactuar con ellos. Tambin veremos que el objeto de la clase
Button no es necesario definir un atributo sino que desde el
archivo XML inicializaremos la propiedad OnClick.
En el mtodo onCreate debemos enlazar estas variables con los
objetos definidos en el archivo XML, esto se hace llamando al
mtodo findViewById:
public
void
savedInstanceState) {
onCreate(Bundle
26
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et1=(EditText)findViewById(R.id.et1);
et2=(EditText)findViewById(R.id.et2);
tv3=(TextView)findViewById(R.id.tv3);
}
Al mtodo findViewById debemos pasar la constante creada en la
clase R (recordemos que se crea automticamente esta clase) el
nombre de la constante si debe ser igual con el nombre de la
propiedad del objeto creado en el archivo XML. Como la clase
findViewById retorna una clase de tipo View luego debemos
utilizar el operador cast (es decir le antecedemos entre parntesis
el nombre de la clase)
Ya tenemos almacenados en las variables las referencias a los tres
objetos
que
se
crean
al
llamar
al
mtodo:setContentView(R.layout.main); .
Ahora planteamos el mtodo que se ejecutar cuando se presione
el botn (el mtodo debe recibir como parmetro un objeto de la
clase View) En nuestro ejemplo lo llam sumar:
package com.javaya.proyecto002;
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.view.View;
android.widget.EditText;
android.widget.TextView;
27
se
}
}
Debemos importar lar clase View (Control-Shift-O)
28
29
int suma=nro1+nro2;
String resu=String.valueOf(suma);
tv3.setText(resu);
}
Extraemos el texto de los dos controles de tipo EditText y los
almacenamos en dos variables locales de tipo String. Convertimos
los String a tipo entero, los sumamos y el resultado lo enviamos al
TextView donde se muestra la suma (previo a convertir la suma a
String)
La clase completa queda entonces como:
package com.javaya.proyecto002;
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.view.View;
android.widget.EditText;
android.widget.TextView;
30
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_ma
in, menu);
return true;
}
//Este mtodo se ejecutar cuando se
presione el botn
public void sumar(View view) {
String
valor1=et1.getText().toString();
String
valor2=et2.getText().toString();
int nro1=Integer.parseInt(valor1);
int nro2=Integer.parseInt(valor2);
int suma=nro1+nro2;
String resu=String.valueOf(suma);
tv3.setText(resu);
}
}
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:
31
32
33
34
35
text : operar
Y el tercer TextView con los valores:
id : tv3
text : resultado
Podemos controlar en la ventana "Outline" el id definido para
cada control (tv1, et1, tv2, et2, radioGroup1, r1, r2, button1, tv3)
Tambin podemos observar de que clase es cada control visual y
el texto de la propiedad text para aquellos controles que tienen
sentido su inicializacin.
36
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.view.View;
android.widget.EditText;
android.widget.RadioButton;
android.widget.TextView;
37
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_ma
in, menu);
return true;
}
//Este mtodo se ejecutar cuando se
presione el botn
public void operar(View view) {
String
valor1=et1.getText().toString();
String
valor2=et2.getText().toString();
int nro1=Integer.parseInt(valor1);
int nro2=Integer.parseInt(valor2);
if (r1.isChecked()==true) {
int suma=nro1+nro2;
String
resu=String.valueOf(suma);
tv3.setText(resu);
} else
if (r2.isChecked()==true) {
int resta=nro1-nro2;
String
resu=String.valueOf(resta);
tv3.setText(resu);
}
CopyRight 2013 - emmmnmmma - All rights reserved
38
}
}
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:
public void operar(View view) {
String
valor1=et1.getText().toString();
String
valor2=et2.getText().toString();
int nro1=Integer.parseInt(valor1);
int nro2=Integer.parseInt(valor2);
if (r1.isChecked()==true) {
int suma=nro1+nro2;
String
resu=String.valueOf(suma);
CopyRight 2013 - emmmnmmma - All rights reserved
39
tv3.setText(resu);
} else
if (r2.isChecked()==true) {
int resta=nro1-nro2;
String
resu=String.valueOf(resta);
tv3.setText(resu);
}
}
40
5 - Control CheckBox
El objetivo de este concepto es practicar lo visto hasta ahora e
incorporar el control visual CheckBox
Problema:
Realizar la carga de dos nmeros en controles de tipo EditText.
Mostrar un mensaje que solicite la carga de los valores. Disponer
dos controles de tipo CheckBox para seleccionar si queremos
sumar y/o restar dichos valores. Finalmente mediante un control
de tipo Button efectuamos la operacin respectiva. Mostramos el
o los resultados en un TextView. Lo nuevo en este problema es la
insercin de dos objetos de la clase CheckBox que se encuentra
en la pestaa "Form Widgets":
41
42
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.view.View;
android.widget.CheckBox;
android.widget.EditText;
android.widget.TextView;
43
44
45
46
6 - Control Spinner
El objetivo de este concepto es practicar lo visto hasta ahora e
incorporar el control visual Spinner
El control Spinner muestra una lista de String y nos permite
seleccionar uno de ellos. Cuando se lo selecciona se abre y
muestra todos sus elementos para permitir seleccionar uno de
ellos.
Problema:
Realizar la carga de dos nmeros en controles de tipo EditText.
Mostrar un mensaje que solicite la carga de los valores. Disponer
un control de tipo Spinner que permita seleccionar si queremos
sumar, restar, multiplicar o dividir dichos valores. Finalmente
mediante un control de tipo Button efectuamos la operacin
respectiva. Mostramos el resultado en un TextView.
Lo nuevo en este problema es la insercin de un control de tipo
Spinner que se encuentra en la pestaa "Form Widgets":
47
48
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.view.View;
android.widget.ArrayAdapter;
android.widget.EditText;
android.widget.Spinner;
android.widget.TextView;
49
50
51
tv3.setText(resu);
}
}
}
Definimos un objeto de la clase Spinner:
private Spinner spinner1;
En el mtodo onCreate obtenemos la referencia al control visual
declarado en el archivo XML:
spinner1=(Spinner)findViewById(R.id.spinner1
);
Definimos un vector con la lista de String que mostrar el
Spinner:
String
[]opciones={"sumar","restar","multiplicar","
dividir"};
Definimos y creamos un objeto de la clase ArrayAdapter:
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(this,android.R.layout.s
imple_spinner_item, opciones);
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_ite
m
El tercer parmetro es la referencia del vector que se mostrar:
52
53
if
(selec.equals("dividir")) {
int divi=nro1/nro2;
String
resu=String.valueOf(divi);
tv3.setText(resu);
}
54
7 - Control ListView
55
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.OnItemClickListen
er;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private
String[]
paises
=
{
"Argentina", "Chile", "Paraguay", "Bolivia",
CopyRight 2013 - emmmnmmma - All rights reserved
56
onCreate(Bundle
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.layout.s
imple_list_item_1, paises);
lv1.setAdapter(adapter);
lv1.setOnItemClickListener(new
OnItemClickListener() {
@Override
public
void
onItemClick(AdapterView<?> parent, View v,
int posicion, long id) {
tv1.setText("Poblacin de "+
lv1.getItemAtPosition(posicion) + " es "+
habitantes[posicion]);
}
});
}
CopyRight 2013 - emmmnmmma - All rights reserved
57
@Override
public boolean onCreateOptionsMenu(Menu
menu) {
// Inflate the menu; this adds
items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activi
ty_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:
private
String[]
paises={"Argentina","Chile","Paraguay","Boli
via","Peru",
"Ecuador","Brasil","Colombia","Venezuela","U
ruguay"};
private
String[]
habitantes={"40000000","17000000","6500000",
"10000000","30000000",
"14000000","183000000","44000000","29000000"
,"3500000"};
Definimos un objeto de tipo TextView y otro de tipo ListView
donde almacenaremos las referencias a los objetos que definimos
en el archivo XML:
private TextView tv1;
private ListView lv1;
En el mtodo onCreate obtenemos la referencia a los dos objetos:
CopyRight 2013 - emmmnmmma - All rights reserved
58
tv1=(TextView)findViewById(R.id.tv1);
lv1
=(ListView)findViewById(R.id.listView1);
Creamos un objeto de la clase ArrayAdapter de forma similar a
como lo hicimos cuando vimos la clase Spinner:
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(this,android.R.layout.s
imple_list_item_1, paises);
lv1.setAdapter(adapter);
Llamamos al mtodo setOnItemClicListener de la clase ListView
y le pasamos como parmetro una clase annima que implementa
la interfaz OnItemClickListener (dicha interfaz define el mtodo
onItemClick que se dispara cuando seleccionamos un elemento
del ListView):
lv1.setOnItemClickListener(new
OnItemClickListener() {
@Override
public
void
onItemClick(AdapterView<?> parent, View v,
int posicion, long id) {
tv1.setText("Poblacin de "+
lv1.getItemAtPosition(posicion) + " es "+
habitantes[posicion]);
}
});
Dentro del mtodo onItemClick modificamos el contenido del
TextView con el nombre del pas y la cantidad de habitantes de
dicho pas. Este mtodo recibe en el tercer parmetro la posicin
del item seleccionado del ListView.
Cuando ejecutamos el proyecto podemos ver una interfaz en el
emulador similar a esta:
CopyRight 2013 - emmmnmmma - All rights reserved
59
60
8 - Control ImageButton
Hemos visto la creacin de objetos de la clase Button, ahora
veremos otra clase muy similar a la anterior llamada ImageButton
que tiene la misma filosofa de manejo con la diferencia que
puede mostrar una imagen en su superficie.
Problema:
Disponer un objeto de la clase ImageButton que muestre una
imagen de un telfono. Cuando se presione mostrar en un control
TextView el mensaje "Llamando".
Primero crearemos un proyecto llamado proyecto007 y luego
debemos buscar una imagen en formato png que represente un
telefono
de
50*50
pxeles.
Nombre
del
archivo:
telefono.png
Ahora copiamos el archivo a la carpeta de recursos de nuestro
proyecto
:
res\drawable-mdpi
Desde el Eclipse en la ventana "Package Explorer" navegamos
hasta la carpeta res y entramos al directorio drawable-mdpi y
vemos que todava no est el archivo que acabamos de copiar.
Para que se actualice el proyecto presionamos el botn derecho
del mouse sobre esta carpeta y seleccionamos la opcin
"Refresh":
61
62
63
Cdigo fuente:
package com.javaya.proyecto007;
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.view.View;
android.widget.TextView;
64
se
}
Definimos el atributo de tipo TextView:
TextView tv1;
Enlazamos el control definido en el archivo XML y la variable de
java:
CopyRight 2013 - emmmnmmma - All rights reserved
65
tv1=(TextView)findViewById(R.id.tv1);
Implementamos el mtodo que se ejecutar cuando se presione el
el objeto de la clase ImageButton:
public void llamar(View view) {
tv1.setText("Llamando");
}
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")
Comentarios extras de este control.
Cuando copiamos el archivo lo hicimos a la carpeta:
drawable-mdpi
Pero vimos que hay otras carpetas con nombres similares:
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.
Debemos tener en cuenta estos tamaos:
En la carpeta res/drawable-mdpi/
(guardamos la imagen con el tamao original)
En la carpeta res/drawable-ldpi/
CopyRight 2013 - emmmnmmma - All rights reserved
66
67
68
69
File
Aqu tenemos que definir el nombre del archivo XML (debe estar
en minsculas), lo llamaremos acercade:
70
71
72
73
74
protected
void
onCreate(Bundle
savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
}
Ahora solo falta llamar al mtodo setContentView para enlazar el
archivo XML:
package com.javaya.proyecto008;
import android.app.Activity;
import android.os.Bundle;
public class AcercaDe extends Activity {
@Override
protected
void
onCreate(Bundle
savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.acercade);
}
}
Como podemos ver la clase AcercaDe hereda de la clase Activity
e implementa el mtodo onCreate para enlazar el archivo XML
que creamos anteriormente.
4 - Otro paso fundamental es registrar el Activity en el archivo
"AndroidManifest.xml" que se encuentra en la raiz principal del
proyecto.
75
76
package com.javaya.proyecto008;
import
import
import
import
import
android.app.Activity;
android.content.Intent;
android.os.Bundle;
android.view.Menu;
android.view.View;
77
78
public
void
onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.acercade);
}
public void cerrar(View view) {
finish();
}
}
Cuando se presiona el botn finalizar llamando al mtodo finish()
que tiene por objetivo liberar el espacio de memoria de esta
actividad y pedir que se active la actividad anterior.
Ahora nuestro programa est funcionando completamente:
Primer Activity:
79
Segundo Activity:
80
81
82
android.app.Activity;
android.content.Intent;
android.os.Bundle;
android.view.Menu;
android.view.View;
android.widget.EditText;
83
(EditText)
@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_ma
in, menu);
return true;
}
public void ejecutar(View view) {
Intent
i
=
new
Intent(this,
Actividad2.class);
i.putExtra("direccion",
et1.getText().toString());
startActivity(i);
}
}
Como podemos ver la diferencia con el concepto anterior es que
llamamos al mtodo putExtra de la clase Intent. Tiene dos
84
85
android.app.Activity;
android.os.Bundle;
android.view.View;
android.webkit.WebView;
(WebView)
Bundle
bundle
getIntent().getExtras();
webView1.loadUrl("http://"
bundle.getString("direccion"));
CopyRight 2013 - emmmnmmma - All rights reserved
=
+
86
}
public void finalizar(View view) {
finish();
}
}
En esta clase definimos una variable de tipo Bundle y la
inicializamos llamando al mtodo getExtras() de la clase Intent
(esto lo hacemos para recuperar el o los parmetros que envi la
otra actividad (Activity)):
Bundle bundle=getIntent().getExtras();
webView1.loadUrl("http://"+bundle.getString(
"direccion"));
El mtodo loadUrl de la clase WebView permite visualizar el
contenido de un sitio web.
Otro paso fundamental es registrar el Activity en el archivo
"AndroidManifest.xml" que se encuentra en la raiz principal del
proyecto.
Seleccionamos el archivo y activamos la pestaa : "Application",
presionamos el botn "add" y seleccionamos "Activity".
Por ltimo seleccionamos en "Application Nodes" la actividad
creada y definimos la propiedad Name con el nombre de la clase
que la implementa (en nuestro caso se llama Actividad2)
Como nuestra aplicacin debe acceder a internet debemos hacer
otra configuracin en el archivo "AndroidManifest.xml",
debemos ir a la pestaa "Permissions" presionar el botn "Add" y
seleccionar "Uses Permissions":
87
Luego
fijar
en
la
propiedad
android.permission.INTERNET
name
Ahora nuestro
completamente.
estar
programa
debera
el
valor
funcionando
88
89
90
11 - Control Spinner
11 - Almacenamiento
SharedPreferences
de
datos
mediante
la
clase
91
Es decir:
Disponemos un TextView y definimos su ID con
el nombre tv1
la propiedad Text
con
"Ingrese
el
mail:".
92
93
SharedPreferences
prefe=getSharedPreferences("datos",Context.M
ODE_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_ma
in, menu);
return true;
}
public void ejecutar(View v) {
SharedPreferences
preferencias=getSharedPreferences("datos",Co
ntext.MODE_PRIVATE);
Editor editor=preferencias.edit();
editor.putString("mail",
et1.getText().toString());
editor.commit();
finish();
}
}
Obtenemos la referencia del EditText:
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
CopyRight 2013 - emmmnmmma - All rights reserved
94
95
puede
MODE_WORLD_READABLE
otras
aplicaciones
pueden consultar el archivo de preferencias
MODE_WORLD_WRITEABLE
otras
aplicaciones
pueden consultar y modificar el archivo.
MODE_MULTI_PROCESS varios procesos
acceder (Requiere Android 2.3)
pueden
96
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.
La interfaz visual de la aplicacin a desarrollar es:
97
12 - Almacenamiento de datos en un
archivo de texto en la memoria
interna.
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.
La interfaz visual, los controles y sus ID son los siguientes:
98
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;
java.io.OutputStreamWriter;
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.view.View;
android.widget.EditText;
CopyRight 2013 - emmmnmmma - All rights reserved
99
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et1;
@Override
protected
void
onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1
=
(EditText)
findViewById(R.id.et1);
String[] archivos = fileList();
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) {
}
}
CopyRight 2013 - emmmnmmma - All rights reserved
100
@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_ma
in, menu);
return true;
}
private
boolean
existe(String[]
archivos, String archbusca) {
for (int f = 0; f < archivos.length;
f++)
if
(archbusca.equals(archivos[f]))
return true;
return false;
}
public void grabar(View v) {
try {
OutputStreamWriter archivo = new
OutputStreamWriter(openFileOutput(
"notas.txt",
Activity.MODE_PRIVATE));
archivo.write(et1.getText().toString());
archivo.flush();
archivo.close();
} catch (IOException e) {
}
Toast t = Toast.makeText(this, "Los
datos fueron grabados",
Toast.LENGTH_SHORT);
t.show();
CopyRight 2013 - emmmnmmma - All rights reserved
101
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):
public void grabar(View v) {
try {
OutputStreamWriter archivo = new
OutputStreamWriter(openFileOutput("notas.txt
",Activity.MODE_PRIVATE));
Creamos un objeto de la clase OutputStreamWriter y
constructor de dicha clase le enviamos el dato que retorna
mtodo openFileOutput propio de la clase Activity que
pasamos como parmetro el nombre del archivo de texto y
modo de apertura.
al
el
le
el
102
datos
grabados",
103
InputStreamReader
archivo=new
InputStreamReader(openFileInput("notas.txt")
);
Creamos un objeto de la clase BufferedReader y le pasamos al
constructor la referencia del objeto de la clase
InputStreamReader:
BufferedReader
BufferedReader(archivo);
br=new
104
105
13 - Almacenamiento de datos en un
archivo de texto localizado en una
tarjeta SD
106
107
java.io.BufferedReader;
java.io.File;
java.io.FileInputStream;
java.io.FileOutputStream;
java.io.IOException;
java.io.InputStreamReader;
java.io.OutputStreamWriter;
import
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.os.Environment;
android.view.Menu;
android.view.View;
android.widget.EditText;
android.widget.Toast;
108
@Override
protected
void
onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1
=
findViewById(R.id.editText1);
et2
=
findViewById(R.id.editText2);
}
(EditText)
(EditText)
@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_ma
in, menu);
return true;
}
public void grabar(View v) {
String
nomarchivo
=
et1.getText().toString();
String
contenido
=
et2.getText().toString();
try {
File
tarjeta
=
Environment.getExternalStorageDirectory();
File
file
=
new
File(tarjeta.getAbsolutePath(), nomarchivo);
OutputStreamWriter osw = new
OutputStreamWriter(
new
FileOutputStream(file));
CopyRight 2013 - emmmnmmma - All rights reserved
109
osw.write(contenido);
osw.flush();
osw.close();
Toast.makeText(this, "Los datos
fueron grabados correctamente",
Toast.LENGTH_SHORT).show();
et1.setText("");
et2.setText("");
} catch (IOException ioe) {
}
}
public void recuperar(View v) {
String
nomarchivo
=
et1.getText().toString();
File
tarjeta
=
Environment.getExternalStorageDirectory();
File
file
=
new
File(tarjeta.getAbsolutePath(), nomarchivo);
try {
FileInputStream
fIn
=
new
FileInputStream(file);
InputStreamReader archivo = new
InputStreamReader(fIn);
BufferedReader
br
=
new
BufferedReader(archivo);
String linea = br.readLine();
String todo = "";
while (linea != null) {
todo = todo + linea + "
";
linea = br.readLine();
}
br.close();
archivo.close();
et2.setText(todo);
110
} catch (IOException e) {
}
}
}
El mtodo para grabar los datos en un archivo de texto localizado
en una tarjeta SD comienza obteniendo el directorio raiz de la
tarjeta a travs del mtodo getExternalStorageDirectory(), el
mismo retorna un objeto de la clase File.
public void grabar(View v) {
String
nomarchivo
=
et1.getText().toString();
String
contenido=et2.getText().toString();
try
{
File
tarjeta
=
Environment.getExternalStorageDirectory();
Creamos un nuevo objeto de la clase File indicando el camino de
la unidad SD y el nombre del archivo a crear:
File
file
=
new
File(tarjeta.getAbsolutePath(), nomarchivo);
Por ltimo similar al acceso de un archivo interno creamos un
objeto de la clase OutputStreamWriter:
OutputStreamWriter
OutputStreamWriter(new
FileOutputStream(file));
osw
=new
111
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:
public void recuperar(View v) {
String
nomarchivo
=
et1.getText().toString();
File
tarjeta
=
Environment.getExternalStorageDirectory();
File
file
=
new
File(tarjeta.getAbsolutePath(), nomarchivo);
try {
FileInputStream
fIn
=
new
FileInputStream(file);
InputStreamReader
archivo=new
InputStreamReader(fIn);
BufferedReader
br=new
BufferedReader(archivo);
String linea=br.readLine();
String todo="";
while (linea!=null)
{
todo=todo+linea+"\n";
linea=br.readLine();
}
CopyRight 2013 - emmmnmmma - All rights reserved
112
br.close();
archivo.close();
et2.setText(todo);
} catch (IOException e)
{
}
}
113
114
115
extends
public
AdminSQLiteOpenHelper(Context
context,
String
nombre,
CursorFactory
factory, int version) {
super(context,
nombre,
factory,
version);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("create
table
votantes(dni integer primary key, nombre
text, colegio text, nromesa integer)");
}
@Override
public void onUpgrade(SQLiteDatabase db,
int versionAnte, int versionNue) {
db.execSQL("drop table if exists
votantes");
CopyRight 2013 - emmmnmmma - All rights reserved
116
db.execSQL("create
table
votantes(dni integer primary key, nombre
text, colegio text, nromesa integer)");
}
}
En el constructor solo llamamos al constructor de la clase padre
pasando los datos que llegan en los parmetros:
public
AdminSQLiteOpenHelper(Context
context,
String
nombre,
CursorFactory
factory, int version) {
super(context,
nombre,
factory,
version);
}
En el mtodo onCreate procedemos a crear la tabla votantes con
los cuatro campos respectivos y definiendo el campo dni como
primary key:
public void onCreate(SQLiteDatabase db)
{
db.execSQL("create
table
votantes(dni integer primary key, nombre
text, colegio text, nromesa integer)");
}
En el mtodo onUpgrade procedemos a borrar la tabla votantes y
crear nuevamente la tabla (en este caso con la misma estructura
pero podra ser otra en un caso ms real:
public
void
onUpgrade(SQLiteDatabase
db, int versionAnte, int versionNue) {
db.execSQL("drop table if exists
votantes");
db.execSQL("create
table
votantes(dni integer primary key, nombre
text, colegio text, nromesa integer)");
CopyRight 2013 - emmmnmmma - All rights reserved
117
}
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;
public class MainActivity extends Activity {
private EditText et1, et2, et3, et4;
@Override
protected
void
onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1
=
findViewById(R.id.editText1);
et2
=
findViewById(R.id.editText2);
et3
=
findViewById(R.id.editText3);
et4
=
findViewById(R.id.editText4);
}
(EditText)
(EditText)
(EditText)
(EditText)
118
@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_ma
in, menu);
return true;
}
public void alta(View v) {
AdminSQLiteOpenHelper admin = new
AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase
bd
=
admin.getWritableDatabase();
String
dni
=
et1.getText().toString();
String
nombre
=
et2.getText().toString();
String
colegio
=
et3.getText().toString();
String
nromesa
=
et4.getText().toString();
ContentValues
registro
=
new
ContentValues();
registro.put("dni", dni);
registro.put("nombre", nombre);
registro.put("colegio", colegio);
registro.put("nromesa", nromesa);
bd.insert("votantes",
null,
registro);
bd.close();
et1.setText("");
et2.setText("");
et3.setText("");
et4.setText("");
CopyRight 2013 - emmmnmmma - All rights reserved
119
Toast.makeText(this,
"Se
cargaron
los datos de la persona",
Toast.LENGTH_SHORT).show();
}
public void consulta(View v) {
AdminSQLiteOpenHelper admin = new
AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase
bd
=
admin.getWritableDatabase();
String
dni
=
et1.getText().toString();
Cursor fila = bd.rawQuery(
"select
nombre,colegio,nromesa
from votantes where
dni=" + dni, null);
if (fila.moveToFirst()) {
et2.setText(fila.getString(0));
et3.setText(fila.getString(1));
et4.setText(fila.getString(2));
} else
Toast.makeText(this, "No existe
una persona con dicho dni",
Toast.LENGTH_SHORT).show();
bd.close();
}
public void baja(View v) {
AdminSQLiteOpenHelper admin = new
AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase
bd
=
admin.getWritableDatabase();
String
dni
=
et1.getText().toString();
CopyRight 2013 - emmmnmmma - All rights reserved
120
121
122
123
}
2 - Consulta de datos.
Cuando se presiona el botn "Consulta por DNI" se ejecuta el
mtodo consulta:
public void consulta(View v) {
AdminSQLiteOpenHelper
admin=new
AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase
bd=admin.getWritableDatabase();
String dni=et1.getText().toString();
Cursor
fila=bd.rawQuery("select
nombre,colegio,nromesa
from votantes where
dni="+dni+"",null);
if (fila.moveToFirst())
{
et2.setText(fila.getString(0));
et3.setText(fila.getString(1));
et4.setText(fila.getString(2));
}
else
Toast.makeText(this, "No existe
una
persona
con
dicho
dni",
Toast.LENGTH_SHORT).show();
bd.close();
}
En el mtodo consulta lo primero que hacemos es crear un objeto
de la clase AdminSQLiteOpenHelper y obtener una referencia de
la base de datos llamando al mtodo getWritableDatabase.
Seguidamente definimos una variable de la clase Cursor y la
inicializamos con el valor devuelto por el mtodo llamado
rawQuery.
124
La clase Cursos almacena en este caso una fila o cero filas (una en
caso que hayamos ingresado un dni existente en la tabla votantes),
llamamos al mtodo moveToFirst() de la clase Cursos y retorna
true en caso de existir una persona con el dni ingresado, en caso
contrario retorna cero.
Para recuperar los datos propiamente dichos que queremos
consultar llamamos al mtodo getString y le pasamos la posicin
del campo a recuperar (comienza a numerarse en cero, en este
ejemplo la columna cero representa el campo nombre, la columna
1 representa el campo colegio y la columna 2 representa el campo
nromesa)
3 - Baja o borrado de datos.
Para borrar uno o ms registros la clase SQLiteDatabase tiene un
mtodo que le pasamos en el primer parmetro el nombre de la
tabla y en el segundo la condicin que debe cumplirse para que se
borre la fila de la tabla. El mtodo delete retorna un entero que
indica la cantidad de registros borrados:
public void baja(View v) {
AdminSQLiteOpenHelper
admin=new
AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase
bd=admin.getWritableDatabase();
String dni=et1.getText().toString();
int
cant=bd.delete("votantes",
"dni="+dni+"",null);
bd.close();
et1.setText("");
et2.setText("");
et3.setText("");
et4.setText("");
if (cant==1)
Toast.makeText(this, "Se borr la
persona
con
dicho
documento",
Toast.LENGTH_SHORT).show();
CopyRight 2013 - emmmnmmma - All rights reserved
125
else
Toast.makeText(this, "No existe
una
persona
con
dicho
documento",
Toast.LENGTH_SHORT).show();
}
4 - Modificacin de datos.
En la modificacin de datos debemos crear un objeto de la clase
ContentValues y mediante el mtodo put almacenar los valores
para cada campo que ser modificado. Luego se llama al mtodo
update de la clase SQLiteDatabase pasando el nombre de la tabla,
el objeto de la clase ContentValues y la condicin del where (el
cuanto parmetro en este ejemplo no se lo emplea)
public void modificacion(View v) {
AdminSQLiteOpenHelper
admin=new
AdminSQLiteOpenHelper(this,
"administracion", null, 1);
SQLiteDatabase
bd=admin.getWritableDatabase();
String dni=et1.getText().toString();
String
nombre=et2.getText().toString();
String
colegio=et3.getText().toString();
String
nromesa=et4.getText().toString();
ContentValues
registro=new
ContentValues();
registro.put("nombre",nombre);
registro.put("colegio",colegio);
registro.put("nromesa",nromesa);
int cant = bd.update("votantes",
registro, "dni="+dni, null);
bd.close();
if (cant==1)
126
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();
}
127
128
4.
129
5.
130