如何更改工具栏导航和溢出菜单图标(appcompat v7)?

问题描述:

我很难与v7工具栏。曾经是ActionBar的简单任务,现在看起来过于复杂。无论我设置什么样式,我都无法更改导航图标(打开抽屉)或溢出菜单图标(打开菜单)。如何更改工具栏导航和溢出菜单图标(appcompat v7)?

所以我有一个Toolbar

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/ghex" 
    android:minHeight="?attr/actionBarSize" 
    app:theme="@style/ThemeOverlay.AppCompat.Light" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    > 

我的代码看起来这

//before in the code I do 
mToolbar = (Toolbar) findViewById(R.id.toolbar); 

private void initToolbar() { 
    setSupportActionBar(mToolbar); 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
} 

现在,我需要改变Drawable为这两个图标。

如何做到这一点的COMPAT V7 Toolbar?我想我需要改变当抽屉打开时可见的箭头(Android 5.0)。

要改变导航图标,你可以使用:

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); 
setSupportActionBar(toolbar); 
toolbar.setNavigationIcon(R.drawable.my_icon); 

要更改的菜单图标,你可以这样定义样式:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light"> 
    <item name="actionOverflowButtonStyle">@style/OverFlow</item> 
</style> 

<style name="OverFlow" parent="Widget.AppCompat.ActionButton.Overflow"> 
    <item name="android:src">@drawable/my_overflow_menu</item> 
</style> 

在任何情况下,它可能是不太好改变标准图标的想法,如溢出菜单。

如果你想改变图标的​​颜色,你可以使用:

<android.support.v7.widget.Toolbar 
    app:theme="@style/ThemeToolbar" /> 


<style name="ThemeToolbar" parent="Theme.AppCompat.Light"> 

    <!-- navigation icon color --> 
    <item name="colorControlNormal">@color/my_color</item> 

    <!-- color of the menu overflow icon --> 
    <item name="android:textColorSecondary">@color/my_color</item> 
</style> 
+3

我只是要改变那些项目的颜色。我可以在不改变drawable的情况下做到吗? – sandalone 2015-03-13 20:10:39

+2

我已经从代码中尝试了'setNavigationIcon',但它不会更改图标。我是否必须在工具栏XML中引用任何参考,这是对Style的引用?或者,我只需在Manifest文件中设置完整应用程序的样式,并按照您的建议重新设置它的样式呢? – sandalone 2015-03-13 20:13:55

+1

@sandalone你可以在不更改绘图的情况下改变颜色。刚刚更新了答案 – 2015-03-13 20:43:59

上述所有的解决方案在API 21或更高的工作对我来说,但在API 19(奇巧)没有。在早期版本中做一个小小的改变对我来说是个诀窍。注意Widget.Holo代替Widget.AppCompat

<style name="OverFlowStyle" parent="@android:style/Widget.Holo.ActionButton.Overflow"> 
    <item name="android:src">@drawable/ic_overflow</item> 
</style> 

有一个简单,方便和更好的方法,如果我们只需要改变汉堡包/后退图标的颜色。

它更好,因为它只改变所需图标的颜色,而colorControlNormalandroid:textColorSecondary也可能会影响工具栏的其他子视图。

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
</style> 

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
    <item name="spinBars">true</item> 
    <item name="color">@android:color/white</item> 
</style> 

为了显示该图标,使用getSupportActionBar().setIcon(R.xxx.xxx)

在我的情况下,代码为: -

getSupportActionBar().setIcon (R.mipmap.ic_launcher);

mToolbar.setNavigationIcon(R.mipmap.ic_launcher); 
    mToolbar.setOverflowIcon(ContextCompat.getDrawable(this, R.drawable.ic_menu)); 
+1

我认为这是最好的答案。因为没有任何与修改主题和样式有关的答案对我有用。 – krisDrOid 2017-08-16 18:48:43

对于右键菜单,你可以做到这一点:

public static Drawable setTintDrawable(Drawable drawable, @ColorInt int color) { 
      drawable.clearColorFilter(); 
      drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); 
      drawable.invalidateSelf(); 
      Drawable wrapDrawable = DrawableCompat.wrap(drawable).mutate(); 
      DrawableCompat.setTint(wrapDrawable, color); 
      return wrapDrawable; 
     } 

而在你的活动

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_profile, menu); 
     Drawable send = menu.findItem(R.id.send); 
     Drawable msg = menu.findItem(R.id.message); 
     DrawableUtils.setTintDrawable(send.getIcon(), Color.WHITE); 
     DrawableUtils.setTintDrawable(msg.getIcon(), Color.WHITE); 
     return true; 
    } 

这是结果:

enter image description here

+0

如果你正在使用一个矢量,你可以像这样做[android]:tint =“YOUR COLOR”'(https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-载体-91cbafa87c88) – ArtiomLK 2017-09-17 23:43:40

添加您的默认主题这条线;

<item name="colorControlNormal">@color/my_color</item> 

,如果你想改变你的图标到矢量,创建一个新的。 ,然后在Activity.java

Toolbar toolbar = findViewById(R.id.your_toolbar); 
setSupportActionBar(toolbar); 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
toolbar.setNavigationIcon(R.drawable.your_icon); 
mToolbar.setOverflowIcon(ContextCompat.getDrawable(this, R.drawable.your_icon2)); 

要更改矢量图标颜色,去你矢量XML文件。在这种情况下,这将是your_icon.xml,它看起来就像这样:

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="24dp" 
    android:height="24dp" 
    android:viewportWidth="24.0" 
    android:viewportHeight="24.0"> 
<path 
    android:fillColor="@color/Your_Color" 
    android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/> 

请注意,我们使用这些属性来设置Vector的颜色:

android:fillColor="@color/Your_Color" 

编辑:不能使用颜色从colors.XML或其他地方,颜色必须直接Vector的XML文件中decalred ..所以它看起来是这样的:

android:fillColor="#FFF"