You are on page 1of 56

R.

Widgets bsicos en Android V: RadioButton


Escrito por Condesa | Mircoles, Julio 13, 2011 a las 10:38 am | Deja un comentario

Este es el ltimo artculo de esta primera serie de elementos bsicos de la GUI de Android. Al igual que los checkbox, los radio button poseen los estados checked y unchecked, con la diferencia de que los radio button pueden ser agrupados para que de esta forma nicamente un radio button pueda cambiar al estado checked mientras los otros permanecen como unchecked. La clase que utilizamos para manipular estos elementos es RadioButton que al igual que los checkbox, hereda de la clase CompoundButton y TextView. Por lo tanto, todas las propiedades de formato que hemos visto en los artculos anteriores son aplicables en los radio button, as como los mtodos que vimos en el artculo dedicado a estudiar los checkbox. Cuando vamos a trabajar con radio buttons desde los archivos de layout en XML, generalmente tendremos primero que hacer uso del elemento <RadioGroup>, que indica que los <RadioButton> contenidos en l se encuentran vinculados, permitiendo que el usuario nicamente pueda seleccionar una opcin a la vez. Para que podamos manipular elRadioGroup desde el cdigo Java de la aplicacin deberemos asignarle un atributoandroid:id con el valor que queramos. De esta manera podemos hacer uso de

los siguientes mtodos: check() para que un radio button del grupo aparezca seleccionado. Para especificar cul de los radio buttons se seleccionar debemos hacer uso del formato R.id.[idDelRadioButton]. clearCheck() para limpiar el grupo de radio buttons para que ninguna aparezca seleccionado.

getCheckedRadioButtonId() para obtener el ID del radio button que actualmente est

seleccionado por el usuario, en caso de que ninguno est seleccionado, este mtodo nos retornar el valor de -1. Los dems mtodos que puedes utilizar cuando trabajas con la clase RadioGroup los puedes consultar en la tabla XML Attributes que puedes encontrar en la documentacin oficial de Android Developers. El cdigo 1. Pasemos a la parte prctica creando un proyecto llamado AndroideityRadioButton con la versin Android 2.1 update 1. 2. Vamos a construir nuestro grupo de radio buttons modificando el archivo main.xml del directorio res/layout como te muestro a continuacin:

Declaramos un elemento <RadioGroup> como raz del documento para que contenga 4<RadioButton> relacionados y as podamos seleccionar uno a la vez. Le asignamos el atributo android:id a cada <RadioButton> esto es til cuando quieras manipular los elementos en el cdigo de tu aplicacin. 3. Ejecutamos el proyecto. Como puedes ver el layout que se muestra en pantalla nos permite elegir un elemento a la vez lo que quiere decir que el grupo de radio buttons est relacionado.

De forma predeterminada, ningn radio button aparece seleccionado, cuestin que podra cambiar si utilizamos desde el cdigo Java el mtodo setCheck() o check() sobre elRadioGroup que definimos en el XML.

En tutoriales ms complejos estaremos haciendo un uso ms avanzado de este y los dems elementos de la GUI de Android. Por el momento es bueno que conozcas de forma bsica los conceptos ms importantes y esenciales de su utilizacin. Concluyendo Para cerrar esta serie de introduccin, hemos visto varios atributos bastante tiles que estos elementos heredan directamente de la clase View. As tambin, voy a resaltar una serie de propiedades y mtodos que considero importantes y tiles para que los tomes en cuenta.

Algunas propiedades de la clase View que te recomiendo utilizar: Para controlar la secuencia en la que se cambia el foco de un elemento a otro:
android:nextFocusDown android:nextFocusLeft android:nextFocusRight android:nextFocusUp android:visibility para indicar si el elemento estar visible cuando se carga el layout en

la aplicacin.
android:bakcground que permite definir el valor de un color bajo el formato RGB para que

juguemos con el aspecto visual de los elementos de la GUI.

