Android SearchView设置selector背景 焦点状态下背景色不生效问题
问题根因
两个配置错误导致效果不生效:
- 你在SearchView根控件上设置的
android:background会被其内部承载输入功能的AppCompatAutoCompleteTextView控件自带的默认背景覆盖,背景根本不会作用到实际的输入区域。 - 状态选择器监听的状态错误:点击SearchView进入输入状态时,触发的是控件的
state_focused聚焦状态,你写的state_selected、state_pressed都不会在输入聚焦时触发,自然匹配不到红色背景。
修复步骤
1. 修正状态选择器
修改search_edit_text_rounded_corner.xml,将监听状态替换为聚焦状态:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/search_edit_text_selected" android:state_focused="true" /> <item android:drawable="@drawable/search_edit_text_default" /> </selector>
2. 将背景设置到SearchView内部的输入控件上
两种实现方式二选一即可:
- 代码设置(兼容性最好)
在初始化SearchView的代码中加入以下逻辑,直接给内部输入框设置背景:
val searchEt = searchView.findViewById<EditText>(androidx.appcompat.R.id.search_src_text) searchEt.setBackgroundResource(R.drawable.search_edit_text_rounded_corner) // 可根据设计稿调整内边距,避免文字贴边 searchEt.setPadding(24, 12, 24, 12)
Java版本代码:
EditText searchEt = searchView.findViewById(androidx.appcompat.R.id.search_src_text); searchEt.setBackgroundResource(R.drawable.search_edit_text_rounded_corner); searchEt.setPadding(24, 12, 24, 12);
- 主题样式配置(无需写代码)
修改现有SearchViewTheme,给内部输入框单独指定样式:
<style name="SearchViewTheme" parent="Widget.AppCompat.SearchView"> <item name="android:textColorHint">@color/hint</item> <item name="android:editTextColor">@color/grey</item> <item name="android:fontFamily">@font/source_sans_pro_light</item> <item name="android:textSize">@dimen/text_size</item> <item name="queryHint">@string/edit_text_hint</item> <item name="iconifiedByDefault">false</item> <!-- 新增配置指定输入框样式 --> <item name="searchEditTextStyle">@style/SearchEditStyle</item> </style> <style name="SearchEditStyle"> <item name="android:background">@drawable/search_edit_text_rounded_corner</item> <item name="android:paddingVertical">12dp</item> <item name="android:paddingHorizontal">24dp</item> </style>
3. 清理冗余配置
删除布局文件中SearchView根节点上的android:background="@drawable/search_edit_text_rounded_corner"属性,避免根布局产生多余绘制。
修改完成后重新编译运行即可实现预期效果:未聚焦时显示默认浅色圆角背景,点击唤起输入、控件获取焦点时自动切换为红色填充红边框的样式。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

