开发者

Get the array of RadioButtons in a RadioGroup in Android

Is there any way of getting an array (or a collection) of the RadioButtons in an Android开发者_开发问答 RadioGroup? I would like to add individual listeners to radio buttons but I don't see any obvious way of iterating over them.


this should do the trick:

        int count = radioGroup.getChildCount();
        ArrayList<RadioButton> listOfRadioButtons = new ArrayList<RadioButton>();
        for (int i=0;i<count;i++) {
            View o = radioGroup.getChildAt(i);
            if (o instanceof RadioButton) {
                listOfRadioButtons.add((RadioButton)o);
            }
        }
        Log.d(TAG,"you have "+listOfRadioButtons.size()+" radio buttons");


Why do you need to query the radioGroup? Why cant you directly set your listeners on the RadioButton, you must be able to get a hold of the radioButtons since you are the one who is adding them to the RadioGroup.

Regardless, RadioGroup is simply a special type of LinearLayout, all its children are RadioButtons that you have added. You can loop through all the child views to access the RadioButtons.


Working example for RadioGroup with five RadioButtons (Kotlin):

private fun initUIListeners() {    
    with(binding) {
        rb1.setOnClickListener(rbClick(radioGroup))
        rb2.setOnClickListener(rbClick(radioGroup))
        rb3.setOnClickListener(rbClick(radioGroup))
        rb4.setOnClickListener(rbClick(radioGroup))
        rb5.setOnClickListener(rbClick(radioGroup))
    }
}

private fun rbClick(radioGroup: RadioGroup): (View) -> Unit = {
    val radioButton = it as MaterialRadioButton
    when {
        !radioButton.isSelected -> {
            radioButton.isChecked = true
            radioButton.isSelected = true
            unselectExcept(radioButton, radioGroup)
        }
        else -> {
            radioButton.isChecked = false
            radioButton.isSelected = false
            radioGroup.clearCheck()
        }
    }
}

private fun unselectExcept(
    radioButton: MaterialRadioButton,
    radioGroup: RadioGroup,
) = (0 until radioGroup.childCount)
    .map { radioGroup.getChildAt(it) }
    .filterIsInstance<MaterialRadioButton>()
    .filter { it != radioButton }
    .forEach { it.isSelected = false }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