Explicación del concepto de RadioButton y RadioGroup.
DEFINICIÓN
RadioButton
Hereda de:
Un RadioButton es un botón que tiene dos estados, puede encontrarse marcado (checked) o desmarcado (unchecked).
Cuando el botón se encuentra desmarcado, el usuario puede marcarlo, sin embargo, al contrario que los CheckBox, el usuario no puede desmarcarlo una vez marcado.
Los RadioButtons suelen utilizarse dentro de un RadioGroup.
RadioGroup
Hereda de LinearLayout.
Esta clase se utiliza para crear un grupo de RadioButtons mutuamente excluyentes, es decir, solo puede haber uno de ellos en el estado de marcado.
Esto significa que si el usuario marca uno de ellos, el resto, automáticamente pasan al estado de desmarcados.
Mientras que no se puede desmarcar un RadioButton concreto, si que se puede limpiar un RadioGroup para eliminar el estado de marcado de sus RadioButtons.
La selección es identificada mediante el atributo android:id de cada uno de los RadioButton.
USO DESDE XML
Como hemos visto, un RadioGroup contiene varios RadioButtons. Por este motivo, podemos crear un RadioGroup de la siguiente manera:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_margin="30dp"android:orientation="vertical"> <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Como va a realizar el Pago:"android:paddingBottom="30dp"/> <RadioGroupandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"> <RadioButtonandroid:id="@+id/rb_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Pago en efectivo"/> <RadioButtonandroid:id="@+id/rb_2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Pago con tarjeta"/> <RadioButtonandroid:id="@+id/rb_3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Pago contrarrembolso"/> <RadioButtonandroid:id="@+id/rb_4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Pago por Bizum"/> </RadioGroup></LinearLayout>
IMPORTANTE
Si no asigno un android:id a cada uno de los RadioButtons, podré marcar todas las opciones pues el sistema no tiene forma de identificar si lo están o no.
ATRIBUTOS RADIOBUTTON
android:button
Heredada de CompoundButton.
Define el drawable que se va a utilizar en el gráfico del botón.
android:buttonTint
Hereda de CompoundButton.
Color que se debe aplicar al drawable del botón.
android:buttonTintMode
Hereda de CompoundButton.
Define el modo en el que se va a aplicar ese "tinte" al drawable. Puede ser uno de varios valores constantes que se pueden ver definidos en el siguiente enlace:
ATRIBUTOS RADIOGROUP
android:checkedButton
Define el id del RadioButton que se encuentra marcado por defecto. No es obligatorio puesto que puede no haber ninguno marcado inicialmente.
PROGRAMAR EVENTOS DESDE CÓDIGO
El caso de los RadioButton es muy similar al caso de los Chips que vimos en la página anterior. Por ese motivo sólo se va a presentar el código:
MainActivity.kt
package com.example.android.appdeejemploimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.view.Viewimport android.widget.RadioButtonimport android.widget.RadioGroupimport android.widget.ToastclassMainActivity : AppCompatActivity() {overridefunonCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val rgEjemplo =findViewById<RadioGroup>(R.id.rgEjemplo)var rb: RadioButtonfor (i in0 until rgEjemplo.childCount) { rb = rgEjemplo.getChildAt(i) as RadioButton rb.setOnClickListener{onRadioButtonClicked(it) } } }funonRadioButtonClicked(view: View) {if (view is RadioButton) {var checked = view.isCheckedwhen (view.id){ R.id.rb1 -> { Toast.makeText(this, "Va a pagar en metálico", Toast.LENGTH_SHORT).show() } R.id.rb2 -> { Toast.makeText(this, "Va a pagar con tarjeta", Toast.LENGTH_SHORT).show() } R.id.rb3 -> { Toast.makeText(this, "Va a pagar contrarreembolso", Toast.LENGTH_SHORT).show() } R.id.rb4 -> { Toast.makeText(this, "Va a pagar por Bizum", Toast.LENGTH_SHORT).show() } } } }}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns: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"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_margin="30dp"android:orientation="vertical"> <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Como va a realizar el Pago:"android:paddingBottom="30dp"/> <RadioGroupandroid:id="@+id/rgEjemplo"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"> <RadioButtonandroid:id="@+id/rb1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Pago en efectivo"/> <RadioButtonandroid:id="@+id/rb2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Pago con tarjeta"/> <RadioButtonandroid:id="@+id/rb3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Pago contrarreembolso"/> <RadioButtonandroid:id="@+id/rb4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Pago por Bizum"/> </RadioGroup></LinearLayout>
PERSONALIZACIÓN
Vamos a utilizar los conocimientos que tenemos hasta ahora para desarrollar un RadioGroup personalizado con una estética muy diferente a la habitual:
Para ello vamos a utilizar conocimientos adquiridos a lo largo del curso:
Listas de estados
Como vemos, el RadioButton que se encuentra en el estado de checked tiene un color diferente al resto, esto lo hacemos con listas de estados como ya hicimos en la página anterior con los Chips.
Para este ejercicio vamos a necesitar crear 4 archivos drawables por cada RadioButton:
Un archivo drawable que contenga el icono. (ic_ejemplo)
Un archivo drawable que contenga la lista de estados. (rb_ejemplo_bg)
Un archivo drawable que contenga el estado cuando está checked (rb_ejemplo_on)
Un archivo drawable que contenga el estado cuando está unchecked (rb_ejemplo_off)
Empecemos:
Iconos
Los iconos se encuentran en el siguiente enlace y luego se añaden a Android Studio como un nuevo drawable con el nombre que queramos: