Buenos días, en esta entrada trataremos de ver como funciona un poco los Widgets llamados RadioButton, que se encuentran dentro de un RadioGroup, y uno de sus eventos mas importantes con los que mas trabajaremos cuando lo usemos.
-
Problema
Queremos ver como funcionan los RadioButton que están dentro de un RadioGroup.
-
Solución
Gracias a un evento del RadioGroup, cuando cambie el RadioButton su estado Checked, un TextView se actualizará actualizando su texto acorde al RadioButton que hemos pulsado.
-
Discusión:
Para esta aplicación tan básica y simple vamos a crear una UI muy básica, constara de un TableLayout, el cual tendrá 3 TableRow, donde iremos colocando cada elemento.
-
Para comenzar, vamos a crear un nuevo proyecto, yo al mío lo he llamado TutorialRadioButton:
(En mi caso hay un error, porque hice la foto cuando ya estaba el proyecto creado, perdonad el fallo)
-
En las siguientes ventanas, podemos dejar todo por defecto.
-
Una vez creado nuestro proyecto, vamos a cambiar el que nos venía por defecto, haciendo un TableLayout:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchColumns="1" > </TableLayout>
Con esto tendríamos nuestro TableLayout creado, ahora iremos agregando TableRow para ir agregando componentes en ellos.
-
Lo siguiente que haremos es agregar un TableRow para poner un TextView, que será un texto estático que no cambiará:
<TableRow> <TextView android:id="@+id/lblTexto" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_column="0" android:text="@string/lblElige"/> </TableRow>
De momento, con esto, la UI debería ir quedando así:
-
En el siguiente TableRow meteremos el RadioGroup, junto a sus 3 RadioButton en su interior:
<TableRow> <RadioGroup android:id="@+id/rdgGrupo" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checkedButton="@+id/rdbOne" android:layout_column="0" android:layout_span="3"> <RadioButton android:id="@+id/rdbOne" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/rdbUno"/> <RadioButton android:id="@+id/rdbTwo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/rdbDos"/> <RadioButton android:id="@+id/rdbThree" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/rdbTres"/> </RadioGroup> </TableRow>
Como vemos, el RadioGroup tiene su propio id, al igual que cada uno de sus RadioButton.
Con esto, la aplicación nos debería ir quedando así:
-
Ahora agregaremos un separador con un View, esto es simple y no nos será muy dificil, lo introducimos en el TableLayout, pero no hace falta que lo metamos en un TableRow, ya que no es necesario, el TableLayout lo permite.
<View android:layout_height="5dp" android:paddingTop="5dp" android:paddingBottom="5dp" android:background="#DDFFDD"/>
Es simplemente como una barra que separará la parte superior de la aplicación, de la parte inferior donde mostraremos el resultado.
-
Por último, agregaremos el último TableRow, que en su interior lleva un TextView, el cual usaremos para mostrar que botón está pulsado.
<TableRow android:paddingTop="5dp" android:paddingBottom="5dp"> <TextView android:id="@+id/lblPulsado" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_column="0"/> </TableRow>
No veremos nada diferente en la UI, pues este TextView no mostrará nada hasta que no pulsemos un RadioButton, y el texto de este TextView se actualiza por el código.
La UI final nos deberá quedar así:
-
Una vez establecida la UI, podemos abrir nuestro MainActivity.java, el cual para empezar estará algo vacío.
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
-
Ahora introduciremos las variables privadas que usaremos, en este caso lo único que tocamos en la UI es el RadioGroup y el TextView que pusimos en la parte inferior, así que los declaramos como variables private, y luego en el método onCreate las enlazaremos entre el código java y el activity_main.xml.
public class MainActivity extends Activity { private RadioGroup rdgGrupo; private TextView lblChecked; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //TextView que nos mostrará que RadioButton está checked lblChecked = (TextView)findViewById(R.id.lblPulsado); rdgGrupo = (RadioGroup)findViewById(R.id.rdgGrupo); } }
-
Ahora viene lo importante, donde se desarrolla todo el funcionamiento para lo que la aplicación ha sido creada, el manejo de los RadioButton y la visualización del TextView.
Para ello asignamos un evento al RadioGroup, mediante el método setOnCheckedChangeListener.
rdgGrupo.setOnCheckedChangeListener(new OnCheckedChangeListener(){ @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // TODO Auto-generated method stub if (checkedId == R.id.rdbOne){ lblChecked.setText("Ha pulsado el botón 1"); }else if (checkedId == R.id.rdbTwo){ lblChecked.setText("Ha pulsado el botón 2"); }else if (checkedId == R.id.rdbThree){ lblChecked.setText("Ha pulsado el botón 3"); } } });
Como vemos, al hacer una nueva instancia de OnCheckedChangeListener, podemos implementar el método onCheckedChanged, el cual recibe el RadioGroup y el checkedId, para tratar con ello. Luego solo tenemos que hacer unos bloques condicionales, y asignar el texto al TextView
-
Por último, podemos ejecutar nuestra aplicación en el emulador, y ver los diferentes estados:
-
Hasta aquí este ejemplo, el cual ya nos da una manera funcional de hacer algo básico con RadioGroup y sus elementos RadioButton.
Cualquier aporte o corrección es bienvenida!
Saludos!!!
se puede añadir imagenes en vez de texto
Buenas Jorge,
Efectivamente se puede, he hecho un código de ejemplo que quizás te sea de ayuda:
Con el atributo android:drawableRight puedes poner una imagen en vez de texto para los RadioButton.
Espero que sea de ayuda,
Saludos
Hola, intentando adaptar tu ejemplo en un desarrollo mio, al asignar el evento al radiogrup me salta el error » … OnCheckedChangeListener cannot be resolved to a type»
Tengo importado android.widget.radiogroup
Lo que si creo que puede estar el conflicto, es que no estoy utilizando una clase activity, sino una TabActivity.
Puedes ayudarme?, desde ya, muchas Gracias,
Saludos
Buenas Javier,
No te preocupes por la TabActivity, es únicamente una clase que hereda de Activity, por tanto no existe problema alguno con ello.
He probado en un momento por si acaso con una TabActivity y no me da problemas, por lo que creo que debe de ser algún paquete a importar.
Prueba importando el siguiente:
Por si acaso, te dejo el código de ejemplo que he usado ahora mismo para probarlo todo:
Espero que te sea de ayuda, cualquier cosa no dudes en postear ;).
Saludos!!!
Hola David; Muchas gracias por tu respuesta.
A la linea
rdGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { ….
la renombré
rdgGrupo.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { …
los errores desaparecieron pero la aplicación lanza el error «Unfortunately, ….. has stopped
Estoy iniciandome en la programación android y estoy bastante verde con Eclipse, como puedo depurar el código para localizar el error?, he hecho doble click sobre la linea, la veo marcada pero no para en el punto.
Un saludo
Buenas Javier,
El primer paso para localizar los errores y depurarlos, es visualizar el LogCat, es una pequeña ventana donde se nos van anunciando todos los mensajes que tienen que ver ya sean con problemas en la aplicación, como mensajes que pongamos en la aplicación para consultar los valores de alguna variable.
Normalmente se encuentra ubicado en la parte inferior de nuestro IDE: y está junto a otras pestañas:
Ver foro Aquí
Este es el primer lugar donde buscaremos el fallo, y donde una vez interpretado podemos buscar perfectamente el lugar donde ha ocurrido.
Para sacar mensajes por el LogCat, también puedes agregar una linea en tu código, de las siguientes maneras:
Como puedes ver, hay 4 métodos diferentes a los que podemos llamar, los cuales imprimirán en el LogCat un mensaje de un color diferente.
Ver foto Aquí
Esto son solo unos pasos básicos para depurar errores básicos, que espero para empezar te sean de ayuda.
Saludos!
Muchas gracias David, seguiré tus consejos.
Un saludo
se puede hacer un radiogroup con varias fillas ?
Alguien sabe como hacer que en una pantalla tenga un group radio y que al seleccionar el radio button y con ayuda de un boton se refleje lo que selecione en otra pantalla