在 android 中仅更改一个菜单项图标的颜色

change color of only ONE menu item icon in android

我只想更改操作栏中的一个菜单项。我尝试更改相同的图标颜色,而不是将其透明化为所需的颜色,但边缘显示了操作栏的背景。

这是我的操作栏的样子:

https://www.dropbox.com/s/1sjnk975dnj17kr/before.png?dl=0

这是我想要达到的目标:

https://www.dropbox.com/s/ul7hh2gxtfox1pk/goal.png?dl=0

这是我的 xml 文件:

menu_main.xml

<item
    android:id= "@+id/location"
    android:icon="@drawable/ic_room_white_48dp"
    android:title=""
    android:orderInCategory="2"
    app:showAsAction="always"/>


<item
    android:id= "@+id/report"
    android:icon="@drawable/report"
    android:title=""
    android:orderInCategory="3"
    app:showAsAction="always"/>


<item
    android:id= "@+id/message"
    android:icon="@drawable/ic_comment_white_48dp"
    android:title=""
    android:orderInCategory="4"
    app:showAsAction="always"/> 

styles.xml

<style name="AppTheme" parent="AppTheme.Base"/>

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">

    <item name="colorPrimary">#B9ACC1</item>

    <item name="colorPrimaryDark">#827689</item>

    <item name="colorAccent">#827689</item>

    <item name="android:actionButtonStyle">@style/MyActionButtonStyle</item>
</style>

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


    <item name="android:padding">15dip</item>

</style>

更新1: 添加避免 xml 和代码重复的方法。

更新 2: 添加静态侦听器。

我不知道您是否可以仅通过更改 menu.xml 来实现您的目标,但工具栏是一个 viewGroup,因此您可以使用看起来像这样的 view.xml 来实现您的目标:

toolbar.xml :

    <LinearLayout
        android:layout_width="?attr/actionBarSize"
        android:layout_height="match_parent"
        android:layout_marginRight="8dp"
        android:background="#000000">

        <Button
            android:id="@+id/button_first"
            android:layout_width="?attr/actionBarSize"
            android:layout_height="match_parent"
            android:background="@android:drawable/ic_lock_idle_lock" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="?attr/actionBarSize"
        android:layout_height="match_parent"
        android:layout_marginRight="8dp"
        android:background="#000000">

        <Button
            android:id="@+id/button_second"
            android:layout_width="?attr/actionBarSize"
            android:layout_height="match_parent"
            android:background="@android:drawable/ic_lock_idle_lock" />

    </LinearLayout>

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

在您所有的 xml 上添加此代码可能会很无聊,因此我建议您像这样使用 <include /> 属性:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar"/>


</RelativeLayout>

然后,您只需设置工具栏并使用按钮

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Button buttonFirst = (Button) findViewById(R.id.button_first);
    final Button buttonSecond = (Button) findViewById(R.id.button_second);

    buttonFirst.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

    buttonSecond.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
   });
}

如果您所有的按钮都有相同的侦听器,您可以将它们设为静态以避免代码重复:

IconListener.java :

public class IconListener {

    public static View.OnClickListener listenerButtonOne = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //DO what you want
        }
    };

    public static View.OnClickListener listenerButtonTwo = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Do what you want
        }
    };
}

所以你的MainActivity.java变成了

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Button buttonFirst = (Button) findViewById(R.id.button_first);
    final Button buttonSecond = (Button) findViewById(R.id.button_second);

    buttonFirst.setOnClickListener(IconListener.listenerButtonOne)
    buttonSecond.setOnClickListener(IconListener.listenerButtonTwo);
}