Entre los mtodos encontramos: setEnable() e isEnabled() que nos ayudarn a hacer que un elemento de la GUI est disponible para que el usuario pueda interactuar con l y el segundo, para que sepamos el estado de disponibilidad de los elementos. requestFocus() e isFocused() que nos ayudar a conocer cuando el usuario ha puesto el foco sobre algn elemento en especfico, esto puede servirnos para desencadenar validaciones en la informacin que se introduzca en un campo de texto una vez que el usuario pase a proporcionar los siguientes datos del formulario por poner un ejemplo. Para auxiliarnos en la navegacin entre los widgets y sus contenedores, podemos hacer uso de: getParent() para conocer el elemento padre o contenedor de un widget en especfico dentro del layout. getParentOfType() para localizar los elementos padres inmediatos de un widget, por ejemplo RadioGroup sera el elemento padre inmediato de un RadioButton. findViewById() este mtodo es de los que utilizars con ms frecuencia y nos ayudar a hacer referencia de una elemento que est declarado en el layout en XML desde el cdigo Java para que podamos utilizarlo en la aplicacin y asignarle eventos, caractersticas, etc. getRootView() para obtener el elemento raz de los elementos del XML. Ahora que ya conocemos los elementos bsicos de la GUI de Android, vamos a pasar a conocer los tipos de layout que nos especifican la forma o flujo en el que se mostrarn estos elementos en la pantalla del dispositivo.

RADIOBUTTON y RADIOBUTTONGROUP

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 FormWidgets):

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) Por ltimo agreguemos un botn y un TextView para mostrar el resultado Inicializamos las propiedades del botn con los valores:
id : button1 text : operar

Y el tercer TextView con los valores:


id : tv3

text : resultado

Podemos controlar en la ventana "Outline" el id definido para cada control (tv1, et1, tv2, et2, radioGroup1, r1, r2, button1, tv3) Tambin podemos observar de que clase es cada control visual y el texto de la propiedad text para aquellos controles que tienen sentido su inicializacin.

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.

El cdigo fuente de la clase Proyecto003Activity es:

package androidya.proyecto003; import import import import android.view.View; android.widget.EditText; android.widget.RadioButton; android.widget.TextView;

public class Proyecto003Activity extends Activity {

private EditText et1,et2; private TextView tv3; private RadioButton r1,r2; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); et1=(EditText)findViewById(R.id.et1); et2=(EditText)findViewById(R.id.et2); tv3=(TextView)findViewById(R.id.tv3); r1=(RadioButton)findViewById(R.id.r1); r2=(RadioButton)findViewById(R.id.r2); } //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); } }

}
sqlPrimero 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 Proyecto003Activity) 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); tv3.setText(resu); } else if (r2.isChecked()==true) { int resta=nro1-nro2; String resu=String.valueOf(resta); tv3.setText(resu); } }

_------------------------------------------------------------------------------

CONTROL SPINNER Problema:

Realizar la carga de dos nmeros en controles de tipo EditText. Mostrar un mensaje que solicite la carga de los valores. Disponer un control de tipo Spinner que permita seleccionar si queremos sumar, restar, multiplicar o dividir dichos valores. Finalmente mediante un control de tipo Button efectuamos la operacin respectiva. Mostramos el resultado en un TextView. Lo nuevo en este problema es la insercin de un control de tipo Spinner que se encuentra en la pestaa "FormWidgets":

Definimos la propiedad id con el valor spinner1. 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 androidya.proyecto005;

import import import import import import import

android.app.Activity; android.os.Bundle; android.view.View; android.widget.ArrayAdapter; android.widget.EditText; android.widget.Spinner; android.widget.TextView;

public class Proyecto005Activity extends Activity { private Spinner spinner1; private EditText et1,et2; private TextView tv3; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); et1=(EditText)findViewById(R.id.et1); et2=(EditText)findViewById(R.id.et2); tv3=(TextView)findViewById(R.id.tv3); spinner1 = (Spinner) findViewById(R.id.spinner1); String []opciones={"sumar","restar","multiplicar","dividi r"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_ spinner_item, opciones); spinner1.setAdapter(adapter); } //Este mtodo se ejecutar cuando se presione el botn public void operar(View view) {

