2010-03-02 9 views
11

Tengo varios botones de radio que quiero diseñar usando una tabla, pero también los incluyo en un solo grupo de radio. Tengo el siguiente diseño xml:¿Cómo agregar un grupo de radio a los botones de opción dentro de una tabla?

<RadioGroup android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:id="@+id/Group1"> 

    <TableLayout android:id="@+id/RadioButtons" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <TableRow> 
      <RadioButton android:id="@+id/rad1" 
       android:text="RButton1" 
       android:layout_width="105px" 
       android:layout_height="wrap_content" 
       android:textSize="13px"></RadioButton> 
      <RadioButton android:id="@+id/rad2" 
       android:text="RButton2" 
       android:layout_width="105px" 
       android:textSize="13px" 
       android:layout_height="wrap_content"></RadioButton> 
      <RadioButton android:id="@+id/rad3" 
       android:text="RButton3" 
       android:layout_width="105px" 
       android:textSize="13px" 
       android:layout_height="wrap_content"></RadioButton> 
     </TableRow> 
     </TableLayout> 
</RadioGroup> 

Pero, por desgracia los botones de opción dentro de la tabla parecen ignorar el hecho de que están dentro de las etiquetas radiogroup y debido a esto se puede seleccionar más de un botón de opción en el hora. Noté que al quitar la mesa y simplemente tener los botones de radio funciona bien. ¿Cómo puedo superar esto? ¿Sería tan simple como declarar el grupo de radio dentro de la mesa en vez de afuera? Gracias por cualquier ayuda.

Respuesta

7

Sus widgets RadioButton deben ser hijos inmediatos del RadioGroup para que funcione el efecto de grupo.

+0

para que no haya forma de estructurar los botones con una tabla y hacerlos parte de un grupo de radio? – Fizz

+0

Solo si los widgets 'RadioButton' son hijos inmediatos del' RadioGroup'. Por lo tanto, sus widgets 'RadioButton' necesitarán estar en una fila o columna en una sola celda de su tabla. – CommonsWare

+0

¿Qué ocurre si programáticamente asigné cada botón de radio para que esté en un grupo? – nobalG

0
rg1 = (RadioGroup)findViewById(R.id.radioGroup1); 
     rg2 = (RadioGroup)findViewById(R.id.radioGroup2); 
     rg1.setOnCheckedChangeListener(this); 
     rg2.setOnCheckedChangeListener(this); 
    } 
    boolean rg1b = false; 
    boolean rg2b = false; 

    @Override 
    public void onCheckedChanged(RadioGroup rgId, int radioButtonId) { 
     switch (rgId.getId()) { 
     case R.id.radioGroup1: 
      rg1b=true; 
      if(rg2b) 
       rg2.clearCheck(); 
      break; 

     case R.id.radioGroup2: 
      rg1b=true; 
      if(rg1b) 
       rg1.clearCheck(); 
      break; 
     } 
+4

Por favor, no solo descargue código como su respuesta. Una explicación sería útil. –

2

Aquí está mi extensión RadioGroup/RadioButton (SoftRadioGroup/SoftRadioButton). RadioGroup ya no se necesita en el diseño XML. Puede agrupar los RadioButtons con una propiedad llamada grupo.

SoftRadioButton:

import java.util.HashMap; 
import java.util.Random; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.widget.RadioButton; 

public class SoftRadioButton extends RadioButton { 

    private static HashMap<String, SoftRadioGroup> GROUP_MAPPINGS = new HashMap<String, SoftRadioGroup>(); 
    private String mGroupName; 

    public SoftRadioButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     addToGroup(attrs); 
    } 

    public SoftRadioGroup getRadioGroup() { 
     return GROUP_MAPPINGS.get(mGroupName); 
    } 

    private void addToGroup(AttributeSet attrs) { 
     for (int i = 0; i < attrs.getAttributeCount(); i++) { 
      if (attrs.getAttributeName(i).equals("group")) { 
       String groupName = attrs.getAttributeValue(i); 
       SoftRadioGroup group; 
       if ((group = GROUP_MAPPINGS.get(groupName)) != null) { 
        // RadioGroup already exists 
        group.addView(this); 
        setOnClickListener(group); 
        mGroupName = groupName; 

       } else { 
        // this is the first RadioButton in the RadioGroup 
        group = new SoftRadioGroup(); 
        group.addView(this); 
        mGroupName = groupName; 
        setOnClickListener(group); 

        GROUP_MAPPINGS.put(groupName, group); 
       } 
       return; 
      } 
     } 
     // group is not specified in the layout xml. Let's generate a random 
     // RadioGroup 
     SoftRadioGroup group = new SoftRadioGroup(); 
     group.addView(this); 
     Random rn = new Random(); 
     String groupName; 
     do { 
      groupName = Integer.toString(rn.nextInt()); 
     } while (GROUP_MAPPINGS.containsKey(groupName)); 
     GROUP_MAPPINGS.put(groupName, group); 
     mGroupName = groupName; 
     setOnClickListener(group); 

    } 

} 

