更改操作栏 onPressed 颜色

15

我不知道如何在Android上更改操作栏项目的“onPressed”颜色。我指的不是操作栏背景颜色,而是蓝色的过渡状态。我该如何更改这个颜色或者至少把它去掉?例如,带有homeAsUpIndicator的应用程序图标。

我尝试更改操作栏样式和菜单项样式,但都没有生效。

谢谢

编辑 这是我目前的实现:

我的样式XML:

<style name="Theme.AppTheme" parent="@android:style/Theme.Holo">
    <item name="android:actionBarStyle">@style/MyActionBar</item>
    <item name="android:selectableItemBackground">@android:color/transparent</item>
    <item name="android:windowEnterAnimation">@anim/fadein</item>
    <item name="android:windowExitAnimation">@anim/fadeout</item>        
    <item name="android:actionBarItemBackground">@android:color/transparent</item>
</style>

<style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:background">@drawable/actionbarheader</item>
    <item name="android:backgroundStacked">@drawable/actionbarheader</item>
    <item name="android:backgroundSplit">@drawable/actionbarheader</item>
    <item name="android:titleTextStyle">@style/ActionBarTitle</item>
    <item name="android:actionBarItemBackground">@android:color/transparent</item>
    <item name="android:actionButtonStyle">@style/MyActionButtonStyle</item>
    <item name="android:homeAsUpIndicator">@drawable/actionbarlogo</item>
    <item name="android:icon">@drawable/app_icon</item>>
</style>

<style name="ActionBarTitle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="android:textSize">20sp</item>
</style>

<style name="MyActionButtonStyle" parent="@android:style/Widget.Holo.Light.ActionButton">
    <item name="android:background">@android:color/transparent</item>
</style>

那么我有一个用于actionbarogo的可绘制对象:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@drawable/actionbarlogo_on" android:state_pressed="true"/>
  <item android:drawable="@drawable/actionbarlogo_on" android:state_focused="true"/>
  <item android:drawable="@drawable/actionbarlogo_off"/>
</selector>

我的操作栏菜单xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/ContactsMode"
        android:icon="@drawable/actionbarcontacts"
        android:title="@string/contacts"
        android:orderInCategory="100"
        android:showAsAction="always"
        android:background="@android:color/transparent" />
</menu>

最后是该项的可绘制资源:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@drawable/actionbarcontacts_on" android:state_pressed="true"/>
  <item android:drawable="@drawable/actionbarcontacts_on" android:state_focused="true"/>
  <item android:drawable="@drawable/actionbarcontacts_off"/>
</selector>

以下是我创建 ActionBar 菜单项的方法:

public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
        actionBar.setIcon(R.drawable.actionbarlogo);
        return true;
    }

    public boolean onPrepareOptionsMenu(Menu menu) {        
         MenuItem item= menu.findItem(R.id.ContactsMode);
         if(ContactsButton)
             item.setVisible(true);      
         else
            item.setVisible(false);

         return true;   
    }

你想要更改操作栏中哪些项目的背景?只是菜单项吗?还是你想要更改所有项目的按下背景(包括带有homeAsUpIndicator和溢出图标的应用程序图标)? - Tomik
2个回答

38

如果要为应用程序图标和homeAsUpIndicator设置相同的背景(这两个图标有一个共同的背景),则必须在主题中设置android:actionBarItemBackground项目。主题必须包含类似于以下内容(假设您使用ActionBarSherlock):

<style name="MyTheme" parent="@style/Theme.Sherlock">
    <!-- for ActionBarSherlock -->
    <item name="actionBarItemBackground">@drawable/my_background</item>
    <!-- for native ActionBar -->
    <item name="android:actionBarItemBackground">@drawable/my_background</item>
</style>

可绘制对象drawable/my_background.xml将是一个StateListDrawable,其中包含类似以下内容:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@drawable/my_background_pressed" />
    <item
        android:drawable="@drawable/my_background_normal" />
</selector>

为完全禁用背景,您可以将背景设置为透明或在主题中设置值@null也可能起作用。

主题项android:actionBarItemBackground设置应用程序图标和homeAsUpIndicator的背景。但它还设置了菜单项的默认背景、溢出图标和标题背景。这些背景可以被重写。

菜单项

要更改菜单项背景,请在主题中设置正确的(android:)actionButtonStyle

<style name="MyTheme" parent="@style/Theme.Sherlock">
    <item name="actionButtonStyle">@style/MyActionButtonStyle</item>
    <item name="android:actionButtonStyle">@style/MyActionButtonStyle</item>
</style>

我的MyActionButtonStyle将包含类似以下的内容:

<style name="MyActionButtonStyle" parent="@style/Widget.Sherlock.ActionButton">
    <item name="android:background">@drawable/my_background</item>
</style>

溢出图标

最后,要更改溢出图标的背景,请在主题中设置正确的android:actionOverflowButtonStyle,如下所示:

<style name="MyTheme" parent="@style/Theme.Sherlock">
    <item name="actionOverflowButtonStyle">@style/MyOverflowButtonStyle</item>
    <item name="android:actionOverflowButtonStyle">@style/MyOverflowButtonStyle</item>
</style>

我的 MyOverflowButtonStyle 将包含以下内容:

<style name="MyOverflowButtonStyle" parent="@style/Widget.Sherlock.ActionButton.Overflow">
    <item name="android:background">@drawable/my_background</item>
</style>

嗨Tomik,谢谢你的回答。我尝试了它(请参见问题编辑),但我仍然有Holo蓝色叠加层... - Showpath
我已经检查了你的代码,只要你不使用ActionBarSherlock,它看起来很好,并且应该可以禁用按下状态中的蓝色可绘制对象。你是否正确设置了Activity的主题?只有一个注意点:android:actionButtonStyle 应该放在主题中而不是ActionBar样式中(那里没有效果),但这个错误不应该影响到期望的结果。 - Tomik
可能是我创建菜单项的方式有问题(请参见编辑)?我必须在运行时更改主页图标,因为我使用的不是应用程序的徽标。 - Showpath
不,那不应该有任何影响。你的其他操作栏主题设置工作吗?你如何在清单中设置主题?顺便说一句:你不必在代码中设置图标,它可以通过主题以及一些清单设置来完成。 - Tomik
在清单文件中,为应用程序和活动设置主题。 - Showpath
@Tomik,你找到解决与actionbarsherlock兼容的方法了吗? - Rahul Verma

2

已经修复了。在onCreate方法中,有一个父活动更改了主题...

我不知道您可以在活动内以编程方式设置主题:

setTheme(R.style.MyTheme);

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