String valor1=et1.getText().toString(); String valor2=et2.getText().toString(); int nro1=Integer.parseInt(valor1); int nro2=Integer.parseInt(valor2); String selec=spinner1.getSelectedItem().toString(); 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); } } }
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.simple_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_item

El tercer parmetro es la referencia del vector que se mostrar: 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); }

_------------------------------------------------

CONTROL LISTVIEW 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 androidya.proyecto006; import android.app.Activity;

import android.os.Bundle; 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; public class Proyecto006Activity extends Activity { private String[] paises={"Argentina","Chile","Paraguay","Bolivia"," Peru", "Ecuador","Brasil","Colombia","Venezuela","Uruguay "}; private String[] habitantes={"40000000","17000000","6500000","10000 000","30000000", "14000000","183000000","44000000","29000000","3500 000"}; private TextView tv1; private ListView lv1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv1=(TextView)findViewById(R.id.tv1); lv1 =(ListView)findViewById(R.id.listView1); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_ list_item_1, paises); lv1.setAdapter(adapter);

lv1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int posicion, long id) { tv1.setText("Poblacin de "+ lv1.getItemAtPosition(posicion) + " es "+ habitantes[posicion]); } }); } }
Primero definimos dos vectores paralelos donde almacenamos en uno los nombres de paises y en el otro almacenamos la cantidad de habitantes de dichos paises:
private String[] paises={"Argentina","Chile","Paraguay","Bolivia","Peru", "Ecuador","Brasil","Colombia","Venezuela","Uruguay"}; private String[] habitantes={"40000000","17000000","6500000","10000000","30000000", "14000000","183000000","44000000","29000000","3500000"};

Definimos un objeto de tipo TextView y otro de tipo ListView donde almacenaremos las referencias a los objetos que definimos en el archivo XML:
private TextView tv1; private ListView lv1;

En el mtodo onCreate obtenemos la referencia a los dos objetos:


tv1=(TextView)findViewById(R.id.tv1); lv1 =(ListView)findViewById(R.id.listView1);

Creamos un objeto de la clase ArrayAdapter de forma similar a como lo hicimos cuando vimos la clase Spinner:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, paises); lv1.setAdapter(adapter);

Llamamos al mtodo setOnItemClicListener de la clase ListView y le pasamos como parmetro una clase annima que implementa la interfaz OnItemClickListener (dicha interfaz define el mtodo onItemClick que se dispara cuando seleccionamos un elemento del ListView):
lv1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int posicion, long id) { tv1.setText("Poblacin de "+ lv1.getItemAtPosition(posicion) + " es "+ habitantes[posicion]); }

});

Dentro del mtodo onItemClick modificamos el contenido del TextView con el nombre del pas y la cantidad de habitantes de dicho pas. Este mtodo recibe en el tercer parmetro la posicin del item seleccionado del ListView. Cuando ejecutamos el proyecto podemos ver una interfaz en el emulador similar a esta:

Control ImageButton
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 androidya.proyecto007;

import import import import

android.app.Activity; android.os.Bundle; android.view.View; android.widget.TextView;

public class Proyecto007Activity extends Activity { private TextView tv1; private ImageButton ib1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv1=(TextView)findViewById(R.id.tv1); } //Este mtodo se ejecutar cuando se presione el ImageButton public void llamar(View view) { tv1.setText("Llamando"); } }
Definimos los dos atributos:
TextView tv1;

Enlazamos el control definido en el archivo XML y la variable de java:


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 presionando el botn derecho del mouse sobre la imagen del objeto de la clase ImageButton y desde la opcin properties accedemos a la propiedad OnClick) Este proyecto lo puede descargar en un zip desde este enlace: proyecto007.zip

Comentarios extras de este control.

Cuando copiamos el archivo lo hicimos a la carpeta:


drawable-mdpi

Pero vimos que hay otras dos carpetas con nombres similares:
drawable-ldpi drawable-hdpi

El objetivo de estas otras dos 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/ (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)

