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

Я разрабатываю программно настроить форму, где пользователь может поставить вопрос и добавить несколько параметров с помощью переключателей. Я взял 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);

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

5 ответов


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

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


 @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        Log.d(TAG, "onCheckedChanged  " + buttonView.getId());
        mRadioGroup.clearCheck();
        if (isChecked) {
            mRadioGroup.check(buttonView.getId());
        }
    }

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

Я решил таким образом. Учитывая, что у нас больше Радиогрупп, мы знаем Радиобуттон, который был нажат. По этой причине, просто удалить слушателя из всех ваших RadioGroups, а затем снимите все переключатели, сброс 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);
}

*Не используйте очистку radioButton () потому что он не отвечает Хорошо при сбросе слушателей.


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

Сначала Получить 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;
    }



}

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

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);