AppCompatAutoCompleteTextView下拉弹窗背景无法更新问题求助
解决AppCompatAutoCompleteTextView下拉背景与选择器无效的思路
1. 自定义下拉列表项布局,强制设置选择器
默认下拉列表的样式由Adapter绑定的布局决定,直接在控件上设置dropDownSelector可能被默认布局覆盖。
- 创建列表项布局
res/layout/item_dropdown_topic.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="48dp" android:paddingStart="12dp" android:paddingEnd="12dp" android:gravity="center_vertical" android:textColor="@color/white" android:background="@drawable/dropdown_item_selector"/>
- 编写状态选择器
res/drawable/dropdown_item_selector.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/lightness100" android:state_pressed="true"/> <item android:drawable="@color/lightness100" android:state_focused="true"/> <item android:drawable="@color/darkness100"/> </selector>
- 初始化Adapter时使用自定义布局:
List<String> topicList = Arrays.asList("话题1", "话题2", "话题3"); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.item_dropdown_topic, topicList); topicEt.setAdapter(adapter);
2. 通过Theme覆盖全局样式
如果App主题的全局属性覆盖了控件设置,可以给AutoCompleteTextView单独指定主题:
- 在
res/values/styles.xml中定义自定义主题:
<style name="DropdownCustomTheme" parent="ThemeOverlay.AppCompat.Dark"> <item name="android:listPopupWindowStyle">@style/CustomListPopupWindow</item> </style> <style name="CustomListPopupWindow" parent="Widget.AppCompat.ListPopupWindow"> <item name="android:popupBackground">@color/darkness100</item> <item name="android:listSelector">@drawable/dropdown_item_selector</item> </style>
- 在布局中给控件添加主题属性:
<androidx.appcompat.widget.AppCompatAutoCompleteTextView ... android:theme="@style/DropdownCustomTheme"/>
3. 代码层面直接修改弹窗属性
通过获取ListPopupWindow实例,直接设置背景和选择器:
topicEt.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_UP) { ListPopupWindow popup = ((AppCompatAutoCompleteTextView) v).getListPopupWindow(); // 设置弹窗背景 popup.setPopupBackgroundDrawable(ContextCompat.getDrawable(this, R.drawable.corner_shape_spinner_darkness)); // 设置列表项选择器 popup.getListView().setSelector(ContextCompat.getDrawable(this, R.drawable.dropdown_item_selector)); } return false; });
4. 检查dropDownSelector的正确用法
避免直接用颜色值作为选择器,必须使用StateListDrawable。如果一定要用颜色,可将颜色包装进selector(如步骤1中的dropdown_item_selector.xml),再绑定到android:dropDownSelector属性。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

