Я написал очень простой GridLayout
подкласс, который действует как RadioGroup
. Вот как это выглядит:
![GridLayout RadioGroup with RadioButton](https://i.stack.imgur.com/4vWzM.png)
Чтобы использовать его, сначала добавьте библиотеку GridLayout
:
implementation "androidx.gridlayout:gridlayout:1.0.0-beta01"
Затем скопируйте и вставьте подкласс GridLayout
:
**
* A GridLayout subclass that acts like a RadioGroup. Important: it only accepts RadioButton as children.
* Inspired by https://stackoverflow.com/a/2383978/4034572
*/
class GridRadioGroup @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : GridLayout(context, attrs, defStyleAttr), View.OnClickListener {
@IdRes var selectedRadioButtonId: Int? = null
get() = getSelectedRadioButton()?.id
private set
private fun getSelectedRadioButton(): RadioButton? {
for (index in 0 until childCount) {
val radioButton = getChildAt(index) as RadioButton
if (radioButton.isChecked) return radioButton
}
return null
}
override fun onClick(view: View) {
// While this looks inefficient, it does fix a bug (2 RadioButtons could be selected at the
// same time) when navigating back by popping-up a fragment from the backstack.
for (index in 0 until childCount) {
val radioButton = getChildAt(index) as RadioButton
radioButton.isChecked = false
}
val radioButton = view as RadioButton
radioButton.isChecked = true
}
override fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?) {
super.addView(child, index, params)
child?.setOnClickListener(this)
}
}
Наконец, просто используйте его:
<com.example.ui.GridRadioGroup
android:id="@+id/gridRadioGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:columnCount="2"
>
<RadioButton
android:id="@+id/option_1"
style="@style/GridRadioButton"
android:drawableTop="@drawable/option_1"
android:text="@string/register_choose_goal_option_1"
app:layout_columnWeight="1"
app:layout_rowWeight="1"
/>
<RadioButton
android:id="@+id/option_2"
style="@style/GridRadioButton"
android:drawableTop="@drawable/option_2"
android:text="@string/option_2"
app:layout_columnWeight="1"
app:layout_rowWeight="1"
tools:checked="true"
/>
<RadioButton
android:id="@+id/option_3"
style="@style/GridRadioButton"
android:drawableTop="@drawable/option_3"
android:text="@string/option_3"
app:layout_columnWeight="1"
app:layout_rowWeight="1"
tools:checked="true"
/>
<RadioButton
android:id="@+id/option_4"
style="@style/GridRadioButton"
android:drawableTop="@drawable/preparar_carrera"
android:text="@string/option_4"
app:layout_columnWeight="1"
app:layout_rowWeight="1"
/>
</com.example.ui.GridRadioGroup>
Стиль:
<style name="GridRadioButton">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_margin">10dp</item>
<item name="android:background">@drawable/button_option_background_selector</item>
<item name="android:drawablePadding">16dp</item>
<item name="android:button">@null</item>
<item name="android:gravity">center_horizontal</item>
<item name="android:padding">20dp</item>
<item name="android:textColor">@drawable/text_button_option_color_selector</item>
<item name="android:textSize">14sp</item>
</style>
Код прост, но у меня работает нормально. Если вы хотите что-то более complete (например, с OnCheckedChangeListener
), тогда проверьте эту альтернативную реализацию , которая явно более сложна и на уровне функций с RadioGroup
.