如何设置MaterialAutoCompleteTextView下拉选中项的背景颜色
MaterialAutoCompleteTextView下拉选中项差异化背景实现方案
你可以通过自定义下拉项布局+重写适配器绑定逻辑实现该效果,不需要修改控件源码,具体操作如下:
- 核心逻辑:下拉列表渲染每个item时,判断当前项是否和控件已选中值一致,动态给item设置对应背景即可。
1. 编写自定义下拉项布局
新建下拉项布局文件res/layout/item_dropdown_option.xml,给文本控件设置id方便后续修改样式:
<?xml version="1.0" encoding="utf-8"?> <com.google.android.material.textview.MaterialTextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv_option" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingHorizontal="16dp" android:paddingVertical="12dp" android:textSize="16sp"/>
2. 准备两种状态的背景资源
在res/drawable目录下新建两个背景文件:
- 未选中状态背景
bg_dropdown_unselected.xml:可设置为纯白色/透明,和默认下拉项样式保持一致 - 选中状态背景
bg_dropdown_selected.xml:设置为你需要的高亮色(比如浅灰、主题色淡色版本)
3. 自定义适配器实现状态判断
继承ArrayAdapter重写getView方法,在渲染item时比对当前项和控件已选值,动态切换背景:
class HighlightSelectedAdapter( context: Context, private val items: List<String>, private val attachedAutoComplete: MaterialAutoCompleteTextView ) : ArrayAdapter<String>(context, R.layout.item_dropdown_option, items) { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val itemView = convertView ?: LayoutInflater.from(context) .inflate(R.layout.item_dropdown_option, parent, false) val optionTv = itemView.findViewById<MaterialTextView>(R.id.tv_option) val currentOption = items[position] optionTv.text = currentOption // 比对当前项和已选中值 val selectedContent = attachedAutoComplete.text?.toString() ?: "" if (currentOption == selectedContent) { optionTv.setBackgroundResource(R.drawable.bg_dropdown_selected) // 可同步修改选中项文字颜色 optionTv.setTextColor(ContextCompat.getColor(context, R.color.colorPrimary)) } else { optionTv.setBackgroundResource(R.drawable.bg_dropdown_unselected) optionTv.setTextColor(ContextCompat.getColor(context, R.color.textRegular)) } return itemView } }
4. 绑定适配器到控件
在页面初始化代码中给MaterialAutoCompleteTextView设置自定义适配器即可:
val optionList = listOf("选项1", "选项2", "选项3", "选项4") binding.autoCompleteTv.apply { setAdapter(HighlightSelectedAdapter(this@MainActivity, optionList, this)) // 可选:设置默认选中项后刷新适配器,保证首次弹出就显示高亮 setText(optionList[0], false) (adapter as HighlightSelectedAdapter).notifyDataSetChanged() }
注意事项
不要直接使用系统自带的
android.R.layout.simple_dropdown_item_1line作为下拉项布局,该布局的默认样式会强制覆盖你设置的背景,必须使用自定义的item布局。
如果选项是自定义实体类,比对选中状态时请使用实体类的唯一标识(比如id字段)判断,不要直接比对对象实例,避免因对象内存地址不一致导致选中状态判断失效。
效果对照
- 当前实现效果:

- 目标实现效果:

内容的提问来源于stack exchange,提问作者AndroidRuntimeException
相关产品推荐
相关产品推荐