SoftRadioGroup:

import java.util.ArrayList; 

import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.RadioButton; 

public class SoftRadioGroup implements OnClickListener { 

    private ArrayList<RadioButton> buttons = new ArrayList<RadioButton>(); 

    public void addView(RadioButton button) { 
     buttons.add(button); 
    } 

    @Override 
    public void onClick(View v) { 
     for (RadioButton button : buttons) { 
      button.setChecked(false); 
     } 
     RadioButton button = (RadioButton) v; 
     button.setChecked(true); 
    } 

    public RadioButton getCheckedRadioButton() { 
     for (RadioButton button : buttons) { 
      if (button.isSelected()) 
       return button; 
     } 
     return null; 
    } 

    public int getChildCount() { 
     return buttons.size(); 
    } 

    public RadioButton getChildAt(int i) { 
     return buttons.get(i); 
    } 

    public void check(SoftRadioButton button) { 
     if (buttons.contains(button)) { 
      for (RadioButton b : buttons) { 
       b.setChecked(false); 
      } 
     } 
    } 

} 

uso en el diseño de XML incrustado en una mesa (2 grupos con 2 botones por grupo):

<TableLayout 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:stretchColumns="1" > 

      <TableRow 
       android:id="@+id/tableRow1" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" > 

       <Your.Package.SoftRadioButton 
        android:id="@+id/filterActivity_RadioButton_byDate" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:checked="true" 
        android:contentDescription="date" 
        android:text="@string/filterActivity_RadioButton_byDate" 
        fake:group="orderBy" /> 

       <Your.Package.SoftRadioButton 
        android:id="@+id/filterActivity_RadioButton_byPrice" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:contentDescription="price" 
        android:text="@string/filterActivity_RadioButton_byPrice" 
        fake:group="orderBy" /> 
      </TableRow> 

      <TableRow 
       android:id="@+id/tableRow2" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" > 

       <Your.Package.SoftRadioButton 
        android:id="@+id/filterActivity_RadioButton_asc" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:contentDescription="down" 
        android:text="@string/filterActivity_RadioButton_asc" 
        fake:group="direction" /> 

       <Your.Package.SoftRadioButton 
        android:id="@+id/filterActivity_RadioButton_desc" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:checked="true" 
        android:contentDescription="up" 
        android:text="@string/filterActivity_RadioButton_desc" 
        fake:group="direction" /> 
      </TableRow> 
     </TableLayout> 
+0

brillante! Gracias. – Vyacheslav

+0

Advertencia: el código perderá vistas. Se agregará al mapa estático todas las vistas de SoftRadioButton cada vez que se creen las vistas. Es una gran idea para resolver el problema con una vista personalizada. La buena solución podría ser agregar ViewGroup en algún lugar en la raíz de la jerarquía de vistas y dejar que encuentre todas las vistas secundarias y emparejarlas en grupos. – arberg

+0

Corrige el atributo 'group' agregando attr.xml: , e importa en xml- diseño de la línea xmlns: fake = "http://schemas.android.com/apk/res-auto" – arberg

Cuestiones relacionadas