You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置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字段)判断,不要直接比对对象实例,避免因对象内存地址不一致导致选中状态判断失效。

效果对照

  • 当前实现效果:
    当前UI效果
  • 目标实现效果:
    目标UI效果

内容的提问来源于stack exchange,提问作者AndroidRuntimeException

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:45:36