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

De MediaWiki
Ir a la navegación Ir a la búsqueda
 
(No se muestran 8 ediciones intermedias de 2 usuarios)
Línea 193: Línea 193:
 
<br />
 
<br />
  
==Eventos==
+
==Métodos mínimos a coñecer no manexo dos Button´s e variantes==
  
* Para asociar un evento a un botón, podemos facelo:
+
===Todos os Buttons: Button, FloatActionButton, ToogleButton, Switch===
:* 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).
+
:* Referenciar a un button có método findViewById.
:* '''No caso dos botón, podemos facelo no layout da activity'''.
+
:* Recuperar o contido do texto.
 +
:* Cambiar o contido do texto, podendo empregar recursos gardados en /res/values.
 +
:* Modificar propiedades básicas, como cor, tamaño, visibilidade,...(e os métodos getZZZZZ para obter os seus valores)
  
  
* Tamén podemos xestionar o evento de cando cambie o seu estado (cando cambia de on/off) coa chamada ao [https://developer.android.com/reference/android/widget/CompoundButton.html#setOnCheckedChangeListener(android.widget.CompoundButton.OnCheckedChangeListener) método setOnCheckedChangeListener(OnCheckedChangeListener)]. A diferenza con respecto á anterior é que soamente se chamará cando cambiamos de estado, mentres que se o facemos como no caso dos botóns, coa Interface OnClickListener, o chamará sempre que o prememos.
+
: Exemplos cun Button, pero aplicables a calquera tipo de Button:
 +
::<syntaxhighlight lang="java" enclose="div" highlight="">
 +
        Button btn = findViewById(R.id.btnBoton);            // Referenciamos a un botón que estea no Layout da Activity
 +
        String cadeaet = btn.getText().toString();          // Fixarse que getText() devolve un obxecto Editable, non un String.
 +
        btn.setText("Cambiamos o texto directamente");      // Cambiamos o contido por unha cadea concreta
 +
        String textoRes = getResources().getString(R.string.app_name);
 +
        btn.setText(textoRes + " texto que ven da BD");      // Se queremos concatenar texto dunha base de datos cun texto que poida ser traducido
  
 +
        btn.setTextSize(20);                                // Axustar tamaño do texto
  
*Nesta ocasión imos ver dun xeito sinxelo como capturar os eventos dos botóns.  
+
        btn.setTextColor(Color.BLUE);                        // Cambia a cor
*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.
 
  
 +
        btn.setVisibility(View.VISIBLE);                    // As constantes aparecen no Android Studio ao teclear. GONE fai que non ocupe espazo no Layout.
  
  
<br />
+
</syntaxhighlight>  
===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.
 
<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"
 
    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/btnBoton_UD02_01_buttons"
 
            android:layout_width="150sp"
 
            android:layout_height="wrap_content"
 
            android:onClick="onBotonClick"
 
            android:text="Preme aquí" >
 
        </Button>
 
 
 
        <ToggleButton
 
            android:id="@+id/tbtnDosEstados_UD02_01_buttons"
 
            android:layout_width="100dp"
 
            android:layout_height="match_parent"
 
            android:onClick="onBoton2EstadosClick"
 
            android:textOff="Apagado"
 
            android:textOn="Aceso" >
 
        </ToggleButton>
 
 
 
        <ImageButton
 
            android:id="@+id/ibtnImagen_UD02_01_buttons"
 
            android:layout_width="55sp"
 
            android:layout_height="50sp"
 
            android:onClick="onBotonImaxeClick"
 
            android:scaleType="fitXY"
 
            android:src="@drawable/ic_launcher_foreground" >
 
        </ImageButton>
 
    </LinearLayout>
 
 
 
    <TextView
 
        android:id="@+id/txtTv_accion_UD02_01_Buttons"
 
        android:layout_width="wrap_content"
 
        android:layout_height="wrap_content"
 
        android:text="@string/texto_tv_string2" />
 
 
 
</LinearLayout>
 
</syntaxhighlight>
 
 
 
*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.
 
<syntaxhighlight lang="java" line highlight="15-18,25-28,32-35,37-43,45-48">
 
package es.cursoandroid.cifprodolfoucha.aprendiendo.UI.Buttons;
 
 
 
import android.app.Activity;
 
import android.os.Bundle;
 
import android.view.View;
 
import android.widget.Button;
 
import android.widget.ImageButton;
 
import android.widget.TextView;
 
import android.widget.ToggleButton;
 
 
 
import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
 
 
 
public class UD02_01_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_ud02_01__buttons);
 
 
 
        btnBoton = (Button) findViewById(R.id.btnBoton_UD02_01_buttons);
 
        tbtnBoton2Estados = (ToggleButton) findViewById(R.id.tbtnDosEstados_UD02_01_buttons);
 
        ibtnBotonImaxe = (ImageButton) findViewById(R.id.ibtnImagen_UD02_01_buttons);
 
        tvAccions = (TextView) findViewById(R.id.txtTv_accion_UD02_01_Buttons);
 
 
 
    }
 
 
 
    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());
 
    }
 
 
 
 
 
}
 
 
 
