Diferencia entre revisiones de «Button. ToggleButton. Control de eventos II»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 175: Línea 175:
  
 
==Eventos==
 
==Eventos==
−
*Nesta ocasión imos ver dun xeito sinxelo como capturar os eventos dos botóns. Máis adiante afondaremos no control de eventos.
+
 
−
*Un '''evento''' é algo que acontece nun control e que nos interesa capturar no sistema para desencadenar (ou non) unha serie de accións.
+
* Para asociar un evento a un botón, podemos facelo:
 +
:* Asociando, como vimos [http://wiki.cifprodolfoucha.es/index.php?title=PDM_Xesti%C3%B3n_de_Eventos na xestión de eventos], unha interface a cada botón e rexistrando o evento que queiramos controlar (nesta caso dun click).
 +
:* '''No caso dos botón, podemos facelo no layout da activity'''.
 +
 
 +
 
 +
 
 +
*Nesta ocasión imos ver dun xeito sinxelo como capturar os eventos dos botóns.  
 +
*Un '''evento''' é algo que acontece nun control e que nos interesa capturar no sistema para desencadear (ou non) unha serie de accións.
 
*Xa vimos no caso anterior (EditText) que podíamos controlar eventos que acontecen nos controis.
 
*Xa vimos no caso anterior (EditText) que podíamos controlar eventos que acontecen nos controis.
−
*Nesta ocasión para os Botóns imos facelo de dúas formas:
 
−
**Control de eventos dende o layout
 
−
**Control de eventos a través dunha clase anónima.
 
  
  
  
 +
<br />
 
===Control de eventos dende o layout===
 
===Control de eventos dende o layout===
 +
 
*É a forma máis sinxela de desencadear unha acción.
 
*É a forma máis sinxela de desencadear unha acción.
 
*Imos facelo de dúas formas:
 
*Imos facelo de dúas formas:
Línea 192: Línea 198:
 
====Crear un método para cada botón====
 
====Crear un método para cada botón====
 
*Observar a propiedade: '''android:onClick''' nos controis dos botóns.
 
*Observar a propiedade: '''android:onClick''' nos controis dos botóns.
−
<syntaxhighlight lang="xml" line highlight="16,24,34">
+
<syntaxhighlight lang="xml" line highlight="17,25,34">
 +
<?xml version="1.0" encoding="utf-8"?>
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
     xmlns:tools="http://schemas.android.com/tools"
 
     xmlns:tools="http://schemas.android.com/tools"
Línea 205: Línea 212:
  
 
         <Button
 
         <Button
−
             android:id="@+id/btn_boton"
+
             android:id="@+id/btnBoton_UD02_01_buttons"
 
             android:layout_width="150sp"
 
             android:layout_width="150sp"
 
             android:layout_height="wrap_content"
 
             android:layout_height="wrap_content"
Línea 213: Línea 220:
  
 
         <ToggleButton
 
         <ToggleButton
−
             android:id="@+id/tbtn_boton_2estados"
+
             android:id="@+id/tbtnDosEstados_UD02_01_buttons"
 
             android:layout_width="100dp"
 
             android:layout_width="100dp"
 
             android:layout_height="match_parent"
 
             android:layout_height="match_parent"
Línea 222: Línea 229:
  
 
         <ImageButton
 
         <ImageButton
−
             android:id="@+id/ibtn_boton_imaxe"
+
             android:id="@+id/ibtnImagen_UD02_01_buttons"
 
             android:layout_width="55sp"
 
             android:layout_width="55sp"
 
             android:layout_height="50sp"
 
             android:layout_height="50sp"
−
            android:contentDescription="Botón imaxe"
 
 
             android:onClick="onBotonImaxeClick"
 
             android:onClick="onBotonImaxeClick"
 
             android:scaleType="fitXY"
 
             android:scaleType="fitXY"
−
             android:src="@drawable/ok" >
+
             android:src="@drawable/ic_launcher_foreground" >
 
         </ImageButton>
 
         </ImageButton>
 
     </LinearLayout>
 
     </LinearLayout>
  
 
     <TextView
 
     <TextView
−
         android:id="@+id/tv_accion"
+
         android:id="@+id/txtTv_accion_UD02_01_Buttons"
 
         android:layout_width="wrap_content"
 
         android:layout_width="wrap_content"
 
         android:layout_height="wrap_content"
 
         android:layout_height="wrap_content"
−
         android:text="@string/texto_tv" />
+
         android:text="@string/texto_tv_string2" />
  
 
</LinearLayout>
 
</LinearLayout>
Línea 242: Línea 248:
  
 
*Para cada botón defínese un método que xestione o evento onClick.
 
*Para cada botón defínese un método que xestione o evento onClick.
−
*'''Deixamos para o participante no curso a definición no ficheiro /res/values/strings.xml da constante "@string/texto_tv" do último TextView. '''
+
*'''Deixamos para o participante no curso a definición no ficheiro /res/values/strings.xml da constante "@string/texto_tv_string2" do último TextView. ''' (podedes poñer calquera texto de exemplo).
 +
 
  
 
*Agora só queda definir os métodos en Java.
 
*Agora só queda definir os métodos en Java.
 
<syntaxhighlight lang="java" line highlight="29-32,34-40,42-45">
 
<syntaxhighlight lang="java" line highlight="29-32,34-40,42-45">
−
package com.example.u2_09_buttons;
+
package es.cursoandroid.cifprodolfoucha.aprendiendo.UI.Buttons;
  
 
import android.app.Activity;
 
import android.app.Activity;
 
import android.os.Bundle;
 
import android.os.Bundle;
−
import android.view.Menu;
 
 
import android.view.View;
 
import android.view.View;
 
import android.widget.Button;
 
import android.widget.Button;
Línea 257: Línea 263:
 
import android.widget.ToggleButton;
 
import android.widget.ToggleButton;
  
−
public class U2_09_Buttons extends Activity {
+
import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
−
private Button btnBoton;
+
 
−
private ToggleButton tbtnBoton2Estados;
+
public class UD02_01_Buttons extends Activity {
−
private ImageButton ibtnBotonImaxe;
+
 
−
private TextView tvAccions;
+
    private Button btnBoton;
 +
    private ToggleButton tbtnBoton2Estados;
 +
    private ImageButton ibtnBotonImaxe;
 +
    private TextView tvAccions;
 +
 
 +
    @Override
 +
    protected void onCreate(Bundle savedInstanceState) {
 +
        super.onCreate(savedInstanceState);
 +
        setContentView(R.layout.activity_ud02_01__buttons);
  
−
@Override
+
        btnBoton = (Button) findViewById(R.id.btnBoton_UD02_01_buttons);
−
protected void onCreate(Bundle savedInstanceState) {
+
        tbtnBoton2Estados = (ToggleButton) findViewById(R.id.tbtnDosEstados_UD02_01_buttons);
−
super.onCreate(savedInstanceState);
+
        ibtnBotonImaxe = (ImageButton) findViewById(R.id.ibtnImagen_UD02_01_buttons);
−
setContentView(R.layout.activity_u2_09__buttons);
+
        tvAccions = (TextView) findViewById(R.id.txtTv_accion_UD02_01_Buttons);
  
−
btnBoton = (Button) findViewById(R.id.btn_boton);
+
    }
−
tbtnBoton2Estados = (ToggleButton) findViewById(R.id.tbtn_boton_2estados);
 
−
ibtnBotonImaxe = (ImageButton) findViewById(R.id.ibtn_boton_imaxe);
 
−
tvAccions = (TextView) findViewById(R.id.tv_accion);
 
−
}
 
  
−
public void onBotonClick(View v) {
+
    public void onBotonClick(View v) {
−
tvAccions.setText("Premeches o primeiro botón\n");
+
        tvAccions.setText("Premeches o primeiro botón\n");
−
tvAccions.append("O texto do botón é: " + btnBoton.getText());
+
        tvAccions.append("O texto do botón é: " + btnBoton.getText());
−
}
+
    }
  
−
public void onBoton2EstadosClick(View v) {
+
    public void onBoton2EstadosClick(View v) {
−
tvAccions.setText("Premeches o segundo botón\n");
+
        tvAccions.setText("Premeches o segundo botón\n");
−
if (tbtnBoton2Estados.isChecked())
+
        if (tbtnBoton2Estados.isChecked())
−
tvAccions.append("O estado é: " + tbtnBoton2Estados.getTextOn());
+
            tvAccions.append("O estado é: " + tbtnBoton2Estados.getTextOn());
−
else
+
        else
−
tvAccions.append("O estado é: " + tbtnBoton2Estados.getTextOff());
+
            tvAccions.append("O estado é: " + tbtnBoton2Estados.getTextOff());
−
}
+
    }
  
−
public void onBotonImaxeClick(View v) {
+
    public void onBotonImaxeClick(View v) {
−
tvAccions.setText("Premeches o terceiro botón\n");
+
        tvAccions.setText("Premeches o terceiro botón\n");
−
tvAccions.append("O ancho é: " + ibtnBotonImaxe.getWidth());
+
        tvAccions.append("O ancho é: " + ibtnBotonImaxe.getWidth());
−
}
+
    }
  
−
@Override
 
−
public boolean onCreateOptionsMenu(Menu menu) {
 
−
// Inflate the menu; this adds items to the action bar if it is present.
 
−
getMenuInflater().inflate(R.menu.u2_09__buttons, menu);
 
−
return true;
 
−
}
 
  
 
}
 
}
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
 
*'''Liñas 13-16''': declaración de atributos.
 
*'''Liñas 13-16''': declaración de atributos.
Línea 455: Línea 460:
 
**Observar como se fai casting do obxecto recibido. Recíbese un obxecto de tipo View (vista) e precisamos convertelo á ToogleButton para acceder aos seus métodos específicos.
 
**Observar como se fai casting do obxecto recibido. Recíbese un obxecto de tipo View (vista) e precisamos convertelo á ToogleButton para acceder aos seus métodos específicos.
  
 +
 +
<br />
 
===Control de eventos usando un listener. Clase anónima===
 
===Control de eventos usando un listener. Clase anónima===
−
*Nesta ocasión imos crear un Listener para o primeiro botón. Co cal, hai que eliminar a propiedade '''android:onClick''' do XML do primeiro botón
 
−
 
−
 
−
*O ficheiro XML:
 
−
*Observar que no primeiro botón non se xestiona o evento onClick e que os outros dous botóns seguen mantendo a propiedade '''android:onClick'''.
 
−
<syntaxhighlight lang="xml" line highlight="12-17,23,33">
 
−
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
−
    xmlns:tools="http://schemas.android.com/tools"
 
−
    android:layout_width="match_parent"
 
−
    android:layout_height="match_parent"
 
−
    android:orientation="vertical" >
 
−
 
−
    <LinearLayout
 
−
        android:layout_width="match_parent"
 
−
        android:layout_height="wrap_content"
 
−
        android:orientation="horizontal" >
 
−
 
−
        <Button
 
−
            android:id="@+id/btn_boton"
 
−
            android:layout_width="150sp"
 
−
            android:layout_height="wrap_content"
 
−
            android:text="Preme aquí" >
 
−
        </Button>
 
−
 
−
        <ToggleButton
 
−
            android:id="@+id/tbtn_boton_2estados"
 
−
            android:layout_width="100dp"
 
−
            android:layout_height="match_parent"
 
−
            android:onClick="onBoton2EstadosClick"
 
−
            android:textOff="Apagado"
 
−
            android:textOn="Aceso" >
 
−
        </ToggleButton>
 
−
 
−
        <ImageButton
 
−
            android:id="@+id/ibtn_boton_imaxe"
 
−
            android:layout_width="55sp"
 
−
            android:layout_height="50sp"
 
−
            android:contentDescription="Botón imaxe"
 
−
            android:onClick="onBotonImaxeClick"
 
−
            android:scaleType="fitXY"
 
−
            android:src="@drawable/ok" >
 
−
        </ImageButton>
 
−
    </LinearLayout>
 
−
 
−
    <TextView
 
−
        android:id="@+id/tv_accion"
 
−
        android:layout_width="wrap_content"
 
−
        android:layout_height="wrap_content"
 
−
        android:text="@string/texto_tv" />
 
−
 
−
</LinearLayout>
 
−
</syntaxhighlight>
 
−
 
−
 
−
 
−
 
−
*Imos partir do código da primeira versión da ampliación.
 
−
*Comentaremos aquel código que afectaba ao primeiro botón e usaremos un Listener asociado ao primeiro botón.
 
−
<syntaxhighlight lang="java" line highlight="29-38">
 
−
package com.example.u2_09_buttons;
 
−
 
−
import android.app.Activity;
 
−
import android.os.Bundle;
 
−
import android.view.Menu;
 
−
import android.view.View;
 
−
import android.view.View.OnClickListener;
 
−
import android.widget.Button;
 
−
import android.widget.ImageButton;
 
−
import android.widget.TextView;
 
−
import android.widget.ToggleButton;
 
−
 
−
public class U2_09_Buttons extends Activity {
 
−
private Button btnBoton;
 
−
private ToggleButton tbtnBoton2Estados;
 
−
private ImageButton ibtnBotonImaxe;
 
−
private TextView tvAccions;
 
−
 
−
@Override
 
−
protected void onCreate(Bundle savedInstanceState) {
 
−
super.onCreate(savedInstanceState);
 
−
setContentView(R.layout.activity_u2_09__buttons);
 
−
 
−
btnBoton = (Button) findViewById(R.id.btn_boton);
 
−
tbtnBoton2Estados = (ToggleButton) findViewById(R.id.tbtn_boton_2estados);
 
−
ibtnBotonImaxe = (ImageButton) findViewById(R.id.ibtn_boton_imaxe);
 
−
tvAccions = (TextView) findViewById(R.id.tv_accion);
 
−
 
−
btnBoton.setOnClickListener(new OnClickListener() {
 
−
 
−
@Override
 
−
public void onClick(View v) {
 
−
// TODO Auto-generated method stub
 
−
tvAccions.setText("Premeches o primeiro botón\n");
 
−
tvAccions.append("O texto do botón é: " + btnBoton.getText());
 
−
}
 
−
 
−
});
 
−
 
−
}
 
−
 
−
/* public void onBotonClick(View v) {
 
−
tvAccions.setText("Premeches o primeiro botón\n");
 
−
tvAccions.append("O texto do botón é: " + btnBoton.getText());
 
−
}
 
−
*/
 
−
 
−
public void onBoton2EstadosClick(View v) {
 
−
tvAccions.setText("Premeches o segundo botón\n");
 
−
if (tbtnBoton2Estados.isChecked())
 
−
tvAccions.append("O estado é: " + tbtnBoton2Estados.getTextOn());
 
−
else
 
−
tvAccions.append("O estado é: " + tbtnBoton2Estados.getTextOff());
 
−
}
 
−
 
−
public void onBotonImaxeClick(View v) {
 
−
tvAccions.setText("Premeches o terceiro botón\n");
 
−
tvAccions.append("O ancho é: " + ibtnBotonImaxe.getWidth());
 
−
}
 
−
 
−
@Override
 
−
public boolean onCreateOptionsMenu(Menu menu) {
 
−
// Inflate the menu; this adds items to the action bar if it is present.
 
−
getMenuInflater().inflate(R.menu.u2_09__buttons, menu);
 
−
return true;
 
−
}
 
−
 
−
}
 
−
</syntaxhighlight>
 
−
*'''Liñas 29-38''': chamamos ao método '''setOnClickListener()''' do primeiro botón que se activará cando se fai click no botón.
 
−
** Creamos unha clase anónima asociada a interface OnClickListener e sobreescribimos o único método que ten: '''onClick'''.
 
−
 
  
−
*Como xa se dixo no anterior control (EditText), para coñecer o método asociado ao botón escribimos '''obxecto.setOn''', prememos '''CTRL+Barra espaciadora''' e xa nos auto completa.  
+
* Xa o vimos [http://wiki.cifprodolfoucha.es/index.php?title=PDM_Xesti%C3%B3n_de_Eventos na xestión de eventos]
−
*O mesmo facemos para a creación da clase anónima.
+
: Queda como tarefa para o alumno, implementar a xestión de eventos deste exercicio facendo uso das interfaces (lembrar quitalo do layout).
  
−
*Premer '''CTRL + Barra espaciadora'''
 
−
[[Image:Android_2013_U2_09_Buttons_08.jpg|600px]]
 
  
  
−
*Clase anónima co seu método.
 
−
[[Image:Android_2013_U2_09_Buttons_09.jpg]]
 
  
  
−
*Quedan presentados os '''listeners''' máis adiante afondaremos sobre eles.
 
  
  

Revisión del 09:13 6 oct 2018

Introdución

  • Os botóns (button) permiten ao usuario indicar á aplicación que realice unha acción.
  • Os botóns poden ter Texto, unha imaxe ou as dúas cousas:
  • Ben o texto ou a imaxe comunican claramente ao usuario cal é a función do botón.

00 button-types.png


  • Estes controles son subclases de:
    • Button de TextView
    • ToogleButton de CompoundButton
    • ImageButton de ImageView (que se verá proximamente)

00 Part of Android View Hierarchy.png



  • Observar como se definen os tres tipos de botóns anteriores:
  • Botón con texto:
1 <Button
2     android:layout_width="wrap_content"
3     android:layout_height="wrap_content"
4     android:text="@string/button_text"
5     ... />


  • Botón con imaxe
1 <ImageButton
2     android:layout_width="wrap_content"
3     android:layout_height="wrap_content"
4     android:src="@drawable/button_icon"
5     ... />


  • Botón con texto e imaxe. A propiedade android:drawableLeft indica onde se sitúa a imaxe.
1 <Button
2     android:layout_width="wrap_content"
3     android:layout_height="wrap_content"
4     android:text="@string/button_text"
5     android:drawableLeft="@drawable/button_icon"
6     ... />


  • Os botóns teñen unha propiedade android:onClick="oMeuMetodo" que nos permite chamar ao método indicado cando o pulsamos.
    • Ese método hai que declaralo en Java como public void oMeuMetodo (View v) { ... }
    • Recibe o obxecto View de quen o chamou.


  • Os botóns (Button) son subclases de TextView.


Botóns de 2 estados: ToggleButton/Switch

  • Existe outro tipo de botón de 2 estados (ON/OFF).
  • Un máis básico: <ToggleButton>

00 togglebutton.png

  • E outro máis avanzado (versión Android 4.0 ou superior): <Switch/>

00 switch.png

    • Permiten cambiar o seu estado desprazando co dun estado a outro. O funcionamento é semellante ao control ToogleButton.


  • Un obxecto ToogleButton/Switch herda da clase CompoundButton, quen, á súa vez, herda da clase Button.
  • Por tanto funcionan da mesma maneira, pero ademais o este tipo de botóns:
    • ten 2 estados (True/False), que pode podemos comprobar co método isChecked ()
    • Para cada estado podemos amosar un texto distinto no botón: android:TextOn e android:TextOFF.


Casos prácticos

Se non o temos creado antes, crea un paquete de nome UI como un subpaquete do teu paquete principal.
Dentro do paquete UI, crearemos un novo paquete de nome: Buttons.



  • Dentro do paquete Buttons crear unha nova 'Empty Activity' de nome: UD02_01_Buttons de tipo Launcher e sen compatibilidade.
Modifica o arquivo AndroidManifiest.xml e engade unha label á activity como xa vimos na creación do proxecto base.


  • Imos crear 3 botóns:
    • 1 Botón con texto
    • 1 ToogleButton
    • 1 botón con imaxe




Creación do layout

  • O layout XML ten 3 botóns e 1 TextView:
  • Observar como hai un layout dentro doutro: un dispón os elementos en vertical e o outro en horizontal.
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical" >
 7 
 8     <LinearLayout
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:orientation="horizontal" >
12 
13         <Button
14             android:id="@+id/btnBoton_UD02_01_buttons"
15             android:layout_width="150sp"
16             android:layout_height="wrap_content"
17             android:text="Preme aquí" >
18         </Button>
19 
20         <ToggleButton
21             android:id="@+id/tbtnDosEstados_UD02_01_buttons"
22             android:layout_width="100dp"
23             android:layout_height="match_parent"
24             android:textOff="Apagado"
25             android:textOn="Aceso" >
26         </ToggleButton>
27 
28         <ImageButton
29             android:id="@+id/ibtnImagen_UD02_01_buttons"
30             android:layout_width="55sp"
31             android:layout_height="50sp"
32             android:scaleType="fitXY"
33             android:src="@drawable/ic_launcher_foreground" >
34         </ImageButton>
35     </LinearLayout>
36 
37     <TextView
38         android:id="@+id/txtTv_accion_UD02_01_Buttons"
39         android:layout_width="wrap_content"
40         android:layout_height="wrap_content"
41         android:text="@string/texto_tv_string" />
42 
43 </LinearLayout>


  • Se cargamos este layout e non realizamos ningunha codificación en Java, non vai pasar nada cos botóns:
Isto é debido a que non temos codificado ningunha acción para cando se preme en cada un deles.



Eventos

  • Para asociar un evento a un botón, podemos facelo:
  • Asociando, como vimos na xestión de eventos, unha interface a cada botón e rexistrando o evento que queiramos controlar (nesta caso dun click).
  • No caso dos botón, podemos facelo no layout da activity.


  • Nesta ocasión imos ver dun xeito sinxelo como capturar os eventos dos botóns.
  • Un evento é algo que acontece nun control e que nos interesa capturar no sistema para desencadear (ou non) unha serie de accións.
  • Xa vimos no caso anterior (EditText) que podíamos controlar eventos que acontecen nos controis.



Control de eventos dende o layout

  • É a forma máis sinxela de desencadear unha acción.
  • Imos facelo de dúas formas:
    • Creando un método para cada Botón.
    • Creando un único método para tódolos botóns. Hai que controlar que botón foi o que se premeu.

Crear un método para cada botón

  • Observar a propiedade: android:onClick nos controis dos botóns.
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical" >
 7 
 8     <LinearLayout
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:orientation="horizontal" >
12 
13         <Button
14             android:id="@+id/btnBoton_UD02_01_buttons"
15             android:layout_width="150sp"
16             android:layout_height="wrap_content"
17             android:onClick="onBotonClick"
18             android:text="Preme aquí" >
19         </Button>
20 
21         <ToggleButton
22             android:id="@+id/tbtnDosEstados_UD02_01_buttons"
23             android:layout_width="100dp"
24             android:layout_height="match_parent"
25             android:onClick="onBoton2EstadosClick"
26             android:textOff="Apagado"
27             android:textOn="Aceso" >
28         </ToggleButton>
29 
30         <ImageButton
31             android:id="@+id/ibtnImagen_UD02_01_buttons"
32             android:layout_width="55sp"
33             android:layout_height="50sp"
34             android:onClick="onBotonImaxeClick"
35             android:scaleType="fitXY"
36             android:src="@drawable/ic_launcher_foreground" >
37         </ImageButton>
38     </LinearLayout>
39 
40     <TextView
41         android:id="@+id/txtTv_accion_UD02_01_Buttons"
42         android:layout_width="wrap_content"
43         android:layout_height="wrap_content"
44         android:text="@string/texto_tv_string2" />
45 
46 </LinearLayout>
  • Para cada botón defínese un método que xestione o evento onClick.
  • Deixamos para o participante no curso a definición no ficheiro /res/values/strings.xml da constante "@string/texto_tv_string2" do último TextView. (podedes poñer calquera texto de exemplo).


  • Agora só queda definir os métodos en Java.
 1 package es.cursoandroid.cifprodolfoucha.aprendiendo.UI.Buttons;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.widget.Button;
 7 import android.widget.ImageButton;
 8 import android.widget.TextView;
 9 import android.widget.ToggleButton;
10 
11 import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
12 
13 public class UD02_01_Buttons extends Activity {
14 
15     private Button btnBoton;
16     private ToggleButton tbtnBoton2Estados;
17     private ImageButton ibtnBotonImaxe;
18     private TextView tvAccions;
19 
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.activity_ud02_01__buttons);
24 
25         btnBoton = (Button) findViewById(R.id.btnBoton_UD02_01_buttons);
26         tbtnBoton2Estados = (ToggleButton) findViewById(R.id.tbtnDosEstados_UD02_01_buttons);
27         ibtnBotonImaxe = (ImageButton) findViewById(R.id.ibtnImagen_UD02_01_buttons);
28         tvAccions = (TextView) findViewById(R.id.txtTv_accion_UD02_01_Buttons);
29 
30     }
31 
32     public void onBotonClick(View v) {
33         tvAccions.setText("Premeches o primeiro botón\n");
34         tvAccions.append("O texto do botón é: " + btnBoton.getText());
35     }
36 
37     public void onBoton2EstadosClick(View v) {
38         tvAccions.setText("Premeches o segundo botón\n");
39         if (tbtnBoton2Estados.isChecked())
40             tvAccions.append("O estado é: " + tbtnBoton2Estados.getTextOn());
41         else
42             tvAccions.append("O estado é: " + tbtnBoton2Estados.getTextOff());
43     }
44 
45     public void onBotonImaxeClick(View v) {
46         tvAccions.setText("Premeches o terceiro botón\n");
47         tvAccions.append("O ancho é: " + ibtnBotonImaxe.getWidth());
48     }
49 
50 
51 }
  • Liñas 13-16: declaración de atributos.
  • Liñas 23-26: asignación de valores aos atributos mediante a clase R.
  • Liñas 29-32: Define o método asociado ao evento android:onClick do primeiro botón. "\n" introduce un salto de liña.
  • Liñas 34-40: Define o método asociado ao evento android:onClick do botón ToggleButton. Comprobamos se está activado o non.
  • Liñas 42-45: Define o método asociado ao evento android:onClick do botón con Imaxe.
  • Lanzar a aplicación e comprobar que sucede ao premer os botóns.