10 - Lanzar un segundo "Activity" y pasar parmetros.


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. Crearemos un nuevo proyecto llamado proyecto010 y lo almacenaremos en el package name: androidya.proyecto010. 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. El cdigo fuente de esta Activity es:

package androidya.proyecto010; import import import import import android.app.Activity; android.content.Intent; android.os.Bundle; android.view.View; android.widget.EditText;

public class Proyecto010Activity extends Activity { private EditText et1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); et1=(EditText)findViewById(R.id.et1); } public void ejecutar(View view) { Intent i = new Intent(this, Actividad2.class ); i.putExtra("direccion", et1.getText().toString()); startActivity(i); } }
Como podemos ver la diferencia con el concepto anterior es que llamamos al mtodo putExtra de la clase Intent. Tiene dos parmetros de tipo String, en el primero indicamos el nombre del dato y en el segundo el valor del dato:
public void ejecutar(View view) { Intent i = new Intent(this, Actividad2.class ); i.putExtra("direccion", et1.getText().toString()); startActivity(i); }

La segunda interfaz visual (recordemos que debemos presionar el botn derecho sobre la carpeta layout y seleccionar la opcin New -> Android XML File) la llamaremos actividad2.xml:

En esta interfaz disponemos primero un control de tipo Button (button1) y un objeto de la clase WebView (se encuentra en la pestaa "Composite") y lo dejamos con el ID por defecto llamado webView1 Tenemos que crear el archivo Java donde dispondremos la funcionalidad de la segunda ventana (Activity) Creamos una nueva clase al proyecto desde el men contextual(presionamos el botn derecho del mouse sobre el paquete androidya.proyecto010) Al nombre de la clase la llamamos Actividad2 y debemos especificar que hereda de la clase Activity Ahora tenemos que modificar el archivo Java generado con esto:

package androidya.proyecto010; import android.app.Activity; import android.os.Bundle;

import android.view.View; import android.webkit.WebView; public class Actividad2 extends Activity { private WebView webView1; @Override public void onCreate(Bundle b) { super.onCreate(b); setContentView(R.layout.actividad2); webView1=(WebView)findViewById(R.id.webView1); Bundle bundle=getIntent().getExtras(); webView1.loadUrl("http://"+bundle.getString("direc cion")); } 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":

Luego fijar en la propiedad name el valor android.permission.INTERNET Ahora nuestro programa debera estar funcionando completamente. La primer ventana debera ser algo similar a esto:

La segunda ventana debera ser algo similar a esto otro:

14 - Almacenamiento en una base de datos 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 2 3 4 Carga de personas. Consulta por el dni (para saber donde vota) Borrado de personas Modificacin de datos.

Primero implementamos una interfaz visual similar a esta:

Lo primero que haremos es crear una clase que herede de SQLiteOpenHelper. Esta clase nos permite crear la base de datos y actualizar la estructura de tablas y datos iniciales. Debemos implementar el constructor y sobreescribir los mtodos onCreate y onUpgrade.

El mtodo onCreate se le llama cuando la base de datos se crea por primera vez. Aqu es donde se define la estructura de las tablas y se cargan eventualmente los datos iniciales En el mtodo onUpgrade se llama cuando la base de datos debe ser actualizada. Tiene por objetivo eliminar tablas, aadir tablas, o hacer cualquier otra cosa que necesita para actualizarse. En nuestro problema implementaremos una nueva clase llamada AdminSQLiteOpenHelper que herede de la clase SQLiteOpenHelper:

package androidya.proyecto015; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFacto ry; import android.database.sqlite.SQLiteOpenHelper; public class AdminSQLiteOpenHelper extends SQLiteOpenHelper { 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 int primary key, nombre text, colegio text, nromesa int)"); } @Override public void onUpgrade(SQLiteDatabase db, int versionAnte, int versionNue) { db.execSQL("drop table if exists votantes");

db.execSQL("create table votantes(dni int primary key, nombre text, colegio text, nromesa int)"); } }
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 ltabla 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 int primary key, nombre text, colegio text, nromesa int)"); }

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 int primary key, nombre text, colegio text, nromesa int)"); }

Ahora veamos la otra clase que implementar las altas, bajas, modificaciones y consultas:

