Как заставить RadioGroup программно выбирать только один RadioButton за раз?

Я программно разрабатываю форму настройки, в которой пользователь может задать вопрос и добавить несколько параметров с помощью переключателей. Я взял RadioGroup и добавил в него радиокнопки. Но при выборе я хочу, чтобы за раз выбирался только один переключатель. Как это реализовать программно. Помогите мне, пожалуйста..

Вот мой код

final RadioGroup radioGroup = new RadioGroup(getApplicationContext());
radioGroup.setId(1);
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.FILL_PARENT,
                                LinearLayout.LayoutParams.WRAP_CONTENT);

RadioButton radioButtonView = new  RadioButton(getApplicationContext());
radioButtonView.setId(i++);
radioButtonView.setText(addnew);

radioGroup.addView(radioButtonView, p);
loption.addView(radioGroup, p);

Заранее спасибо,


person Snehal    schedule 18.02.2014    source источник
comment
Пожалуйста, предоставьте код того, что вы пробовали, и что у вас не работает   -  person stamanuel    schedule 18.02.2014
comment
В чем проблема в вашей реализации прямо сейчас? Если вы пробовали что-нибудь программно   -  person Pararth    schedule 18.02.2014
comment
Итак, вы создаете новый RadioGroup для каждого RadioButton? Если все RadioButton входят в один и тот же RadioGroup, вы должны получить поведение, которое ищете? Или фрагмент кода из нескольких мест в вашем коде?   -  person Andreas Løve Selvik    schedule 18.02.2014
comment
radioButtonView.setId(i++); где вообще находится i? вы используете весь этот код внутри цикла for?   -  person SMR    schedule 18.02.2014
comment
Я добавил радиокнопки в группу радио. Прямо сейчас я могу выбрать несколько переключателей. Но я хочу, чтобы одновременно выбирался только один переключатель.   -  person Snehal    schedule 18.02.2014
comment
Не могли бы вы также показать нам окружающий код? Я думаю, вам нужно сохранить ссылку на RadioGroup всех остальных RadioButton, и когда вы захотите добавить новый RadioButton, просто добавьте его к этому RadioGroup.   -  person Andreas Løve Selvik    schedule 18.02.2014
comment
Спасибо ... я получил свою ошибку ... по ошибке я создаю радиогруппу каждый раз ... поэтому она не работает должным образом ... В любом случае, спасибо ... я попробую ...   -  person Snehal    schedule 18.02.2014
comment
Нет проблем :) Было бы неплохо, если бы вы могли отметить мой ответ как решение, если оно действительно сработало. То же самое касается всех вопросов, которые вы задавали ранее.   -  person Andreas Løve Selvik    schedule 18.02.2014


Ответы (4)


Кажется, вы делаете новый RadioGroup для каждого RadioButton.

Вы должны добавлять каждый новый RadioButton к одному и тому же RadioGroup. Затем RadioGroup будет следить за тем, чтобы одновременно можно было выбрать только один RadioButton.

person Andreas Løve Selvik    schedule 18.02.2014

Я пробовал ту же проблему, когда вставляю LinearLayout, чтобы поместить радиокнопки в сетку.

Я решил так. Учитывая, что у нас больше RadioGroups, мы знаем RadioButton, который был нажат. По этой причине просто удалите прослушиватель из всех ваших RadioGroups, а затем отмените выбор всех RadioButtons, сбросив onCheckedChangeListener в свою RadioGroup.

Это мой код:

onCheckedChangeListener= new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {
            clearAllRadioButton();
            ((RadioButton) binding.getRoot().findViewById(i)).setChecked(true);
            resetListenerRadioGroup();
        }
    };

    onCheckedChangeListener2 = new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {
            clearAllRadioButton();
            ((RadioButton) binding.getRoot().findViewById(i)).setChecked(true);
            resetListenerRadioGroup();
        }
    };


    binding.rg.setOnCheckedChangeListener(onCheckedChangeListener);
    binding.rg2.setOnCheckedChangeListener(onCheckedChangeListener2);



private void clearAllRadioButton() {
    binding.rg2.setOnCheckedChangeListener(null);
    binding.rg.setOnCheckedChangeListener(null);
    binding.failed.setChecked(false);
    binding.draft.setChecked(false);
    binding.sent.setChecked(false);
    binding.inbox.setChecked(false);
}

private void resetListenerRadioGroup(){
    binding.rg2.setOnCheckedChangeListener(onCheckedChangeListener2);
    binding.rg.setOnCheckedChangeListener(onCheckedChangeListener);
}

* не используйте функцию clearCheck() радиобуттона, потому что она плохо отвечает при сбросе слушателей.

person AlexPad    schedule 23.09.2017

Проверьте это, это сработает для вас:

Сначала получите RadioButton:

RadioButton radioBalls = (RadioButton) findViewById(R.id.radioGameInPlayBalls);
RadioButton radioTime = (RadioButton) findViewById(R.id.radioGameInPlayTime);
radioBalls.setOnCheckedChangeListener(this);
radioTime.setOnCheckedChangeListener(this);

Сейчас в @overide method:

 @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean c) {
        switch (buttonView.getId()) {
        case R.id.radioGameInPlayBalls:
            if (radioTime.isChecked() && c) {
                radioBalls.setChecked(false);
                return;
            }
            radioBalls.setEnabled(c);
        break;
    case R.id.radioGameInPlayTime:
        if (radioBalls.isChecked() && c) {
            radioTime.setChecked(false);
            return;
        }
        radioTime.setEnabled(c);
        break;
    default:
        break;
    }



}
person Kishan Dhamat    schedule 18.02.2014

Вы должны проверить переключатель с помощью RadioGroup, а не переключателя напрямую. Ниже я заполняю группу переключателей из списка параметров и получаю идентификатор переключателя параметра, который нужно проверить, и проверяю соответствующую кнопку после заполнения группы переключателей. То же самое происходит, если вы определяете проверенную опцию по индексу.

int checkedId = -1; 

for(JsonElement option : options){

    RadioButton radioButton = new RadioButton(getContext());

    radioGroup.addView(radioButton);

    if(checkedOptionId.equals(id)){
        checkedId = radioButton.getId();
    }
}

radioGroup.check(checkedId);
person Esed    schedule 14.07.2016