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 19 ediciones intermedias de 2 usuarios)
Línea 79: Línea 79:
 
**ten 2 estados (True/False), que pode podemos comprobar co método '''isChecked ()'''
 
**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 cada estado podemos amosar un texto distinto no botón: '''android:TextOn''' e '''android:TextOFF'''.
 +
::'''Para que o texto apareza debe cambiarse a propiedade <u>showText</u>''' a true. A nivel de deseño non se recomenda o emprego do texto se estamos empregando un Material Theme.
  
  
Línea 87: Línea 88:
  
 
==Casos prácticos==
 
==Casos prácticos==
−
*Como sempre creamos un novo proxecto:'''U2_09_Buttons'''  
+
 
 +
* Partimos que xa temos creado o proxecto inicial como [http://wiki.cifprodolfoucha.es/index.php?title=PDM_Creando_proxecto_base xa indicamos anteriormente].
 +
: <u>Lembrar que se estades a empregar as bibliotecas de compatibilidade (por defecto), '''a vosa activity derivará de AppCompactActivity''' e non de Activity</u>
 +
: 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'''.
 +
 
 +
 
 +
<br />
 +
* 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 [http://wiki.cifprodolfoucha.es/index.php?title=PDM_Creando_proxecto_base xa vimos na creación do proxecto base].
 +
 
 +
  
 
*Imos crear 3 botóns:
 
*Imos crear 3 botóns:
Línea 96: Línea 111:
  
 
<gallery caption="Tres botóns" widths="350" heights="300px" perrow="2">
 
<gallery caption="Tres botóns" widths="350" heights="300px" perrow="2">
−
Image:Android_2013_U2_09_Buttons_10.jpg| Cando entremos na aplicación este será o seu estado.
+
Image:PDM_botons_2.jpg| Cando entremos na aplicación este será o seu estado.
−
Image:Android_2013_U2_09_Buttons_11.jpg| Se prememos o primeiro botón (Texto) amosarase un texto en pantalla.
+
Image:PDM_botons_1.jpg| Se prememos o primeiro botón (Texto) amosarase un texto en pantalla.
−
Image:Android_2013_U2_09_Buttons_12.jpg| Se prememos o segundo botón (ToogleButton) amosarase outro texto en pantalla e o botón cambiará o seu estado e o texto do mesmo.
+
Image:PDM_botons_3.jpg| Se prememos o segundo botón (ToogleButton) amosarase outro texto en pantalla e o botón cambiará o seu estado e o texto do mesmo.
−
Image:Android_2013_U2_09_Buttons_14.jpg| Se o volvemos pulsar amosa outro texto e volve cambiar o estado.
+
Image:PDM_botons_4.jpg| Se o volvemos pulsar amosa outro texto e volve cambiar o estado.
−
Image:Android_2013_U2_09_Buttons_15.jpg| Se prememos o terceiro botón (Imaxe) amosarase de novo un texto diferente.
+
Image:PDM_botons_5.jpg| Se prememos o terceiro botón (Imaxe) amosarase de novo un texto diferente.
 
</gallery>
 
</gallery>
  
  
  
−
 
+
<br />
−
===Importar unha imaxe como recurso===
 
−
*Para poder asignar unha imaxe a un botón esta debe estar no cartafol '''/res/drawable'''
 
−
 
 
−
<gallery caption="Importar unha imaxe" widths="350" heights="300px" perrow="2">
 
−
Image:ok.png| Descargamos a imaxe superior ou collemos outra icona calquera. O nome da imaxe só pode ter letras e números e nada máis, nin guións. O nome debe estar en minúscula. Ollo que cando se baixa este icono ten o nome comezando por maiúsculas.
 
−
Image:Android_2013_U2_09_Buttons_01.jpg| Dentro de /res/values/ creamos o cartafol '''drawable''' e '''Importamos ...'''
 
−
Image:Android_2013_U2_09_Buttons_02.jpg| Dende o sistema de ficheiros.
 
−
Image:Android_2013_U2_09_Buttons_03.jpg| Indicamos o cartafol que contén as imaxes e seleccionamos as que desexamos importar para o proxecto.
 
−
Image:Android_2013_U2_09_Buttons_04.jpg| Neste caso cópiase ao proxecto. Lembrar cambiar o nome a minúsculas, se este este contén maiúsculas.
 
−
</gallery>
 
−
 
 
−
*Todo o anterior pode realizarse arrastrando a imaxe dende a súa localización ao IDE, ao cartafol desexado do proxecto dentro do IDE.
 
−
 
 
 
===Creación do layout===
 
===Creación do layout===
 
*O layout XML ten 3 botóns e 1 TextView:
 
*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.
 
*Observar como hai un layout dentro doutro: un dispón os elementos en vertical e o outro en horizontal.
  
−
<syntaxhighlight lang="xml" line highlight="7,23,24,32,34">
+
<syntaxhighlight lang="xml" line highlight="13,20,24,25,28,33">
 +
<?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 136: Línea 139:
  
 
         <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 143: Línea 146:
  
 
         <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 151: Línea 154:
  
 
         <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:scaleType="fitXY"
 
             android:scaleType="fitXY"
−
             android:src="@drawable/ok" >
+
             android:src="@drawable/ic_launcher_foreground" >
 
         </ImageButton>
 
         </ImageButton>
 
     </LinearLayout>
 
     </LinearLayout>
  
 
     <TextView
 
     <TextView
 +
        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_string" />
  
 
</LinearLayout>
 
</LinearLayout>
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
*Se cargamos este layout e non realizamos ningunha codificación en Java, non vai pasar nada cos botóns:  
 
*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.
  
−
<gallery caption="Botóns inoperativos" widths="350" heights="300px" perrow="2">
 
−
Image:Android_2013_U2_09_Buttons_05.jpg| Prememos no primeiro e non fai nada.
 
−
Image:Android_2013_U2_09_Buttons_06.jpg| Se prememos no segundo só cambia o seu estado, pero tampouco fai nada.
 
−
Image:Android_2013_U2_09_Buttons_07.jpg| O mesmo pasa co terceiro botón.
 
−
</gallery>
 
  
−
==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.
 
−
*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 />
 +
===Empregando gráficos SVG cun ImageButton===
  
 +
* Se queremos empregar gráficos vectoriais podemos 'cargalos' no noso proxecto coa ferramenta Vector Asset:
 +
<gallery caption="Empregando gráficos svg" widths="350" heights="300px" perrow="2">
 +
Image:PDM_Vector_Assets_1.jpg| Lanzamos a ferramenta Vector Asset
 +
Image:PDM_Vector_Assets_2.jpg| Escollemos o arquivo svg descargado. Indicamos o tamaño do gráfico en dp´s e o nome do mesmo.
 +
Image:PDM_Vector_Assets_3.jpg| Indica onde vai a gardar o gráfico e con que arquivo (fixarse que xera un arquivo XML).
 +
Image:PDM_Vector_Assets_4.jpg| O arquivo XML xerado no cartafol drawable.
 +
Image:PDM_Vector_Assets_5.jpg| Un ImageButton coa icona asociada.
 +
</gallery>
  
−
===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="16,24,34">
 
−
<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:onClick="onBotonClick"
 
−
            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>
 
−
 
−
*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. '''
 
−
 
−
*Agora só queda definir os métodos en Java.
 
−
<syntaxhighlight lang="java" line highlight="29-32,34-40,42-45">
 
−
package com.example.u2_09_buttons;
 
−
 
−
import android.app.Activity;
 
−
import android.os.Bundle;
 
−
import android.view.Menu;
 
−
import android.view.View;
 
−
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);
 