</syntaxhighlight>
 
*'''Liñas 15-18''': declaración de atributos.
 
*'''Liñas 25-28''': asignación de valores aos atributos mediante a clase R.
 
*'''Liñas 32-35''': Define o método asociado ao evento android:onClick do primeiro botón. "\n" introduce un salto de liña.
 
*'''Liñas 37-43''': Define o método asociado ao evento android:onClick do botón ToggleButton. Comprobamos se está activado o non.
 
*'''Liñas 45-48''': 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.
 
  
  
 
<br />
 
<br />
====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.
+
===Switch - ToogleButton===
<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"
 
    xmlns:tools="http://schemas.android.com/tools"
 
    android:layout_width="match_parent"
 
    android:layout_height="match_parent"
 
    android:orientation="vertical" >
 
  
    <LinearLayout
+
:* Obter o estado do botón (ON / OFF).
        android:layout_width="match_parent"
+
:* Cambiar o estado do botón (ON / OFF)
        android:layout_height="wrap_content"
+
:* Cambiar o texto do SwitchButton
        android:orientation="horizontal" >
 
  
        <Button
+
::<syntaxhighlight lang="java" enclose="div" highlight="">
            android:id="@+id/btnBoton_UD02_01_buttons"
+
         ToggleButton tbtn = findViewById(R.id.tbtnToogleBoton);                         // Referenciamos a un botón que estea no Layout da Activity
            android:layout_width="150sp"
+
         Toast.makeText(this,String.valueOf(tbtn.isChecked()),Toast.LENGTH_LONG).show(); // isChecked() devolve true/false
            android:layout_height="wrap_content"
 
            android:onClick="onBotonClick"
 
            android:text="Preme aquí" >
 
        </Button>
 
 
 
        <ToggleButton
 
            android:id="@+id/tbtnDosEstados_UD02_01_buttons"
 
            android:layout_width="100dp"
 
            android:layout_height="match_parent"
 
            android:onClick="onBotonClick"
 
            android:textOff="Apagado"
 
            android:textOn="Aceso" >
 
        </ToggleButton>
 
 
 
        <ImageButton
 
            android:id="@+id/ibtnImagen_UD02_01_buttons"
 
            android:layout_width="55sp"
 
            android:layout_height="50sp"
 
            android:onClick="onBotonClick"
 
            android:scaleType="fitXY"
 
            android:src="@drawable/ic_launcher_foreground" >
 
        </ImageButton>
 
    </LinearLayout>
 
 
 
    <TextView
 
        android:id="@+id/txtTv_accion_UD02_01_Buttons"
 
        android:layout_width="wrap_content"
 
        android:layout_height="wrap_content"
 
        android:text="@string/texto_tv_string" />
 
 
 
</LinearLayout>
 
</syntaxhighlight>
 
 
 
 
 
 
 
 
 
*A definición do método:
 
<syntaxhighlight lang="java" line highlight="22-45">
 
package es.cursoandroid.cifprodolfoucha.aprendiendo.UI.Buttons;
 
 
 
import android.app.Activity;
 
import android.os.Bundle;
 
import android.view.View;
 
import android.widget.Button;
 
import android.widget.ImageButton;
 
import android.widget.TextView;
 
import android.widget.ToggleButton;
 
 
 
import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
 
 
 
public class UD02_01_Buttons extends Activity {
 
 
 
    /*
 
    private Button btnBoton;
 
    private ToggleButton tbtnBoton2Estados;
 
    private ImageButton ibtnBotonImaxe;
 
    */
 
    private TextView tvAccions;
 
 
 
    public void onBotonClick(View vista) {
 
 
 
        switch (vista.getId()) {
 
            case R.id.btnBoton_UD02_01_buttons:
 
                tvAccions.setText("Premeches o primeiro botón\n");
 
                tvAccions.append("O texto do botón é: "
 
                        + ((Button) vista).getText());
 
                break;
 
 
 
            case R.id.tbtnDosEstados_UD02_01_buttons:
 
                tvAccions.setText("Premeches o segundo botón\n");
 
                if (((ToggleButton) vista).isChecked())
 
                    tvAccions.append("O estado é: "
 
                            + ((ToggleButton) vista).getTextOn());
 
                else
 
                    tvAccions.append("O estado é: "
 
                            + ((ToggleButton) vista).getTextOff());
 
                break;
 
 
 
            case R.id.ibtnImagen_UD02_01_buttons:
 
                tvAccions.setText("Premeches o terceiro botón\n");
 
                tvAccions.append("O ancho é: " + ((ImageButton) vista).getWidth());
 
         }
 
    }
 
 
 
 
 
    @Override
 
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.activity_ud02_01__buttons);
 
 
 
        tvAccions = (TextView) findViewById(R.id.txtTv_accion_UD02_01_Buttons);
 
        /*
 
        btnBoton = (Button) findViewById(R.id.btnBoton_UD02_01_buttons);
 
        tbtnBoton2Estados = (ToggleButton) findViewById(R.id.tbtnDosEstados_UD02_01_buttons);
 
        ibtnBotonImaxe = (ImageButton) findViewById(R.id.ibtnImagen_UD02_01_buttons);
 
        */
 
 
 
    }
 
 
 
    /*
 
    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());
 
    }
 
 
 
    */
 
}
 
