Diferencia entre revisiones de «RadioButton»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 192: Línea 192:
 
*Observar como '''RadioGroup''' é un layout máis de tipo Linear.
 
*Observar como '''RadioGroup''' é un layout máis de tipo Linear.
 
*Observar como a primeira opción está activada por defecto.
 
*Observar como a primeira opción está activada por defecto.
<syntaxhighlight lang="xml" hightlight="15">
+
<syntaxhighlight lang="xml" highlight="15">
 
<?xml version="1.0" encoding="utf-8"?>
 
<?xml version="1.0" encoding="utf-8"?>
 
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

Revisión del 09:00 25 oct 2020

Introdución

  • O control RadioButton permite escoller unha opción entre varias posibles.
  • Aconséllase usar este control sempre que se queiran amosar ao usuario múltiples opcións, unha ao carón doutra.
  • En caso contrario débese usar un Spinner (Lista despregable).
  • No layout os RadioButton organízanse dentro dun RadioGroup que vai controlar que non haxa máis dunha opción marcada.

Radiobuttons.png

  • Nota: polas opcións que ofrece a imaxe, tomada de Android SDK, aí debe traballar un galego.


  • RadioGroup herda da clase LinearLayout co cal terá as súas propiedades, entre elas: android:orientation


  • RadioButton herda da clase CompoundButton ao igual que CheckBox:
Por tanto, funcionan da mesma maneira:


  • Tamén podemos xestionar os eventos da mesma forma que nos botóns, coa interface OnClickListener ou pola propiedade android:onCLick.

00 Part of Android View Hierarchy.png


Caso práctico 1 (non recomendado)

  • Nota: Neste exemplo a xestión do evento click faise sobre cada un dos radiobutton e se fai, en parte, modificando o código do layout onde se atopan.
Non se recomenda mesturar a parte gráfica (deseño) coa de xestión de eventos. É unha recomendación, non implica que non se poida facer.


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: RadioButtons.



  • Dentro do paquete RadioButtons crear unha nova 'Empty Activity' de nome: UD02_01_RadioButtons 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 unha aplicación na que o usuario indique se é ou non maior de idade e que se amose a opción escollida no EditText.



XML do Layout

  • Observar como RadioGroup é un layout máis de tipo Linear.
  • Observar como a primeira opción está activada por defecto.
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7     <RadioGroup
 8         android:layout_width="fill_parent"
 9         android:layout_height="wrap_content"
10         android:orientation="vertical" >
11 
12         <RadioButton
13             android:id="@+id/rbtnMaior18_UD02_01_Radio"
14             android:layout_width="wrap_content"
15             android:layout_height="wrap_content"
16             android:checked="true"
17             android:onClick="controlarIdade"
18             android:text=">18 anos" />
19 
20         <RadioButton
21             android:id="@+id/rbtnMenor18_UD02_01_Radio"
22             android:layout_width="wrap_content"
23             android:layout_height="wrap_content"
24             android:onClick="controlarIdade"
25             android:text="&lt;=18 anos" />
26     </RadioGroup>
27 
28     <EditText
29         android:id="@+id/txtResultado_UD02_01_Radio"
30         android:layout_width="match_parent"
31         android:layout_height="wrap_content"
32         android:hint="Resultado" />
33 
34 </LinearLayout>



Código Java

  • Implementamos o método controlarIdade
 1 package es.cursoandroid.cifprodolfoucha.aprendiendo.UI.RadioButtons;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.widget.EditText;
 7 
 8 import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
 9 
10 public class UD02_01_RadioButtons extends Activity {
11 
12     public void controlarIdade(View view) {
13 
14         EditText caixa = (EditText) findViewById(R.id.txtResultado_UD02_01_Radio);
15 
16         switch (view.getId()) {
17             case R.id.rbtnMaior18_UD02_01_Radio:
18                 caixa.setText("Tes máis de 18 anos");
19                 break;
20             case R.id.rbtnMenor18_UD02_01_Radio:
21                 caixa.setText("Tes menos de 18 anos");
22                 break;
23         }
24     }
25 
26 
27     @Override
28     protected void onCreate(Bundle savedInstanceState) {
29         super.onCreate(savedInstanceState);
30         setContentView(R.layout.activity_ud02_01__radio_buttons);
31     }
32 }
  • Liña 16: Indagamos que cal é o ID da opción na que se fixo click.



