Как получить выбранный индекс RadioGroup в Android

Есть ли простой способ получить выбранный индекс RadioGroup в Android или мне нужно использовать OnCheckedChangeListener для прослушивания изменений и иметь что-то, что содержит последний выбранный индекс?

пример xml:

<RadioGroup android:id="@+id/group1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical">
    <RadioButton android:id="@+id/radio1" android:text="option 1" android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <RadioButton android:id="@+id/radio2" android:text="option 2" android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <RadioButton android:id="@+id/radio3" android:text="option 3" android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <RadioButton android:id="@+id/radio4" android:text="option 4" android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <RadioButton android:id="@+id/radio5" android:text="option 5" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</RadioGroup>

если пользователь выбирает option 3, я хочу получить индекс, 2.


person John Boker    schedule 22.06.2011    source источник


Ответы (15)


Вы должны быть в состоянии сделать что-то вроде этого:

int radioButtonID = radioButtonGroup.getCheckedRadioButtonId();
View radioButton = radioButtonGroup.findViewById(radioButtonID);
int idx = radioButtonGroup.indexOfChild(radioButton);

Если RadioGroup содержит другие представления (например, TextView), то метод indexOfChild() вернет неверный индекс.

Чтобы получить выбранный RadioButton текст на RadioGroup:

 RadioButton r = (RadioButton) radioButtonGroup.getChildAt(idx);
 String selectedtext = r.getText().toString();
person BP.    schedule 22.06.2011
comment
Но что, если для этих кнопок не установлены атрибуты android:id? - person neuront; 31.10.2012
comment
@BP У меня такие же сомнения в доступе к переключателям, когда ни один из родительских или идентификаторов переключателей не установлен. - person Killer; 02.03.2016
comment
@neuront Пока вы выполняете radioGroup.findViewById(radioButtonID), это будет работать. RadioGroup устанавливает 1, 2, 3, 4 и т. д. в качестве идентификаторов представления, поэтому, если вы будете искать их в своем контексте, это сработает. - person Reinherd; 13.06.2016
comment
Это не работает, если по умолчанию (и не затронутый пользователем) установлен RadioButton. - person Ninja Coding; 21.06.2017
comment
@NinjaCoding Если вы допустили ту же ошибку, что и я, вам нужно установить переключатель по умолчанию (начальный), вызвав radioGroup.check(selectedRadioButton.id), а не radioButton.setChecked(true). - person Lensflare; 17.10.2018

Это должно работать,

int index = myRadioGroup.indexOfChild(findViewById(myRadioGroup.getCheckedRadioButtonId()));
person source.rar    schedule 22.06.2011
comment
Используйте getActivity().findViewById(), если вы используете во фрагменте. - person Sanjeet A; 30.08.2015

Вы можете иметь ссылку на группу радио и использовать getCheckedRadioButtonId (), чтобы получить проверенный идентификатор радиокнопки. Посмотрите здесь

RadioGroup radioGroup = (RadioGroup)findViewById(R.id.radio_group);

Затем, когда вам нужно получить выбранный вариант радио.

int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId();
if (checkedRadioButtonId == -1) {
    // No item selected
}
else{
    if (checkedRadioButtonId == R.id.radio_button1) {
        // Do something with the button
    }
}
person Stefan Bossbaly    schedule 22.06.2011
comment
да, это идентификатор проверенной радиокнопки, но как насчет индекса радиокнопки в группе радио? - person John Boker; 22.06.2011
comment
я могу получить идентификатор, я хочу индекс, они разные. - person John Boker; 22.06.2011
comment
что вы имеете в виду под индексом? это в виде списка? - person Stefan Bossbaly; 22.06.2011
comment
если у меня есть 5 радиокнопок в радиогруппе, и пользователь выбирает 3-й, я хочу получить 2, индекс выбранного радиокнопки в радиогруппе. это не список. - person John Boker; 22.06.2011
comment
просто чтобы уточнить, выбирает ли пользователь 3-ю кнопку, которую вы хотите получить 2-ю? радиогруппы и кнопки не имеют индексов. - person Stefan Bossbaly; 22.06.2011
comment
нет, индекс 3-й кнопки равен 2, индексация с нуля. первый переключатель имеет индекс 0, второй - 1, третий - 2 и т. д. Вы говорите, что нет хорошего способа получить индекс, это тоже правильный ответ. - person John Boker; 22.06.2011
comment
Вы можете поместить RadioButton в список массивов, а затем запустить поиск идентификатора и преобразовать его в индекс. - person Stefan Bossbaly; 22.06.2011
comment
Ужасная идея, если у вас есть 20+ предметов. - person Exegesis; 04.09.2012

