En una aplicación móvil para Android que estoy desarrollando me vi en la necesidad de agregar algunos widgets de tipo RadioButton. Recordemos que estos widgets van dentro de un RadioGroup para que solamente se pueda seleccionar uno.
Veremos entonces cómo poner los RadioButton dentro de un RadioGroup y saber cuál elemento está seleccionado.
El layout con XML
Hay que poner un RadioGroup, asignarle un id y dentro de él poner todos los RadioButton que se necesiten.
Tip: puedes cambiar la orientación de los RadioButton usando la propiedad orientation
del elemento RadioGroup. En este caso se usa la orientación horizontal.
<RadioGroup
android:id="@+id/radioGroupTipoLugar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checkedButton="@id/rbPublico"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rbPrivado"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Privado" />
<RadioButton
android:id="@+id/rbPublico"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Público" />
</RadioGroup>
Hay muchos atributos pero los que importan son:
- id: indica el id del RadioGroup que más tarde vamos a usar
- checkedButton: el id del RadioButton que va a estar seleccionado por defecto
Dentro del RadioGroup tenemos a 2 RadioButton. Cada uno tiene un id que igualmente vamos a necesitar más tarde.
Otro atributo importante es el de text
pues es el texto que se muestra, y finalmente el weight
o peso indica cuánto espacio disponible ocupan. En este caso los dos ocupan 1, por lo tanto ocupan lo mismo.
Obtener referencia desde Java
Después obtenemos todos los elementos dentro de Java. Definimos unas variables de instancia; pero primero importamos lo necesario:
import android.widget.RadioButton;
import android.widget.RadioGroup;
Ahora sí definimos los RadioButton y el RadioGroup. En este ejemplo solamente usamos dos RadioButton dentro de un RadioGroup pero se pueden usar varios al mismo tiempo.
// Nota: si estás en un fragment llama a view.findViewById dentro del método onViewCreated
RadioGroup radioGroupTipoLugar = findViewById(R.id.radioGroupTipoLugar);
RadioButton radioButtonPrivado = findViewById(R.id.rbPrivado);
RadioButton radioButtonPublico = findViewById(R.id.rbPublico);
Listener cuando se selecciona un RadioButton
Como bonus, si quieres escuchar cuando un elemento es seleccionado, agrega un listener al RadioGroup:
radioGroupTipoLugar.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
// Ahora i es el id del elemento seleccionado. Nota: es el id, no el índice
// compara usando radioButtonPrivado.getId() == i
}
});
Definimos un listener y sobrescribimos el método onCheckedChanged
. En esa función nos pasan el id numérico del RadioButton, el cual podemos comparar obteniendo el id de los RadioButton que tenemos. Mira el ejemplo de abajo para ver cómo se hace.
Saber cuál opción está seleccionada
Finalmente, para saber cuál opción está seleccionada (sin el listener, por ejemplo, obtenerlo en el click de un botón ajeno al RadioGroup) podemos usar el método getCheckedRadioButtonId
así:
int idDeRadioButtonSeleccionado = radioGroupTipoLugar.getCheckedRadioButtonId();
if (idDeRadioButtonSeleccionado == radioButtonPrivado.getId()) {
// OK seleccionaron la opción "privado"
} else if (idDeRadioButtonSeleccionado == radioButtonPublico.getId()) {
// Seleccionaron el público
// Aquí pueden ir más else if
} else {
// Mmmh, imposible pero pon el else por las dudas
}
Fíjate en que llamamos al método en el RadioGroup, y comparamos usando el id que tiene cada RadioButton.
Conclusión
La programación con Android es complicada en algunos sentidos, pero si los grandes diseñadores y programadores hicieron las cosas así no queda más que entenderlos, debieron tener razones suficientes para diseñar las cosas de esa manera.