Control de eventos usando un listener

  • Xa o vimos 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.
Os radiobutton non son máis que un tipo de botón e polo tanto podemos empregar a mesma interface que nos Button como vimos no enlace anterior.
Queda como tarefa para o alumno, implementar a xestión de eventos deste exercicio facendo uso das interfaces (lembrar quitalo do layout).


  • Lembrar que esta será a forma obrigatoria de facelo.


Caso práctico 2

  • O mesmo obxectivo que no caso práctico 1, pero sen facelo no layout.
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: RadioButtons.



  • Dentro do paquete RadioButtons crear unha nova 'Empty Activity' de nome: UD02_02_RadioButtons 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 unha aplicación na que o usuario indique se é ou non maior de idade e que se amose a opción escollida no EditText.



XML do Layout

  • Observar como RadioGroup é un layout máis de tipo Linear.
  • Observar como a primeira opción está activada por defecto.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UD02_02_RadioButtons">

    <RadioGroup
        android:id="@+id/rgrpGrupoBotons"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:checkedButton="@id/rbtnMaior18_UD02_02_Radio"
        android:orientation="horizontal"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <RadioButton
            android:id="@+id/rbtnMaior18_UD02_02_Radio"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=">18 anos" />

        <RadioButton
            android:id="@+id/rbtnMenor18_UD02_02_Radio"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="&lt;=18 anos" />
    </RadioGroup>

    <EditText
        android:id="@+id/edtResultado_UD02_02_Radio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="24dp"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/rgrpGrupoBotons" />
</androidx.constraintlayout.widget.ConstraintLayout>



Liña 15: A diferenza do caso práctico 1, para seleccionar o radiobutton seleccionado por defecto empregamos a propiedade checkedButton do RadioGroup.

Código Java

Nota: Este exemplo está feito cunha versión actual de Android Studio onde xa non podemos indicar a opción 'Sen compatibilidade' ao crear a activity, polo que no exemplo deriva de AppCompactActivity.

  • Implementamos o método controlarIdade
package es.cursoandroid.cifprodolfoucha.aprendiendo.UI.RadioButtons;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.EditText;
import android.widget.RadioGroup;

public class UD02_02_RadioButtons extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_u_d02_02_b__radio_buttons);

        RadioGroup radioGroup = findViewById(R.id.rgrpGrupoBotons);
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                EditText caixa = findViewById(R.id.edtResultado_UD02_02_Radio);
                switch (i){
                    case R.id.rbtnMaior18_UD02_02_Radio:
                        caixa.setText("Tes máis de 18 anos");
                        break;
                    case R.id.rbtnMenor18_UD02_02_Radio:
                        caixa.setText("Tes menos de 18 anos");
                        break;
                }
            }
        });


    }
}
Desta forma sabemos sobre que botón se fixo click por medio do segundo parámetro (int i).


  • Indicar que por defecto está seleccionado o primeiro radiobutton a nivel gráfico (do layout) e isto non provoca a execución do evento de click.
Se queremos que se provoque dito evento, non debemos de seleccionar ningún radiobutton no deseño e no código facer unha chamada ao método check(int id).
package es.cursoandroid.cifprodolfoucha.aprendiendo.UI.RadioButtons;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.EditText;
import android.widget.RadioGroup;

public class UD02_02_RadioButtons extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_u_d02_02_b__radio_buttons);

        RadioGroup radioGroup = findViewById(R.id.rgrpGrupoBotons);
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                EditText caixa = findViewById(R.id.edtResultado_UD02_02_Radio);
                switch (i){
                    case R.id.rbtnMaior18_UD02_02_Radio:
                        caixa.setText("Tes máis de 18 anos");
                        break;
                    case R.id.rbtnMenor18_UD02_02_Radio:
                        caixa.setText("Tes menos de 18 anos");
                        break;
                }
            }
        });
        radioGroup.check(R.id.rbtnMaior18_UD02_02_Radio);

    }
}




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