如何在安卓的芯片组中以编程方式选择默认芯片?



TL;DR - 以编程方式选择默认选项芯片的正确方法是什么,该芯片是 Android 中 ChipGroup 的子级?

--

在我的 android 应用程序中,我使用样式为@style/Widget.MaterialComponents.Chip.Choice组件的com.google.android.material.chip.Chip来表示用户可以为给定路线选择的活动选择(想想步行、骑自行车等(

由于路由可以具有不同类型的活动,因此我以编程方式将每种类型作为不同的芯片插入到com.google.android.material.chip.ChipGroup中。我还选择默认芯片作为在我的片段的 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 的布局定义,其中 I 设置单选等

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" />

我面临的问题是,即使用户通过 UI 交互选择不同的芯片,以编程方式设置为已选择的芯片chip.isSelected = true仍保持选中状态。

以编程方式选择默认选项芯片的正确方法是什么,该芯片是 Android 中 ChipGroup 的子项?

找到了我的答案。

  • 使用View.generateViewId()并将新 ID 分配给 新创建的芯片。然后,添加
  • 将芯片添加到其父芯片组
  • 使用viewBinding.typeChipGroup.check(id)检查芯片视图芯片组

这是最终代码:

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)
}
}

当前类型 == 空条件在下次选择时将为假。您是否在其他任何地方将其设为空?

使用 ChipGroup 的 setOnCheckedChangeListener 检查芯片选择的状态,而不是 chip.setOnClickListener

val chipGroup = findViewById<ChipGroup>(R.id.chip_group)
val tileSize320 = findViewById<Chip>(R.id.tile_size320)
chipGroup.check(tileSize320)

最新更新