Crear un único método para tódolos botóns

  • Hai que modificar o XML para que as propiedades android:onClick de tódolos botóns chamen ao mesmo método.
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7     <LinearLayout
 8         android:layout_width="match_parent"
 9         android:layout_height="wrap_content"
10         android:orientation="horizontal" >
11 
12         <Button
13             android:id="@+id/btn_boton"
14             android:layout_width="150sp"
15             android:layout_height="wrap_content"
16             android:onClick="onBotonClick"
17             android:text="Preme aquí" >
18         </Button>
19 
20         <ToggleButton
21             android:id="@+id/tbtn_boton_2estados"
22             android:layout_width="100dp"
23             android:layout_height="match_parent"
24             android:onClick="onBotonClick"
25             android:textOff="Apagado"
26             android:textOn="Aceso" >
27         </ToggleButton>
28 
29         <ImageButton
30             android:id="@+id/ibtn_boton_imaxe"
31             android:layout_width="55sp"
32             android:layout_height="50sp"
33             android:contentDescription="Botón imaxe"
34             android:onClick="onBotonClick"
35             android:scaleType="fitXY"
36             android:src="@drawable/ok" >
37         </ImageButton>
38     </LinearLayout>
39 
40     <TextView
41         android:id="@+id/tv_accion"
42         android:layout_width="wrap_content"
43         android:layout_height="wrap_content"
44         android:text="@string/texto_tv" />
45 
46 </LinearLayout>



  • A definición do método:
 1 package com.example.u2_09_buttons;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.Menu;
 6 import android.view.View;
 7 import android.view.View.OnClickListener;
 8 import android.widget.Button;
 9 import android.widget.ImageButton;