package androidya.proyecto015; import import import import import import import import android.app.Activity; android.content.ContentValues; android.database.Cursor; android.database.sqlite.SQLiteDatabase; android.os.Bundle; android.view.View; android.widget.EditText; android.widget.Toast;

public class Proyecto015Activity extends Activity { private EditText et1,et2,et3,et4;

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); et1=(EditText)findViewById(R.id.editText1); et2=(EditText)findViewById(R.id.editText2); et3=(EditText)findViewById(R.id.editText3); et4=(EditText)findViewById(R.id.editText4); } public void alta(View v) { AdminSQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this, "administracion", null, 1); SQLiteDatabase bd=admin.getWritableDatabase(); String dni=et1.getText().toString(); String nombre=et2.getText().toString(); String colegio=et3.getText().toString(); String nromesa=et4.getText().toString(); ContentValues registro=new ContentValues(); registro.put("dni",dni ); registro.put("nombre",nombre ); registro.put("colegio",colegio ); registro.put("nromesa",nromesa ); bd.insert("votantes", null, registro); bd.close(); et1.setText(""); et2.setText(""); et3.setText("");

et4.setText(""); Toast.makeText(this, "Se cargaron los datos de la persona", Toast.LENGTH_SHORT).show(); } 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(); int cant=bd.delete("votantes", "dni="+dni+"",null); bd.close();

et1.setText(""); et2.setText(""); et3.setText(""); et4.setText(""); if (cant==1) Toast.makeText(this, "Se borr la persona con dicho documento", Toast.LENGTH_SHORT).show(); else Toast.makeText(this, "No existe una persona con dicho documento", Toast.LENGTH_SHORT).show(); } public void modificacion(View v) { AdminSQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this, "administracion", null, 1); SQLiteDatabase bd=admin.getWritableDatabase(); String dni=et1.getText().toString(); String nombre=et2.getText().toString(); String colegio=et3.getText().toString(); String nromesa=et4.getText().toString(); ContentValues registro=new ContentValues(); registro.put("nombre",nombre); registro.put("colegio",colegio); registro.put("nromesa",nromesa); int cant = bd.update("votantes", registro, "dni="+dni, null); bd.close(); if (cant==1) Toast.makeText(this, "se modificaron los datos", Toast.LENGTH_SHORT).show(); else Toast.makeText(this, "no existe una persona con dicho documento", Toast.LENGTH_SHORT).show();

} }
Como en problemas anteriores definimos los cuatro EditText como atributos y en el mtodo onCreate obtenemos la referencia de los mismos:
public class Proyecto015Activity extends Activity { private EditText et1,et2,et3,et4; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); et1=(EditText)findViewById(R.id.editText1); et2=(EditText)findViewById(R.id.editText2); et3=(EditText)findViewById(R.id.editText3); et4=(EditText)findViewById(R.id.editText4); }

1 - Alta de datos. Cuando se presiona el botn alta se ejecuta el mtodo "alta" recordemos inicializar la propiedad "OnClick" del botn desde la ventana de visualizacin del archivo XML. Lo primero que hacemos en este mtodo es crear un objeto de la clase que planteamos anteriormente y le pasamos al constructor this (referencia del Activity actual), "administracion" (es el nombre de la base de datos que crearemos en el caso que no exista) luego pasamos null y un uno indicando que es la primer versin de la base de datos (en caso que cambiemos la estructura o agreguemos tablas por ejemplo podemos pasar un dos en lugar de un uno para que se ejecute el mtodo onUpgrade donde indicamos la nuestra estructura de la base de datos) Luego de crear un objeto de la clase AdminSqLiteOpenHelper procedemos a crear un objeto de la clase SQLiteDataBase llamando al mtodo getWritableDatabase (la base de datos se abre en modo lectura y escritura). Creamos un objeto de la clase ContentValues y mediante el mtodo put inicializamos todos tos campos a cargar. Seguidamente llamamos al mtodo insert de la clase SQLiteDatabase pasando en el primer parmetro el nombre de la tabla, como segundo parmetro un null y por ltimo el objeto de la clase ContentValues ya inicializado (este mtodo es el que provoca que se inserte una nueva fila en la tabla votantes en la base de datos llamada administracion) Borramos seguidamente los EditText y mostramos un mensaje para que conozca el operador que el alta de datos se efectu en forma correcta:
public void alta(View v) { AdminSQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this, "administracion", null, 1); SQLiteDatabase bd=admin.getWritableDatabase(); String dni=et1.getText().toString(); String nombre=et2.getText().toString(); String colegio=et3.getText().toString(); String nromesa=et4.getText().toString(); ContentValues registro=new ContentValues();