−
}
 
−
 
−
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 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.
 
−
<syntaxhighlight lang="xml" line highlight="16,24,34">
 
−
<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:onClick="onBotonClick"
 
−
            android:text="Preme aquí" >
 
−
        </Button>
 
−
 
−
        <ToggleButton
 
−
            android:id="@+id/tbtn_boton_2estados"
 
−
            android:layout_width="100dp"
 
−
            android:layout_height="match_parent"
 
−
            android:onClick="onBotonClick"
 
−
            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="onBotonClick"
 
−
            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>
 
−
 
−
 
−
 
−
 
−
*A definición do método:
 
−
<syntaxhighlight lang="java" line highlight="28-51">
 
−
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);
 
−
 
−
tvAccions = (TextView) findViewById(R.id.tv_accion);
 
−
 
−
}
 
−
 
−
public void onBotonClick(View vista) {
 
−
 
−
switch (vista.getId()) {
 
−
case R.id.btn_boton:
 
−
tvAccions.setText("Premeches o primeiro botón\n");
 
−
tvAccions.append("O texto do botón é: "
 
−
+ ((Button) vista).getText());
 
−
break;
 
−
 
−
case R.id.tbtn_boton_2estados:
 
−
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.ibtn_boton_imaxe:
 
−
tvAccions.setText("Premeches o terceiro botón\n");
 
−
        tvAccions.append("O ancho é: " + ((ImageButton) vista).getWidth());
 
−
}
 
−
}
 
