安卓:当菜单项被按下时的背景颜色

5

我试图在菜单项被按下时更改背景颜色。改变背景颜色但不改变按下时的颜色。

期望效果:

  • 背景:深灰色
  • 按下时背景:橙色

实际效果:

  • 背景:深灰色
  • 按下时背景:蓝色(默认 Android)

请问我该怎么做?谢谢。

enter image description here

Styles.xml

<style name="AppTheme2" parent="android:Theme.Holo">  
    <item name="android:popupMenuStyle">@style/MyApp.PopupMenu</item>
</style>

<style name="MyApp.PopupMenu" parent="android:Widget.Holo.ListPopupWindow">
    <item name="android:popupBackground">@drawable/menu_item_selector</item>
</style>

menu_item_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/menu_item_fondo_pressed" android:state_focused="true"/>
<item android:drawable="@drawable/menu_item_fondo_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/menu_item_fondo"/>

</selector>

请参考此问题:https://dev59.com/SWMk5IYBdhLWcg3w2ReT - Kamesh
我使用了ActionBar Style Generator。但是我不知道需要哪些可绘制对象。 - user4152
1个回答

5

回答有点晚了,但找到了解决问题的方法。

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>

还有textColordropDownSelector项目,在我测试的设备上没有任何作用,但我也在这里更改了它们,以防万一,因为父级 (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" />

<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<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" />

虽然这是一个微不足道的事情,但是它需要解释的内容有些长,但我们最终还是解决了。耶!


谢谢!你的实验和解释对我非常有用 :) - HendraWD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接