Is there any way of getting an array (or a collection) of the RadioButton
s 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 }
精彩评论