Android 多个单选按钮 select
Android radio button multiple select
长话短说。我正在单选组内创建单选按钮。我将根据用户 select 对我的 table 进行过滤。默认情况下,我选中了一个单选按钮。因此,当我尝试检查其他按钮时,它会保持选中状态。事实上,这两个按钮都会被选中。这太奇怪了。也许会发生这种情况,因为我以编程方式执行所有操作。设计仍在进行中。我只是停在这里因为我不知道它是否是视觉错误。我正在使用 Kotlin 进行 android 开发。
显示按钮:
private fun displayChoices(choices: List<FiltersList.Choice>, multipleChoice: Boolean) {
val radioGroup = RadioGroup(this)
for (choice in choices) {
val button = if (multipleChoice) {
CheckBox(this)
} else {
RadioButton(this)
}
button.apply {
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT).apply {
setMargins(16, 8, 16, 8)
}
text = choice.display
isChecked = choice.selected
setTextColor(ResourcesCompat.getColor(resources, R.color.colorTextClicked, null))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
buttonTintList = ColorStateList.valueOf(ResourcesCompat.getColor(resources, R.color.colorButton, null))
}
}
radioGroup.addView(button)
}
filters_content.addView(radioGroup)
}
我的布局:
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="@color/colorFilterBoxBackground"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FilterDialogActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/filters_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:orientation="vertical">
</LinearLayout>
</ScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
观点:
我 select 任何日期按钮以编程方式保留 selected。我从服务器获取默认需要选择哪些项目的数据。
好的,起初我以为这是因为您在 radioGroup 中设置了其他视图,因为 radioButtons 需要是直接子项。但这里的情况并非如此,问题是当以编程方式在 radioGroup 中创建 radioButtons 时,您需要为每个 radioButton 分配特定的 id。
没有找到文档,但我猜 radioGroup 使用按钮 ID 来实现互斥。如此简单的解决方案为您正在创建的每个单选按钮设置一个 id
至于你使用的id,这是文档提到的。
The identifier does not have to be unique in this view's hierarchy. The identifier should be a positive number.
如果它在 Java 中,您可以使用 button.setId(choices.indexOf(choice)+1001);
。我对 Kotlin 不是很好,但我想 Kotlin 的等价物是
id = choices.indexOf(choice) + 1001 //where 1001 i just a random int I used to try avoid conflict
为按钮设置一个 ID,这应该可以解决您的问题。祝你好运。
长话短说。我正在单选组内创建单选按钮。我将根据用户 select 对我的 table 进行过滤。默认情况下,我选中了一个单选按钮。因此,当我尝试检查其他按钮时,它会保持选中状态。事实上,这两个按钮都会被选中。这太奇怪了。也许会发生这种情况,因为我以编程方式执行所有操作。设计仍在进行中。我只是停在这里因为我不知道它是否是视觉错误。我正在使用 Kotlin 进行 android 开发。
显示按钮:
private fun displayChoices(choices: List<FiltersList.Choice>, multipleChoice: Boolean) {
val radioGroup = RadioGroup(this)
for (choice in choices) {
val button = if (multipleChoice) {
CheckBox(this)
} else {
RadioButton(this)
}
button.apply {
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT).apply {
setMargins(16, 8, 16, 8)
}
text = choice.display
isChecked = choice.selected
setTextColor(ResourcesCompat.getColor(resources, R.color.colorTextClicked, null))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
buttonTintList = ColorStateList.valueOf(ResourcesCompat.getColor(resources, R.color.colorButton, null))
}
}
radioGroup.addView(button)
}
filters_content.addView(radioGroup)
}
我的布局:
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="@color/colorFilterBoxBackground"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FilterDialogActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/filters_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:orientation="vertical">
</LinearLayout>
</ScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
观点:
我 select 任何日期按钮以编程方式保留 selected。我从服务器获取默认需要选择哪些项目的数据。
好的,起初我以为这是因为您在 radioGroup 中设置了其他视图,因为 radioButtons 需要是直接子项。但这里的情况并非如此,问题是当以编程方式在 radioGroup 中创建 radioButtons 时,您需要为每个 radioButton 分配特定的 id。
没有找到文档,但我猜 radioGroup 使用按钮 ID 来实现互斥。如此简单的解决方案为您正在创建的每个单选按钮设置一个 id
至于你使用的id,这是文档提到的。
The identifier does not have to be unique in this view's hierarchy. The identifier should be a positive number.
如果它在 Java 中,您可以使用 button.setId(choices.indexOf(choice)+1001);
。我对 Kotlin 不是很好,但我想 Kotlin 的等价物是
id = choices.indexOf(choice) + 1001 //where 1001 i just a random int I used to try avoid conflict
为按钮设置一个 ID,这应该可以解决您的问题。祝你好运。