10 import android.widget.TextView;
11 import android.widget.ToggleButton;
12 
13 public class U2_09_Buttons extends Activity {
14 	// private Button btnBoton;
15 	// private ToggleButton tbtnBoton2Estados;
16 	// private ImageButton ibtnBotonImaxe;
17 	private TextView tvAccions;
18 
19 	@Override
20 	protected void onCreate(Bundle savedInstanceState) {
21 		super.onCreate(savedInstanceState);
22 		setContentView(R.layout.activity_u2_09__buttons);
23 
24 		tvAccions = (TextView) findViewById(R.id.tv_accion);
25 
26 	}
27 
28 	public void onBotonClick(View vista) {
29 
30 		switch (vista.getId()) {
31 		case R.id.btn_boton:
32 			tvAccions.setText("Premeches o primeiro botón\n");
33 			tvAccions.append("O texto do botón é: "
34 					+ ((Button) vista).getText());
35 			break;
36 
37 		case R.id.tbtn_boton_2estados:
38 			tvAccions.setText("Premeches o segundo botón\n");
39 			if (((ToggleButton) vista).isChecked())
40 				tvAccions.append("O estado é: "
41 						+ ((ToggleButton) vista).getTextOn());
42 			else
43 				tvAccions.append("O estado é: "
44 						+ ((ToggleButton) vista).getTextOff());
45 			break;
46 
47 		case R.id.ibtn_boton_imaxe:
48 			tvAccions.setText("Premeches o terceiro botón\n");
49 		        tvAccions.append("O ancho é: " + ((ImageButton) vista).getWidth()); 
50 		}
51 	}
52 
53 	/*public void onBotonClick(View v) {
54 		tvAccions.setText("Premeches o primeiro botón\n");
55 		tvAccions.append("O texto do botón é: " + btnBoton.getText());
56 	}*/
57 
58 	
59 	/*
60 	   public void onBoton2EstadosClick(View v) {
61 	   tvAccions.setText("Premeches o segundo botón\n"); if
62 	   (tbtnBoton2Estados.isChecked()) tvAccions.append("O estado é: " +
63 	   tbtnBoton2Estados.getTextOn()); else tvAccions.append("O estado é: " +
64 	   tbtnBoton2Estados.getTextOff()); }
65 	 */
66 
67 	
68 	/*
69 	   public void onBotonImaxeClick(View v) {
70 	   tvAccions.setText("Premeches o terceiro botón\n");
71 	   tvAccions.append("O ancho é: " + ibtnBotonImaxe.getWidth()); }
72 	 */
73 
74 	@Override
75 	public boolean onCreateOptionsMenu(Menu menu) {
76 		// Inflate the menu; this adds items to the action bar if it is present.
77 		getMenuInflater().inflate(R.menu.u2_09__buttons, menu);
78 		return true;
79 	}
80 
81 }
  • Liñas 28-51:
    • Na chamada ao método recibimos como parámetro unha View (vista) que apunta ao obxecto que o chamou.
    • Collendo o ID da vista, podemos saber que botón foi o que iniciou o evento.
    • Con switch - case, en función do botón que lanzou o evento executamos o código correspondente.
  • Liñas 39, 41 e 43:
    • Observar como se fai casting do obxecto recibido. Recíbese un obxecto de tipo View (vista) e precisamos convertelo á ToogleButton para acceder aos seus métodos específicos.



Control de eventos usando un listener. Clase anónima

Queda como tarefa para o alumno, implementar a xestión de eventos deste exercicio facendo uso das interfaces (lembrar quitalo do layout).






-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).