попробуй это

        RadioGroup  group= (RadioGroup) getView().findViewById(R.id.radioGroup);
        group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                View radioButton = radioGroup.findViewById(i);
                int index = radioGroup.indexOfChild(radioButton);
            }
        });
person Nooh    schedule 20.04.2015
comment
Это работает! Но я не могу понять, зачем нам нужно использовать этот вид радиокнопки.. - person AlexS; 12.05.2020

Вы можете либо использовать OnCheckedChangeListener, либо использовать getCheckedRadioButtonId().

person ingsaurabh    schedule 22.06.2011

Ты можешь использовать:

RadioButton rb = (RadioButton) findViewById(rg.getCheckedRadioButtonId());
person Marco Fantasia    schedule 06.10.2012

//используем для получения идентификатора выбранного элемента

int selectedID = myRadioGroup.getCheckedRadioButtonId();

//получить вид выбранного элемента

View selectedView = (View)findViewById( selectedID);
person Jhoe-mar Pagao    schedule 23.05.2013

У меня это отлично сработало следующим образом:

    RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radio_group);
    int radioButtonID = radioGroup.getCheckedRadioButtonId();
    RadioButton radioButton = (RadioButton) radioGroup.findViewById(radioButtonID);
    String selectedtext = (String) radioButton.getText();
person Shinz6    schedule 28.10.2016

Все, что вам нужно, это сначала установить значения для вашего RadioButton, например:

RadioButton radioButton = (RadioButton)findViewById(R.id.radioButton);      
radioButton.setId(1);        //some int value

а затем всякий раз, когда будет выбран этот пространственный radioButton, вы можете получить его значение по идентификатору, который вы ему дали.

RadioGroup radioGroup = (RadioGroup)findViewById(R.id.radioGroup);                     
int whichIndex = radioGroup.getCheckedRadioButtonId(); //of course the radioButton
                                                       //should be inside the "radioGroup"
                                                       //in the XML

Ваше здоровье!

person ravid rinek    schedule 14.03.2017

Поздно на вечеринку, но вот упрощенный ответ Kotlin @ Tarek360, который обслуживает RadioGroups, которые могут содержать не-RadioButtons:

    val RadioGroup.checkedIndex: Int
        get() = children
            .filter { it is RadioButton }
            .indexOfFirst { it.id == checkedRadioButtonId }

Если вы RadioFroup определенно имеете только RadioButton, то это может быть просто:

    private val RadioGroup.checkedIndex = 
        children.indexOfFirst { it.id == checkedRadioButtonId }

Тогда у вас не будет накладных расходов findViewById.

person Myles Bennett    schedule 23.08.2020
comment
Я разместил этот вопрос 9 лет назад, и ответы все еще приходят. Примите мой голос :) - person John Boker; 25.08.2020

просто используйте это:

    int index = 2;
    boolean option3Checked = radioGroup.getCheckedRadioButtonId() == radioGroup.getChildAt(2).getId();
person MADWolfHD    schedule 27.04.2017

Вот расширение Kotlin для получения правильной позиции, даже если ваша группа содержит TextView или любую другую не-RadioButton.

fun RadioGroup.getCheckedRadioButtonPosition(): Int {
    val radioButtonId = checkedRadioButtonId
    return children.filter { it is RadioButton }
        .mapIndexed { index: Int, view: View ->
            index to view
        }.firstOrNull {
            it.second.id == radioButtonId
        }?.first ?: -1
}
person Tarek360    schedule 07.03.2020

ты можешь сделать

findViewById

из радиогруппы.

Вот он образец:

((RadioButton)my_radio_group.findViewById(R.id.radiobtn_veg)).setChecked(true);
person Faheem    schedule 09.09.2015

Вы можете просто

-объявить радиогруппу и радиокнопку из метода onCreate

private RadioGroup GrupName;
private RadioButton NameButton;

-установить идентификатор представления в методе onCreate

GrupName = (RadioGroup) findViewById(R.id.radioGroupid);

-взять идентификатор радиокнопки, выбранный с помощью

int id = GroupName.getCheckedRadioButtonId();

-используйте идентификатор, чтобы он соответствовал представлению, выбранному кнопкой

NameButton = (RadioButton) findViewById(id);

-наконец-то получить значение переключателя

String valueExpected = NameButton.getText().toString();

--- PS: ЕСЛИ ВЫ ХОТИТЕ ЗНАЧЕНИЕ INT, ТО ВЫ МОЖЕТЕ ЕГО ИСПОЛЬЗОВАТЬ

int valueExpectedIn = Integer.parseInt(valueExpected);
person Andrea Gurioli    schedule 13.08.2019

Котлин:

val selectedIndex = radioButtonGroup?.indexOfChild(
  radioButtonGroup?.findViewById(
    radioButtonGroup.getCheckedRadioButtonId())
)
person Anand Kumar    schedule 22.09.2019