registro.put("dni",dni ); registro.put("nombre",nombre ); registro.put("colegio",colegio ); registro.put("nromesa",nromesa ); bd.insert("votantes", null, registro); bd.close(); et1.setText(""); et2.setText(""); et3.setText(""); et4.setText(""); Toast.makeText(this, "Se cargaron los datos de la persona", Toast.LENGTH_SHORT).show(); }

2 - Consulta de datos. Cuando se presiona el botn "Consulta por DNI" se ejecuta el mtodo consulta:
public void consulta(View v) { AdminSQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this, "administracion", null, 1); SQLiteDatabase bd=admin.getWritableDatabase(); String dni=et1.getText().toString(); Cursor fila=bd.rawQuery("select nombre,colegio,nromesa from votantes where dni="+dni+"",null); if (fila.moveToFirst()) { et2.setText(fila.getString(0)); et3.setText(fila.getString(1)); et4.setText(fila.getString(2)); } else Toast.makeText(this, "No existe una persona con dicho dni", Toast.LENGTH_SHORT).show(); bd.close(); }

En el mtodo consulta lo primero que hacemos es crear un objeto de la clase AdminSQLiteOpenHelper y obtener una referencia de la base de datos llamando al mtodo getWritableDatabase. Seguidamente definimos una variable de la clase Cursor y la inicializamos con el valor devuelto por el mtodo llamado rawQuery. La clase Cursos almacena en este caso una fila o cero filas (una en caso que hayamos ingresado un dni existente en la tabla votantes), llamamos al mtodo moveToFirst() de la clase Cursos y retorna true en caso de existir una persona con el dni ingresado, en caso contrario retorna cero. Para recuperar los datos propiamente dichos que queremos consultar llamamos al mtodo getString y le pasamos la posicin del campo a recuperar (comienza a numerarse en cero, en este ejemplo la columna cero representa el campo nombre, la columna 1 representa el campo colegio y la columna 2 representa el campo nromesa) 3 - Baja o borrado de datos. Para borrar uno o ms registros la clase SQLiteDatabase tiene un mtodo que le pasamos en el primer parmetro el nombre de la tabla y en el segundo la

condicin que debe cumplirse para que se borre la fila de la tabla. El mtodo delete retorna un entero que indica la cantidad de registros borrados:
public void baja(View v) { AdminSQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this, "administracion", null, 1); SQLiteDatabase bd=admin.getWritableDatabase(); String dni=et1.getText().toString(); int cant=bd.delete("votantes", "dni="+dni+"",null); bd.close(); et1.setText(""); et2.setText(""); et3.setText(""); et4.setText(""); if (cant==1) Toast.makeText(this, "Se borr la persona con dicho documento", Toast.LENGTH_SHORT).show(); else Toast.makeText(this, "No existe una persona con dicho documento", Toast.LENGTH_SHORT).show(); }

4 - Modificacin de datos. En la modificacin de datos debemos crear un objeto de la clase ContentValues y mediante el mtodo put almacenar los valores para cada campo que ser modificado. Luego se llama al mtodo update de la clase SQLiteDatabase pasando el nombre de la tabla, el objeto de la clase ContentValues y la condicin del where (el cuanto parmetro en este ejemplo no se lo emplea)
public void modificacion(View v) { AdminSQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this, "administracion", null, 1); SQLiteDatabase bd=admin.getWritableDatabase(); String dni=et1.getText().toString(); String nombre=et2.getText().toString(); String colegio=et3.getText().toString(); String nromesa=et4.getText().toString(); ContentValues registro=new ContentValues(); registro.put("nombre",nombre); registro.put("colegio",colegio); registro.put("nromesa",nromesa); int cant = bd.update("votantes", registro, "dni="+dni, null); bd.close(); if (cant==1) Toast.makeText(this, "se modificaron los datos", Toast.LENGTH_SHORT).show(); else Toast.makeText(this, "no existe una persona con dicho documento", Toast.LENGTH_SHORT).show(); }

