- José Enrique Amaro Soriano
- Android
- index_split_007.html
3. BOTONES
En Android los
botones permiten interaccionar con las aplicaciones para realizar
acciones.
3.1. Definición de
un botón en el layout
Lo más simple
es definir un botón dentro de un layout mediante:
<Button
android:id="@+id/myButton"
android:text="Boton"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</Button>
Este botón lo
añadimos al fichero main.xml del ejemplo
"Hola Android’’ que se modifica así:
<?xml version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLinearLayout"
android:background="#ffffff"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/myTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="20sp"
android:text="Hola
Android"
/>
<Button
android:id="@+id/myButton"
android:text="Boton"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
![](/epubstore/S/J-E-Soriano/Android/OEBPS/Images/00047.jpg)
Figura 3.1.
Un botón
simple.
La actividad
principal “inflará” este botón junto con el layout. Por ejemplo:
public class Hello extends Activity
implements
onClickListener {
/** Called when the
activity is first created. */
@Override
public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView
myTextView=
(TextView)
findViewById(R.id.myTextView);
myTextView.setText("Ejemplo
de botón");
}
El resultado
se muestra en la figura 3.1. Nótese que
en la primera linea hemos añadido a la clase Hello la propiedad:
implements
OnClickListener
Esto es
necesario para que la actividad "escuche los clicks’’ y responda al
pulsar sobre el botón. Para que el botón responda a una acción
primero debemos definir el botón como un objeto de tipo
View
asociado a su ID:
View
boton=findViewById(R.id.myButton);
y luego
definir a este botón como un "oyente’’ de clicks en nuestra
actividad:
boton.setOnClickListener(this);
Para finalizar
la implementación de la interfaz OnClickListener,
debemos definir el método onClick()que contiene
las instrucciones a seguir cuando se pulse el
botón:
public void
onClick(View v) {
myTextView.setText("Has
pulsado el botón");
}
El ejemplo
final quedaría así:
package
prueba.android.hello;
import
android.app.Activity;
import
android.os.Bundle;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.TextView;
public class
Hello extends Activity implements
OnClickListener{
/** Called when the
activity is first created. */
TextView
myTextView;
@Override
public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myTextView=(TextView)findViewById(R.id.myTextView);
myTextView.setText("Ejemplo
de botón");
View
boton=findViewById(R.id.myButton);
boton.setOnClickListener(this);
}
public
void onClick(View v) {
myTextView.setText("Has
pulsado el botón");
}
Nótese que en
el encabezamiento hemos incluido también las importaciones
necesarias para que el programa funcione. Estas líneas generalmente
las obviamos en nuestros ejemplos, porque el programa Eclipse nos
informa y hace las importaciones necesarias, pulsando con el botón
derecho del ratón sobre los nombres de los objetos que quedan
subrayados en rojo en Eclipse.
Lo que hace el
método onClick()es modificar
el texto de myTextView, que hemos
tenido que declarar fuera del método onCreate()como campo de la clase Hello para que esté definido en toda actividad, también
en onClick()
TextView
myTextView;
Al pulsar el
botón se ejecuta el método onClick()que redefine
el texto de myTextView, "has
pulsado el botón", como se ve en la figura
3.2.
![](/epubstore/S/J-E-Soriano/Android/OEBPS/Images/00049.jpg)
Figura 3.2.
El texto cambia tras
pulsar el botón.
3.2. Caso de dos
botones
Para añadir un
segundo botón basta definirlo en main.xml a continuación del
primero.
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/myTextView"
android:textColor="#000000"
android:textSize="12sp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hola Android"
/>
<Button
android:text="Boton 1"
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</Button>
<Button
android:text="Boton 2"
android:id="@+id/button2"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
Igual que en
el caso de un botón, hay que definir cada uno de los dos botones
como "escuchador" mediante setOnClickListener().
View
boton1=findViewById(R.id.button1);
boton1.setOnClickListener(this);
View
boton2=findViewById(R.id.button2);
boton2.setOnClickListener(this);
Finalmente, se
debe definir una acción dependiendo de cuál de los botones se ha
pulsado en el método onClick(View v), donde v corresponderá a uno
de los dos botones. Basta entonces comprobar su "ID"
mediante v.getId() para
definir la acción. En el siguiente ejemplo haremos que se escriba
un texto indicando qué botón se ha pulsado.
public class
HolaAndroid2 extends Activity implements
OnClickListener{
TextView
myTextView;
@Override
public void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
View
v=findViewById(R.id.myTextView);
myTextView=(TextView)
v;
myTextView.setText("Ejemplo
de boton");
View
boton1=findViewById(R.id.button1);
boton1.setOnClickListener(this);
View
boton2=findViewById(R.id.button2);
boton2.setOnClickListener(this);
}
public void onClick(View
v){
if(v.getId()==R.id.button1)
{
myTextView.setText("Has
pulsado el boton 1");
}
else
if(v.getId()==R.id.button2){
myTextView.setText("Has
pulsado el boton 2");
}
}
}
El resultado
de pulsar el botón 2 se muestra en la figura
3.3.
3.3. Uso de Toast
para mostrar un mensaje emergente
Se puede usar
el método Toast.makeText()para
crear un objeto Toast que permite
mostrar un texto en una pantalla emergente durante unos
segundos
Toast.makeText(this, mensaje,
duracion).show();
donde
mensaje
es un objeto de tipo String y
duración
es un número entero, que se puede
especificar mediante las constantes Toast.LENGTH_SHORT (0) y
Toast.LENGTH_LONG (1). Ilustraremos el funcionamiento de un Toast usando los dos botones del ejemplo anterior. Basta
modificar el método onClick()de la
siguiente forma:
![](/epubstore/S/J-E-Soriano/Android/OEBPS/Images/00053.jpg)
Figura 3.3.
El texto cambia según
el botón que se ha pulsado.
public void
onClick(View v){
String mensaje="";
int
duracion=1;
if(v.getId()==R.id.button1)
{
mensaje="Has pulsado el
boton 1";
duracion=Toast.LENGTH_SHORT;
}
else
if(v.getId()==R.id.button2){
mensaje="Has pulsado el
boton 2";
duracion=Toast.LENGTH_LONG;
}
mensaje=mensaje+" duracion =
"+duracion;
Toast.makeText(this, mensaje,
duracion).show();
}
El resultado
después de pulsar el botón 2 se muestra en la figura
3.4.
![](/epubstore/S/J-E-Soriano/Android/OEBPS/Images/00056.jpg)
Figura 3.4.
Un texto emergente
con Toast
tras pulsar el botón
2.
3.4. Cambiar el
texto de un botón
La
clase Button es una
extensión de la clase TextView. Por tanto,
se pueden usar todo sus métodos, por ejemplo setTex(), de la siguiente forma: ((TextView) boton).setText("texto
del boton"); nótese que para
usar el método hay que convertir el botón a tipo TextView mediante
un cast.
En la
siguiente aplicación, modificamos el ejemplo anterior para que cada
botón muestre el número de veces que se ha pulsado. Basta sustituir
el método onClick() por lo
siguiente:
int
i1=0;
int
i2=0;
public void onClick(View
v){
String mensaje="";
int duracion=1;
if(v.getId()==R.id.button1)
{
i1++;
((TextView)v).setText("Pulsado
"+i1+" veces");
}
else
if(v.getId()==R.id.button2){
i2++;
((TextView)v).setText("Pulsado
"+i2+" veces");
}
}
El resultado
se muestra en la figura 3.5.
![](/epubstore/S/J-E-Soriano/Android/OEBPS/Images/00059.jpg)
Figura 3.5.
Cada botón muestra el
número de pulsaciones usando setText.
3.5. Cambiar
el color de los botones
Para cambiar
el color de un botón se utiliza el método:
boton.setBackgroundColor(Color.rgb(red,green,blue))
Como
ilustración del uso de este método, en el ejemplo anterior
añadiremos un tercer botón y definiremos el método
onClick()
para que, al pulsar sobre el primer botón,
cambie la componente red, el segundo
la green y el tercero
la blue. Pulsando sobre
los distintos botones estos cambian de color. El programa permite
explorar la gama de colores avanzando de cinco en cinco. Este es el
código que sustituye a onClick():
int
i1=0;
int
i2=0;
int
i3=0;
int
dcolor=5;
int
cmax=255;
int
red=cmax;
int
green=cmax;
int
blue=cmax;
public void onClick(View
v){
if(v.getId()==R.id.button1)
{
i1++;
red=dcolor*i1%cmax;
}
else
if(v.getId()==R.id.button2){
i2++;
green=dcolor*i2%cmax;
}
else
if(v.getId()==R.id.button3){
i3++;
blue=dcolor*i3%cmax;
}
((TextView)v).setText("color
"+red+","+green+","+blue);
v.setBackgroundColor(Color.rgb(red,green,blue));
}
El resultado
se ve en la figura 3.6.
![](/epubstore/S/J-E-Soriano/Android/OEBPS/Images/00063.jpg)
Figura 3.6.
Pulsando los botones,
cambian de color
con
setBackgroundColor().
3.6. Calculadora
Para ilustrar
el uso de botones en Android presentamos una sencilla aplicación,
una calculadora con botones para números y operaciones. Esto nos
permitirá también introducir el uso de tablas en Android. Primero
definimos los botones en main.xml dispuestos
en una tabla, usando un TableLayout. Cada
fila se especifica con TableRow. Las dos
primeras filas incluyen sólo texto. La primera fila es un título.
La segunda fila mostrará los números que vamos introduciendo. La
tercera fila es un texto para el resultado de los cálculos, que
expande tres columnas, y el botón "=". Las siguientes filas contienen botones para las teclas
numéricas, las operaciones aritméticas, el punto decimal y la tecla
de borrado.
<?xml
version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tableLayout1"
android:background="#ffffff"
android:stretchColumns="*"
android:layout_gravity="center"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:textColor="#000000"
android:background="#ffaa33"
android:textSize="24sp"
android:layout_gravity="center"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Android
Calculator"
/>
<TextView
android:id="@+id/myTextView"
android:textColor="#000000"
android:textSize="24sp"
android:layout_gravity="left"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Pulse para empezar a
calcular"
/>
<TableRow>
<TextView
android:layout_span="3"
android:id="@+id/myTextView2"
android:background="#ffaa33"
android:textColor="#000000"
android:textSize="24sp"
android:layout_gravity="left"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Resultado"
/>
<Button
android:text="="
android:textSize="24sp"
android:layout_span="1"
android:id="@+id/buttonIgual"
/>
</TableRow>
<TableRow>
<Button
android:text="1"
android:textSize="24sp"
android:id="@+id/button1"
/>
<Button
android:text="2"
android:textSize="24sp"
android:id="@+id/button2"
/>
<Button
android:text="3"
android:textSize="24sp"
android:id="@+id/button3"
/>
<Button
android:text="+"
android:textSize="24sp"
android:id="@+id/buttonSuma"
/>
</TableRow>
<TableRow>
<Button
android:text="4"
android:textSize="24sp"
android:id="@+id/button4"
/>
<Button
android:text="5"
android:textSize="24sp"
android:id="@+id/button5"
/>
<Button
android:text="6"
android:textSize="24sp"
android:id="@+id/button6"
/>
<Button
android:text="-"
android:textSize="24sp"
android:id="@+id/buttonResta"
/>
</TableRow>
<TableRow>
<Button
android:text="7"
android:textSize="24sp"
android:id="@+id/button7"
/>
<Button
android:text="8"
android:textSize="24sp"
android:id="@+id/button8"
/>
<Button
android:text="9"
android:textSize="24sp"
android:id="@+id/button9"/>
<Button
android:text="x"
android:textSize="24sp"
android:id="@+id/buttonMultiplica"
/>
</TableRow>
<TableRow>
<Button
android:text="0"
android:textSize="24sp"
android:id="@+id/button0"
/>
<Button
android:text="."
android:textSize="24sp"
android:id="@+id/buttonPunto"
/>
<Button
android:text="C"
android:textSize="24sp"
android:id="@+id/buttonBorra"
/>
<Button
android:text="/"
android:textSize="24sp"
android:id="@+id/buttonDivide"
/>
</TableRow>
</TableLayout>
Este layout se
muestra en la figura 3.7.
![](/epubstore/S/J-E-Soriano/Android/OEBPS/Images/00009.jpg)
Figura 3.7.
Diseño de una
calculadora con TableLayout.
La
actividad Calculadora.java primero define todos los botones en onCreate().
Seguidamente se define la acción de cada
botón en el método onClick(). Para los
botones numéricos, esta consiste en añadir la cifra correspondiente
al número que se va almacenando en myTextView.
Al pulsar un operador, "+,-,x,/,=",
se invoca el método calcula() que realiza la operación anterior y actualiza las
variables. Los números que se van introduciendo se almacenan en las
variables de clase m1, m2. El operador
anterior introducido se guarda en la variable char op1. He aquí el listado. La calculadora es muy rudimentaria,
pero realiza perfectamente las operaciones
indicadas.
public class Calculadora extends
Activity implements
OnClickListener{
TextView
myTextView,myTextView2;
@Override
public void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
View
v1=findViewById(R.id.myTextView);
myTextView=(TextView)
v1;
myTextView.setText("");
View
v2=findViewById(R.id.myTextView2);
myTextView2=(TextView)
v2;
myTextView2.setText("");
View
boton1=findViewById(R.id.button1);
boton1.setOnClickListener(this);
View
boton2=findViewById(R.id.button2);
boton2.setOnClickListener(this);
View
boton3=findViewById(R.id.button3);
boton3.setOnClickListener(this);
View
boton4=findViewById(R.id.button4);
boton4.setOnClickListener(this);
View
boton5=findViewById(R.id.button5);
boton5.setOnClickListener(this);
View
boton6=findViewById(R.id.button6);
boton6.setOnClickListener(this);
View
boton7=findViewById(R.id.button7);
boton7.setOnClickListener(this);
View
boton8=findViewById(R.id.button8);
boton8.setOnClickListener(this);
View
boton9=findViewById(R.id.button9);
boton9.setOnClickListener(this);
View
boton0=findViewById(R.id.button0);
boton0.setOnClickListener(this);
View
botonSuma=findViewById(R.id.buttonSuma);
botonSuma.setOnClickListener(this);
View
botonResta=findViewById(R.id.buttonResta);
botonResta.setOnClickListener(this);
View
botonMultiplica=
findViewById(R.id.buttonMultiplica);
botonMultiplica.setOnClickListener(this);
View
botonDivide=findViewById(R.id.buttonDivide);
botonDivide.setOnClickListener(this);
View
botonPunto=findViewById(R.id.buttonPunto);
botonPunto.setOnClickListener(this);
View
botonBorra=findViewById(R.id.buttonBorra);
botonBorra.setOnClickListener(this);
View
botonIgual=findViewById(R.id.buttonIgual);
botonIgual.setOnClickListener(this);
}
double result,m1=0,m2=0;
char
op1=‘+’;
public void onClick(View
v){
if(v.getId()==R.id.button1)
myTextView.append("1");
else
if(v.getId()==R.id.button2)
myTextView.append("2");
else
if(v.getId()==R.id.button3)
myTextView.append("3");
else
if(v.getId()==R.id.button4)
myTextView.append("4");
else
if(v.getId()==R.id.button5)
myTextView.append("5");
else
if(v.getId()==R.id.button6)
myTextView.append("6");
else
if(v.getId()==R.id.button7)
myTextView.append("7");
else
if(v.getId()==R.id.button8)
myTextView.append("8");
else
if(v.getId()==R.id.button9)
myTextView.append("9");
else
if(v.getId()==R.id.button0)
myTextView.append("0");
else
if(v.getId()==R.id.buttonPunto)
myTextView.append(".");
else
if(v.getId()==R.id.buttonBorra){
myTextView.setText("");
myTextView2.setText("");
m1=0;
op1=‘+’;
}
else
if(v.getId()==R.id.buttonSuma) calcula(‘+’);
else
if(v.getId()==R.id.buttonResta) calcula(‘-’);
else
if(v.getId()==R.id.buttonMultiplica)
calcula(‘*’);
else
if(v.getId()==R.id.buttonDivide) calcula(‘/’);
else
if(v.getId()==R.id.buttonIgual) calcula(‘=‘);
}
public void calcula(char
op){
double
result=m1;
String cadena=
myTextView.getText().toString();
try{
m2=Double.parseDouble(cadena);
if(op1==‘+’)
result=m1+m2;
else
if(op1==‘-’) result=m1-m2;
else
if(op1==‘*’) result=m1*m2;
else
if(op1==‘/’) result=m1/m2;
m1=result;
op1=op;
if(op ==
‘=‘){
myTextView.setText(""+m1);
myTextView2.setText(""+m1);
}else{
myTextView.setText("");
myTextView2.setText(""+m1+op1);
}
}
catch(NumberFormatException nfe){
Toast.makeText(this,"numero
incorrecto",1).show();
}
}
}
La calculadora
en funcionamiento se muestra en la figura
3.8.
![](/epubstore/S/J-E-Soriano/Android/OEBPS/Images/00064.jpg)
Figura 3.8.
Resultado de una
operación con la calculadora.
Hemos previsto
que se puedan cometer errores al introducir los datos (por ejemplo,
pulsar varios operadores seguidos). Para evitar que la aplicación
Android se aborte en caso de error, Java permite realizar el
cálculo dentro de un bloque try – catch.
Si se produce
un error sería una excepción de tipo NumberFormatException
al tratar de transformar en un número la
cadena introducida. En caso de error, se muestra un mensaje en la
pantalla mediante un Toast, pero se puede
seguir calculando. Un ejemplo de mensaje de error se muestra en
la figura
3.9.
![](/epubstore/S/J-E-Soriano/Android/OEBPS/Images/00067.jpg)
Figura 3.9.
Mensaje de error tras
una operación inválida con la
calculadora.