Ejemplo RadioGroup Android

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!!!

  • jorge

    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:

      <RadioGroup
              android:id="@+id/rdGrp"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:checkedButton="@+id/rd1" >
      
              <RadioButton
                  android:id="@+id/rd1"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:drawableRight="@drawable/radiobuton1" />
      
              <RadioButton
                  android:id="@+id/rd2"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:drawableRight="@drawable/radiobuton1" />
      
              <RadioButton
                  android:id="@+id/rd3"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:drawableRight="@drawable/radiobuton1" />
          </RadioGroup>
      

      Con el atributo android:drawableRight puedes poner una imagen en vez de texto para los RadioButton.

      Espero que sea de ayuda,

      Saludos

  • Javier

    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:

      import android.widget.RadioGroup.OnCheckedChangeListener;
      

      Por si acaso, te dejo el código de ejemplo que he usado ahora mismo para probarlo todo:

      import android.app.TabActivity;
      import android.os.Bundle;
      import android.view.Menu;
      import android.widget.RadioGroup;
      import android.widget.RadioGroup.OnCheckedChangeListener;
      
      public class MainActivity extends TabActivity {
      	private RadioGroup rdGroup;
      
      	@Override
      	protected void onCreate(Bundle savedInstanceState) {
      		super.onCreate(savedInstanceState);
      		setContentView(R.layout.activity_main);
      
      		rdGroup = (RadioGroup) findViewById(R.id.rdGrp);
      		rdGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
      
      			@Override
      			public void onCheckedChanged(RadioGroup arg0, int arg1) {
      				// TODO Auto-generated method stub
      				
      				// Se comprueban los radioButton
      			}
      
      		});
      	}
      
      }
      

      Espero que te sea de ayuda, cualquier cosa no dudes en postear ;).

      Saludos!!!

  • Javier

    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:

      rdGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
      
      			@Override
      			public void onCheckedChanged(RadioGroup arg0, int arg1) {
      				// TODO Auto-generated method stub
      				
      				// Se comprueban los radioButton
      				Log.i("Informativo", "Esto genera una entrada en el LogCat");
      				Log.d("Debug", "Esto genera otro tipo de entrada en el LogCat");
      				Log.w("Warning", "Esto genera otro tipo de entrada en el LogCat");
      				Log.e("Error", "Esto muestra otro tipo de entrada en el LogCat");
      			}
      
      		});
      

      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!

  • Javier

    Muchas gracias David, seguiré tus consejos.

    Un saludo

  • cuetox

    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