Установить выбранный индекс Android RadioGroup

96

Есть ли способ установить выбранный индекс RadioGroup в Android, кроме перебора дочерних радиокнопок и выбора проверки переключателя по выбранному индексу?

Примечание. Я заполняю группу переключателей во время выполнения.

Хасан Мокдад
источник

Ответы:

203

Если ваша радиогруппа определена в XML-файле макета, каждой кнопке можно назначить идентификатор. Тогда вы просто проверяете такую ​​кнопку

radioGroup.check(R.id.myButtonId);

Если вы создали свою радиогруппу программно (я даже не уверен, как вы это делаете ...), вы можете подумать о создании специального XML-файла макета только для радиогруппы, чтобы вы могли назначить R.id. * ids к кнопкам.

См. Ответ ниже, если вы действительно хотите установить группу переключателей по индексу, см. Ответ ниже.

((RadioButton)radioGroup.getChildAt(index)).setChecked(true);
jjm
источник
2
Привет, я создал их программно, используя этот код: for (int i = 0; i <lookupTypes.size (); i ++) {// RadioButton rbt = new RadioButton (this); //, null, // R.style. RadioGroupItem); RadioButton rbt = (RadioButton) getLayoutInflater (). Inflate (R.layout.tmpltradiobutton, null); rbt.setId (я); rbt.setText (lookupTypes.get (i) .getValue ()); rbt.setTag (lookupTypes.get (i)); rbtnGroup.addView (rbt); }
Hassan Mokdad
Поскольку вы устанавливаете их идентификаторы для индекса в lookupTypes, вы можете просто использовать этот индекс в качестве аргумента checkметода.
jjm
этот ответ буквально просто снова объясняет то, что уже сказал задающий вопрос - другой ответ должен быть принятым ответом, поскольку он правильно говорит, как выбирать по индексу.
Ласси Киннунен,
@LassiKinnunen Я чувствую, что количество голосов за этот ответ говорит о том, что люди получают от него то, что им нужно ... Тем не менее, вы правы, что другой ответ более правильный для
заданного
2
Честно говоря, мне немного неловко, что это мой самый высоко оцененный ответ SO.
jjm
87

Вопрос сказал "установить выбранный ИНДЕКС", вот как установить его по индексу:

((RadioButton)radioGroup.getChildAt(index)).setChecked(true);

........

Дополнительная информация: похоже, Google хочет, чтобы вы использовали идентификатор вместо индекса, потому что использование идентификатора является более надежным доказательством ошибки. Например, если у вас есть другой элемент пользовательского интерфейса в вашей RadioGroup, или если другой разработчик повторно заказывает RadioButtons, индексы могут измениться и не соответствовать вашим ожиданиям. Но если вы единственный разработчик, это нормально.

Сиаваш
источник
Можете ли вы объяснить этот код, как это правильный ответ?
rfornal
1
@rfornal этот код позволяет захватить переключатель по индексу, а не по идентификатору представления (например, R.id.radioButton1), и снижает необходимость реализации таблицы поиска для преобразования индекса в идентификатор представления.
Siavash
5

Ответ Сиаваша правильный:

((RadioButton)radioGroup.getChildAt(index)).setChecked(true);

Но имейте в виду, что radioGroup может содержать представления, отличные от radioButtons - как в этом примере, который включает слабую строку под каждым выбором.

<RadioGroup
    android:id="@+id/radioKb"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <RadioButton
        android:id="@+id/kb1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:button="@null"
        android:drawableRight="@android:drawable/btn_radio"
        android:text="Onscreen - ABC" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#33000000" />

    <RadioButton
        android:id="@+id/kb2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:button="@null"
        android:drawableRight="@android:drawable/btn_radio"
        android:text="Onscreen - Qwerty" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#33000000" />

    <RadioButton
        android:id="@+id/kb3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:button="@null"
        android:drawableRight="@android:drawable/btn_radio"
        android:text="Standard softkey" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#33000000" />

    <RadioButton
        android:id="@+id/kb4"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:button="@null"
        android:drawableRight="@android:drawable/btn_radio"
        android:text="Physical keyboard" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#33000000" />

</RadioGroup>

В этом случае использование, например, индекса 1 приведет к ошибке. Элемент с индексом 1 является первой разделительной линией, а не RadioButton. RadioButton в этом примере имеют индексы 0, 2, 4, 6.

Алан
источник
3

вы можете сделать findViewById из группы радио.

((RadioButton)my_radio_group.findViewById(R.id.radiobtn_veg)).setChecked(true);`
Фахим
источник
2

Это сработало для меня, я динамически создал переключатель

  private void createRadioButton() {

    RadioButton[] rb = new RadioButton[5];

    RadioGroup.LayoutParams layoutParams = new RadioGroup.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            1.0f);

    radioGroup.setOrientation(RadioGroup.HORIZONTAL);

    for (int ID = 0; ID < 5; ID++) {
        rb[ID] = new RadioButton(this);
        rb[ID].setLayoutParams(layoutParams);
        rb[ID].setText("Button_Text");
        radioGroup.addView(rb[ID]); //the RadioButtons are added to the radioGroup instead of the layout
    }
}

Теперь проверьте кнопку, используя,

int radio_button_Id = radioGroup.getChildAt(index).getId();

radioGroup.check( radio_button_Id );
Мукешкумар С
источник
0

Внутри onBindViewHolder установите тег в группу кнопок

@Override
public void onBindViewHolder(final CustomViewHolder holder, final int position) {
   ...
   holder.ButtonGroup.setTag(position);
}

и в ViewHolder

ButtonGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
        ...
        int id = radioGroup.getCheckedRadioButtonId();

        RadioButton radioButton = (RadioButton) radioGroup.findViewById(id);

        int clickedPos = (Integer) radioGroup.getTag();

        packageModelList.get(clickedPos).getPoll_quest()
    }
Джитен Баснет
источник
0

Используя Kotlin, вы можете сделать это

  (radio_group_id.getChildAt(index) as RadioButton).isChecked = true

или

radio_group_id.check(R.id.radio_button_id)

АбдельраЗек
источник