在 Android 中设置鼠标悬停时的菜单项背景颜色

Set menu item background color on hover in Android

我的应用程序中有菜单项,我想在单击时更改项目背景的颜色(请查看屏幕截图 - 单击项目 1)

我在这里只想要一种颜色 - 浅蓝色或深蓝色。但是,如您所见,第一项上有两个。

这是我的代码:

activity 中的工具栏:

    <android.support.v7.widget.Toolbar
            xmlns:sothree="http://schemas.android.com/apk/res-auto"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/main_toolbar"
            sothree:theme="@style/MyActionBar"
            android:layout_alignParentTop="true"
            style="@style/toolbarButton">

            ...

        </android.support.v7.widget.Toolbar>

样式:

    <style name="toolbarButton">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:clickable">true</item>
    </style>
    <style name="MyActionBar"
        parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@color/material_dark_blue</item>
        <item name="android:displayOptions">showHome|homeAsUp|showTitle</item>
        <item name="android:icon">@android:color/transparent</item>
        <item name="android:centerX">@android:integer/config_shortAnimTime</item>
        <item name="windowActionBar">false</item>
    </style>
    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:textColor">@color/material_white</item>
        <item name="android:popupMenuStyle">@style/CustomOverflowBack</item>
        <item name="android:itemTextAppearance">@android:color/white</item>
    </style>

清单:

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:hardwareAccelerated="false"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

非常感谢任何帮助。

更新: 添加 CustomOverflowBack:

    <style name="CustomOverflowBack" parent="@android:style/Widget.Holo.Light.ListPopupWindow">
        <item name="android:popupBackground">@drawable/menu_item</item>
    </style>

Menu_item.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listview_background_shape">

    <stroke android:width="1dp" android:color="@color/material_dark_blue" />
    <solid android:color="@color/actionbar_item_bg_color" />

</shape>

@Tom11 您必须为工具栏的弹出式覆盖声明自定义样式。

创建一个扩展 ThemeOverlay 的样式:

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:colorBackground">@color/colorPrimaryDark</item> 
    <item name="colorControlHighlight">@color/colorAccent</item> 
</style>

In above style replace @color/colorPrimaryDark with your background color and @color/colorAccent with your selected background color.

然后在你的工具栏声明中使用它。

<android.support.v7.widget.Toolbar
     android:id="@+id/toolbar"
     android:layout_width="match_parent"
     android:layout_height="?attr/actionBarSize"
     android:background="?attr/colorPrimary"
     style="@style/toolbarButton"
     app:popupTheme="@style/AppTheme.PopupOverlay"/>

这将解决您的问题。

更新: 进行以下更改:

  1. android:background="?attr/colorPrimary" 更改为 android:background="@color/material_dark_blue",并在上面的工具栏项中使用您的操作栏背景颜色。

  2. 从您的 MyActionBar 样式中删除 <item name="android:background">@color/material_dark_blue</item>

因此工具栏和 MyActionBar 样式的更新代码如下:

  <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/material_dark_blue"
            style="@style/toolbarButton"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:theme="@style/MyActionBar"/>

 <style name="MyActionBar"
           parent="Widget.AppCompat.ActionBar">
        <item name="android:displayOptions">showHome|homeAsUp|showTitle</item>
        <item name="android:icon">@android:color/transparent</item>
        <item name="android:centerX">@android:integer/config_shortAnimTime</item>
        <item name="windowActionBar">false</item>
    </style>

这应该终于奏效了。

替换这个

<style name="toolbarButton">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:clickable">true</item>
</style>
<style name="MyActionBar"
    parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@color/material_dark_blue</item>
    <item name="android:displayOptions">showHome|homeAsUp|showTitle</item>
    <item name="android:icon">@android:color/transparent</item>
    <item name="android:centerX">@android:integer/config_shortAnimTime</item>
    <item name="windowActionBar">false</item>
</style>
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:textColor">@color/material_white</item>
    <item name="android:popupMenuStyle">@style/CustomOverflowBack</item>
    <item name="android:itemTextAppearance">@android:color/white</item>
</style>

<style name="CustomOverflowBack" parent="@android:style/Widget.Holo.Light.ListPopupWindow">
    <item name="android:popupBackground">@drawable/menu_item</item>
</style>

有了这个:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="actionBarPopupTheme">@style/AppThemeOverlay.Popup</item>
</style>

<style name="AppThemeOverlay.Popup" parent="ThemeOverlay.AppCompat.Dark">
    <item name="android:colorBackground">popup menu background color</item>
    <item name="colorControlHighlight">selected item color</item>
</style>

使用方法如下:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?actionBarSize"
    android:background="?colorPrimary"
    android:elevation="4dp"
    app:popupTheme="?actionBarPopupTheme"/>

以上内容足以使其在 API 21 及更高版本上运行。

我遗漏了你的 toolbarButton 风格,因为它与问题无关。

这里有一些提示

<style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">

不对 AppCompat 小部件使用平台样式。如果您使用 AppCompat 样式 @style/Widget.AppCompat.ActionBar,您将不得不实际覆盖 none 属性。

<item name="android:background">@color/material_dark_blue</item>

主题中的背景将应用于任何未覆盖它的视图。这就是您看到蓝色方块的原因。 android:background 是一个 style 属性,在小部件上使用它。 android:colorBackground 是一个 theme 属性,它用于(除其他外)为 android:popupBackground 着色,它提供了弹出菜单的形状。

<item name="android:textColor">@color/material_white</item>

文本颜色更多地是用于 TextView 的样式属性。广泛使用的主题属性是 android:textColorPrimaryandroid:textColorSecondary。改用那些。 android:textColor 在一个主题中可能会产生 unexpected/undesired 个结果。

<item name="android:itemTextAppearance">@android:color/white</item>

不要不要 将颜色资源放入style/text 外观属性中。它不会工作或崩溃或更糟的是会在不崩溃的情况下产生意想不到的结果。