如何以编程方式 select Android 中 ChipGroup 中的默认 Chip?
How to programatically select the default Chip in a ChipGroup in Android?
TL;DR - 以编程方式 select 作为 Android 中 ChipGroup 子项的默认选择 Chip 的正确方法是什么?
--
在我的 android 应用程序中,我使用 com.google.android.material.chip.Chip
样式为 @style/Widget.MaterialComponents.Chip.Choice
组件来表示用户可以 select 为给定路线选择的活动(想想步行、自行车等)
因为一条路线可以有不同类型的活动,我将每种类型作为不同的芯片以编程方式插入 com.google.android.material.chip.ChipGroup
。我还 select 默认芯片是在我的片段
的 onViewCreated() 期间使用以下代码插入列表中的第一个
private fun setupTypeSelection(types: List<Type>) {
types.forEach { type ->
val chip = layoutInflater.inflate(R.layout.chip_type, viewBinding.typeChipGroup, false) as Chip
chip.tag = type
/* Init chip text and icon */
chip.setOnClickListener {
/* Update selected type */
}
if (currentType == null) {
chip.isSelected = true
currentType = type
}
viewBinding.typeChipGroup.addView(chip)
}
}
这是 ChipGroup 的布局定义,其中我设置了单个 selection 等
chip_group_layout.xml
<com.google.android.material.chip.ChipGroup
android:id="@+id/type_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_medium"
app:chipSpacingHorizontal="@dimen/margin_medium"
app:selectionRequired="true"
app:singleLine="true"
app:singleSelection="true" />
这是芯片布局
chip_type.xml
<com.google.android.material.chip.Chip xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="@style/Widget.MaterialComponents.Chip.Choice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:chipIconEnabled="true" />
我面临的问题是,以编程方式设置为 selected chip.isSelected = true
的芯片仍然保持 selected,即使在用户 selects 不同的芯片之后通过 UI 互动。
以编程方式 select 作为 Android 中 ChipGroup 子项的默认选择 Chip 的正确方法是什么?
currentType == null 条件对于下一次选择将为 false。您是否在其他任何地方将其设置为 null?
使用ChipGroup的setOnCheckedChangeListener来检查片选状态而不是chip.setOnClickListener
找到我的答案。
- 使用
View.generateViewId()
并将新的Id分配给
新创建的芯片。然后,添加
- 将芯片添加到其父芯片组
- 使用
viewBinding.typeChipGroup.check(id)
检查芯片视图ChipGroup
这是最终代码:
private fun setupTypeSelection(types: List<Trail.Type>) {
types.forEach { type ->
val chip = layoutInflater.inflate(R.layout.chip_trail_type, viewBinding.typeContainer, false) as Chip
chip.id = View.generateViewId()
/* Set chip details as usual */
viewBinding.typeContainer.addView(chip)
if (currentType == null) viewBinding.typeChipGroup.check(chip.id)
}
}
TL;DR - 以编程方式 select 作为 Android 中 ChipGroup 子项的默认选择 Chip 的正确方法是什么?
--
在我的 android 应用程序中,我使用 com.google.android.material.chip.Chip
样式为 @style/Widget.MaterialComponents.Chip.Choice
组件来表示用户可以 select 为给定路线选择的活动(想想步行、自行车等)
因为一条路线可以有不同类型的活动,我将每种类型作为不同的芯片以编程方式插入 com.google.android.material.chip.ChipGroup
。我还 select 默认芯片是在我的片段
private fun setupTypeSelection(types: List<Type>) {
types.forEach { type ->
val chip = layoutInflater.inflate(R.layout.chip_type, viewBinding.typeChipGroup, false) as Chip
chip.tag = type
/* Init chip text and icon */
chip.setOnClickListener {
/* Update selected type */
}
if (currentType == null) {
chip.isSelected = true
currentType = type
}
viewBinding.typeChipGroup.addView(chip)
}
}
这是 ChipGroup 的布局定义,其中我设置了单个 selection 等
chip_group_layout.xml
<com.google.android.material.chip.ChipGroup
android:id="@+id/type_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_medium"
app:chipSpacingHorizontal="@dimen/margin_medium"
app:selectionRequired="true"
app:singleLine="true"
app:singleSelection="true" />
这是芯片布局
chip_type.xml
<com.google.android.material.chip.Chip xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="@style/Widget.MaterialComponents.Chip.Choice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:chipIconEnabled="true" />
我面临的问题是,以编程方式设置为 selected chip.isSelected = true
的芯片仍然保持 selected,即使在用户 selects 不同的芯片之后通过 UI 互动。
以编程方式 select 作为 Android 中 ChipGroup 子项的默认选择 Chip 的正确方法是什么?
currentType == null 条件对于下一次选择将为 false。您是否在其他任何地方将其设置为 null?
使用ChipGroup的setOnCheckedChangeListener来检查片选状态而不是chip.setOnClickListener
找到我的答案。
- 使用
View.generateViewId()
并将新的Id分配给 新创建的芯片。然后,添加 - 将芯片添加到其父芯片组
- 使用
viewBinding.typeChipGroup.check(id)
检查芯片视图ChipGroup
这是最终代码:
private fun setupTypeSelection(types: List<Trail.Type>) {
types.forEach { type ->
val chip = layoutInflater.inflate(R.layout.chip_trail_type, viewBinding.typeContainer, false) as Chip
chip.id = View.generateViewId()
/* Set chip details as usual */
viewBinding.typeContainer.addView(chip)
if (currentType == null) viewBinding.typeChipGroup.check(chip.id)
}
}