Este proyecto lo puede descargar en un zip desde este enlace: proyecto015.zip

20 - Layout (ScrollView y LinearLayout)


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 e 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:

Luego si ejecutamos el programa veremos que podemos desplazar (scroll) todo el contenido del visor con el dedo:

Este proyecto lo puede descargar en un zip desde este enlace: proyecto017.zip 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:

REPRODUCCION DE AUDIO CONTENIDO EN LA APLICACIN

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:

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":

Podemos comprobar que los dos archivos estn referenciados en el proyecto. Creamos una interfaz con dos botones e inicializamos las propiedades Text y On Click de cada botn:

El cdigo fuente de la clase Proyecto019Activity.java es:

package androidya.proyecto019; import import import import android.app.Activity; android.media.MediaPlayer; android.os.Bundle; android.view.View;

public class Proyecto019Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void presionGato(View v) { MediaPlayer mp=MediaPlayer.create(this,R.raw.gato); mp.start(); } public void presionLeon(View v) { MediaPlayer mp=MediaPlayer.create(this, R.raw.leon); mp.start(); } }
Cuando copiamos los archivos mp3 se genera luego en la clase R la referencia a los dos archivos y posteriormente los podemos rescatar cuando creamos un objeto de la clase MediaPlayer:
MediaPlayer mp=MediaPlayer.create(this,R.raw.gato);

Seguidamente llamamos al mtodo start:


mp.start();

Este proyecto lo puede descargar en un zip desde este enlace: proyecto019.zip

ALERTDIALOG CON BOTON DE ACEPTAR Y CANCELAR

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. Primero creamos un proyecto llamado: proyecto032 Lo almacenamos en el paquete: androidya.proyecto032 El cdigo fuente de la aplicacin queda como sigue:

package androidya.proyecto032; import import import import import android.app.Activity; android.app.AlertDialog; android.content.DialogInterface; android.os.Bundle; android.widget.Toast;

public class Proyecto032Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); AlertDialog.Builder dialogo1 = new AlertDialog.Builder(this); dialogo1.setTitle("Importante"); dialogo1.setMessage(" Acepta la ejecucin de este programa en modo prueba ?"); dialogo1.setCancelable(false); dialogo1.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogo1, int id) { aceptar();

} }); dialogo1.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogo1, int id) { cancelar(); } }); dialogo1.show(); } public void aceptar() { Toast t=Toast.makeText(this,"Bienvenido a probar el programa.", Toast.LENGTH_SHORT); t.show(); } public void cancelar() { finish(); } }
Creamos un objeto de la clase AlertDialog a travs de la clase Builder:
AlertDialog.Builder dialogo1 = new AlertDialog.Builder(this);

Configuramos el ttulo del dilogo:


dialogo1.setTitle("Importante");

Configuramos el mensaje del dilogo:


dialogo1.setMessage(" Acepta la ejecucin de este programa en modo prueba ?");

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:
dialogo1.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogo1, int id) { aceptar(); } });

De forma similar procedemos con el botn de cancelar:


dialogo1.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogo1, int id) {

cancelar(); } });

Mostramos el dilogo:
dialogo1.show();

Definimos los mtodos del Activity que se llamaran desde las clases annimas:
public void aceptar() { Toast t=Toast.makeText(this,"Bienvenido a probar el programa.", Toast.LENGTH_SHORT); t.show(); } public void cancelar() { finish(); }

La interfaz del dilogo es similar a esta:

Este proyecto lo puede descargar en un zip desde este enlace: proyecto032.zip