回答有点晚了,但找到了解决问题的方法。
在 styles.xml 中,您有您的AppTheme:
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:dropDownListViewStyle">@style/ListViewStyle</item>
<item name="dropDownListViewStyle">@style/ListViewStyle</item>
<item name="popupMenuStyle">@style/PopupMenu</item>
<item name="textAppearanceLargePopupMenu">@style/PopupMenuTextAppearanceLarge</item>
<item name="textAppearanceSmallPopupMenu">@style/PopupMenuTextAppearanceSmall</item>
<item name="android:textAppearanceLargePopupMenu">@style/PopupMenuTextAppearanceLarge</item>
<item name="android:textAppearanceSmallPopupMenu">@style/PopupMenuTextAppearanceSmall</item>
</style>
popupMenuStyle 是针对弹出菜单本身的样式,我们可以通过更改 popupBackground 项来改变其未选中背景,像这样(但您可能已经知道):
<style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
<item name="android:popupBackground">@drawable/selector_popup_menu_bg</item>
<item name="android:textColor">@color/text_color_white</item>
<item name="android:dropDownSelector">@drawable/selector_popup_menu_dropdown</item>
</style>
还有textColor和dropDownSelector项目,在我测试的设备上没有任何作用,但我也在这里更改了它们,以防万一,因为父级 (Widget.PopupMenu) 也使用它们。
正确更改这些项目的方法是像我在上面的AppTheme代码中所示,在AppTheme中更改它们。我不会展示textAppearances的代码,因为这不是主题。
我将每个项目都添加了两次(带和不带“android:”前缀),以使其在5.0及以下版本的设备上均可使用。唯一的例外是popupMenuStyle,如果您使用框架版本的Popup
,则只需要一个不带“android:”前缀的项目,但如果您使用support.v7
版本,则需要android:popupMenuStyle
(有关更多信息,请参见此StackOverflow答案)。
因此,要使选定的项目具有不同的背景,我们只需在dropDownListViewStyle中更改它即可(我还额外添加了divider):
<style name="ListViewStyle" parent="@android:style/Widget.ListView">
<item name="android:listSelector">@drawable/selector_popup_menu_dropdown</item>
<item name="android:divider">@color/text_color_white</item>
<item name="android:dividerHeight">1dp</item>
</style>
有趣的部分是listSelector,它是选定项目的背景。如果我们只添加@color,则无法正确地使选定的项目失效(即使您将选择移到其外面,它仍将保持选定状态),为了使其正确,需要使用选择器而不是颜色:
selector_popup_menu_dropdown.xml
<?xml version="1.0" encoding="utf-8"?>
<item android:state_window_focused="false" android:drawable="@android:color/transparent" />
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@color/gray_btn_bg_color" />
<item android:state_focused="true" android:state_enabled="false" android:drawable="@color/gray_btn_bg_color" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@color/gray_btn_bg_color" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@color/gray_btn_bg_color" />
<item android:state_focused="true" android:drawable="@color/gray_btn_bg_color" />
虽然这是一个微不足道的事情,但是它需要解释的内容有些长,但我们最终还是解决了。耶!