</syntaxhighlight>
 
*'''Liñas 22-45''':
 
**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 33, 35 e 38''':
 
**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===
+
        tbtn.setChecked(true);                                      // Cambiamos o estado por programación
  
* Xa o vimos [http://wiki.cifprodolfoucha.es/index.php?title=PDM_Xesti%C3%B3n_de_Eventos na xestión de eventos] que podemos xestionar os eventos facendo uso dunha clase anónima que implemente a interface ou implementar a interface na Activity.
+
        tbtn.setText("NOVO TEXTO TOGGLE");                          // Cambiamos o texto
  
: Queda como tarefa para o alumno, implementar a xestión de eventos deste exercicio facendo uso das interfaces (lembrar quitalo do layout).
 
  
 +
</syntaxhighlight>
  
* <u>Lembrar que esta será a forma obrigatoria de facelo</u>.
+
: Para o Switch é exactamente igual.
 +
::<syntaxhighlight lang="java" enclose="div" highlight="">
 +
        Switch sw = findViewById(R.id.swbSwitchButton);                                        // Referenciamos a un botón que estea no Layout da Activity
 +
        Toast.makeText(this,String.valueOf(sw.isChecked()),Toast.LENGTH_LONG).show();          // isChecked() devolve true/false
  
 +
        sw.setChecked(true);                                                                    // Cambiamos o estado por programación
  
 +
        sw.setText("NOVO TEXTO SWITCH");                                                        // Novo texto do switch
  
  
 +
</syntaxhighlight>
  
  
  
 
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] e [[Usuario:Carrion|Carlos Carrión Álvarez]] -- (2015).
 
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] e [[Usuario:Carrion|Carlos Carrión Álvarez]] -- (2015).

Revisión actual del 11:17 15 nov 2020

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.
Para que o texto apareza debe cambiarse a propiedade showText a true. A nivel de deseño non se recomenda o emprego do texto se estamos empregando un Material Theme.


Casos prácticos

Lembrar que se estades a empregar as bibliotecas de compatibilidade (por defecto), a vosa activity derivará de AppCompactActivity e non de Activity
Nos exemplos seguintes toda activity deriva de Activity, pero o normal é que empregedes AppCompactActivity (coidado ao copiar os exemplos).


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.



Empregando gráficos SVG cun ImageButton

  • Se queremos empregar gráficos vectoriais podemos 'cargalos' no noso proxecto coa ferramenta Vector Asset:



Métodos mínimos a coñecer no manexo dos Button´s e variantes

Todos os Buttons: Button, FloatActionButton, ToogleButton, Switch

  • Referenciar a un button có método findViewById.
  • Recuperar o contido do texto.
  • Cambiar o contido do texto, podendo empregar recursos gardados en /res/values.
  • Modificar propiedades básicas, como cor, tamaño, visibilidade,...(e os métodos getZZZZZ para obter os seus valores)


Exemplos cun Button, pero aplicables a calquera tipo de Button:
        Button btn = findViewById(R.id.btnBoton);            // Referenciamos a un botón que estea no Layout da Activity
        String cadeaet = btn.getText().toString();           // Fixarse que getText() devolve un obxecto Editable, non un String.
        btn.setText("Cambiamos o texto directamente");       // Cambiamos o contido por unha cadea concreta
        String textoRes = getResources().getString(R.string.app_name);
        btn.setText(textoRes + " texto que ven da BD");      // Se queremos concatenar texto dunha base de datos cun texto que poida ser traducido

        btn.setTextSize(20);                                 // Axustar tamaño do texto

        btn.setTextColor(Color.BLUE);                        // Cambia a cor

        btn.setVisibility(View.VISIBLE);                     // As constantes aparecen no Android Studio ao teclear. GONE fai que non ocupe espazo no Layout.



Switch - ToogleButton

  • Obter o estado do botón (ON / OFF).
  • Cambiar o estado do botón (ON / OFF)
  • Cambiar o texto do SwitchButton
        ToggleButton tbtn = findViewById(R.id.tbtnToogleBoton);                          // Referenciamos a un botón que estea no Layout da Activity
        Toast.makeText(this,String.valueOf(tbtn.isChecked()),Toast.LENGTH_LONG).show();  // isChecked() devolve true/false

        tbtn.setChecked(true);                                      // Cambiamos o estado por programación

        tbtn.setText("NOVO TEXTO TOGGLE");                          // Cambiamos o texto
Para o Switch é exactamente igual.
        Switch sw = findViewById(R.id.swbSwitchButton);                                         // Referenciamos a un botón que estea no Layout da Activity
        Toast.makeText(this,String.valueOf(sw.isChecked()),Toast.LENGTH_LONG).show();           // isChecked() devolve true/false

        sw.setChecked(true);                                                                    // Cambiamos o estado por programación

        sw.setText("NOVO TEXTO SWITCH");                                                        // Novo texto do switch



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