−
 
−
/*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 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===
 
−
*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
+
<br />
−
            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
+
==Métodos mínimos a coñecer no manexo dos Button´s e variantes==
−
        android:id="@+id/tv_accion"
 
−
        android:layout_width="wrap_content"
 
−
        android:layout_height="wrap_content"
 
−
        android:text="@string/texto_tv" />
 
  
−
</LinearLayout>
+
===Todos os Buttons: Button, FloatActionButton, ToogleButton, Switch===
−
</syntaxhighlight>
+
:* 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:
 +
::<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
  
−
*Imos partir do código da primeira versión da ampliación.
+
        btn.setTextColor(Color.BLUE);                       // Cambia a cor
−
*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;
+
        btn.setVisibility(View.VISIBLE);                     // As constantes aparecen no Android Studio ao teclear. GONE fai que non ocupe espazo no Layout.
−
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
+
</syntaxhighlight>
−
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
+
<br />
−
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) {
+
===Switch - ToogleButton===
−
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) {
+
:* Obter o estado do botón (ON / OFF).
−
tvAccions.setText("Premeches o terceiro botón\n");
+
:* Cambiar o estado do botón (ON / OFF)
−
tvAccions.append("O ancho é: " + ibtnBotonImaxe.getWidth());
+
:* Cambiar o texto do SwitchButton
−
}
 
  
−
@Override
+
::<syntaxhighlight lang="java" enclose="div" highlight="">
−
public boolean onCreateOptionsMenu(Menu menu) {
+
        ToggleButton tbtn = findViewById(R.id.tbtnToogleBoton);                          // Referenciamos a un botón que estea no Layout da Activity
−
// Inflate the menu; this adds items to the action bar if it is present.
+
        Toast.makeText(this,String.valueOf(tbtn.isChecked()),Toast.LENGTH_LONG).show(); // isChecked() devolve true/false
−
getMenuInflater().inflate(R.menu.u2_09__buttons, menu);
 
−
return true;
 
−
}
 
  
−
}
+
        tbtn.setChecked(true);                                      // Cambiamos o estado por programación
−
</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'''.
 
  
 +
        tbtn.setText("NOVO TEXTO TOGGLE");                          // Cambiamos o texto
  
−
*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.
 
−
*O mesmo facemos para a creación da clase anónima.
 
  
−
*Premer '''CTRL + Barra espaciadora'''
+
</syntaxhighlight>
−
[[Image:Android_2013_U2_09_Buttons_08.jpg|600px]]
 
  
 +
: 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
  
−
*Clase anónima co seu método.
+
        sw.setChecked(true);                                                                    // Cambiamos o estado por programación
−
[[Image:Android_2013_U2_09_Buttons_09.jpg]]
 
  
 +
        sw.setText("NOVO TEXTO SWITCH");                                                        // Novo texto do switch
  
−
*Quedan presentados os '''listeners''' máis adiante afondaremos sobre eles.
 
  
 +
</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).