如何改变新材质主题中后退箭头的颜色?

我已经将我的SDK更新到API 21,现在后/上图标是一个指向左边的黑色箭头。

黑后面箭头

我希望它是灰色的。 我怎样才能做到这一点?

例如,在Play商店中,箭头是白色的。

我已经做了这个设置一些样式。 @drawable/abc_ic_ab_back_mtrl_am_alpha使用了@drawable/abc_ic_ab_back_mtrl_am_alpha homeAsUpIndicator 。 该drawable是透明的(只有alpha),但箭头显示为黑色。 我想知道是否可以像DrawerArrowStyle那样设置颜色。 或者,如果唯一的解决办法是创build我的@drawable/grey_arrow并将其用于homeAsUpIndicator

 <!-- Base application theme --> <style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="android:actionBarStyle" tools:ignore="NewApi">@style/MyActionBar</item> <item name="actionBarStyle">@style/MyActionBar</item> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> <item name="homeAsUpIndicator">@drawable/abc_ic_ab_back_mtrl_am_alpha</item> <item name="android:homeAsUpIndicator" tools:ignore="NewApi">@drawable/abc_ic_ab_back_mtrl_am_alpha</item> </style> <!-- ActionBar style --> <style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid"> <item name="android:background">@color/actionbar_background</item> <!-- Support library compatibility --> <item name="background">@color/actionbar_background</item> </style> <!-- Style for the navigation drawer icon --> <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> <item name="spinBars">true</item> <item name="color">@color/actionbar_text</item> </style> 

到目前为止我的解决scheme是采取@drawable/abc_ic_ab_back_mtrl_am_alpha ,这似乎是白色的,并使用照片编辑器以我想要的颜色来绘制。 它的工作原理,尽pipe我喜欢在DrawerArrowStyle使用@color/actionbar_text DrawerArrowStyle

你可以通过代码实现它。 获取可绘制的后退箭头,使用filter修改其颜色,并将其设置为后退button。

 final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP); getSupportActionBar().setHomeAsUpIndicator(upArrow); 

修订1:

从API 23(Marshmallow)开始,可绘制资源abc_ic_ab_back_mtrl_am_alpha更改为abc_ic_ab_back_material

查看ToolbarTintManager源文件, drawable/abc_ic_ab_back_mtrl_am_alpha被着色为style属性colorControlNormal的值。

我曾尝试在我的项目中设置此项(在我的主题中使用<item name="colorControlNormal">@color/my_awesome_color</item> ),但对我来说仍然是黑色的。

更新

find了。 您需要使用colorControlNormal属性( 不是 colorControlNormal

例如:

 <style name="MyTheme" parent="Theme.AppCompat.Light"> <item name="actionBarTheme">@style/MyApp.ActionBarTheme</item> <item name="actionBarStyle">@style/MyApp.ActionBar</item> <!-- color for widget theming, eg EditText. Doesn't effect ActionBar. --> <item name="colorControlNormal">@color/my_awesome_color</item> <!-- The animated arrow style --> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> </style> <style name="MyApp.ActionBarTheme" parent="@style/ThemeOverlay.AppCompat.ActionBar"> <!-- THIS is where you can color the arrow! --> <item name="colorControlNormal">@color/my_awesome_color</item> </style> <style name="MyApp.ActionBarStyle" parent="@style/Widget.AppCompat.Light.ActionBar"> <item name="elevation">0dp</item> <!-- style for actionBar title --> <item name="titleTextStyle">@style/ActionBarTitleText</item> <!-- style for actionBar subtitle --> <item name="subtitleTextStyle">@style/ActionBarSubtitleText</item> <!-- the actionBarTheme doesn't use the colorControlNormal attribute <item name="colorControlNormal">@color/my_awesome_color</item> --> </style> 

尝试了以上的所有build议。 我设法改变导航图标的颜色的唯一方法是在我的工具栏中默认的后退button箭头是像这样在基本主题中设置colorControlNormal。 可能由于父母使用的是Theme.AppCompat.Light.NoActionBar

 <style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorControlNormal">@color/white</item> //the rest of your codes... </style> 

需要添加一个单一的属性到你的工具栏主题 –

 <style name="toolbar_theme" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <item name="colorControlNormal">@color/arrow_color</item> </style> 

将这个toolbar_theme应用到您的工具栏。

要么

你可以直接应用到你的主题 –

 <style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorControlNormal">@color/arrow_color</item> //your code .... </style> 

只需添加

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

到您目前的应用主题。

正如前面大多数评论所说,解决scheme是添加

<item name="colorControlNormal">@color/white</item>到您的应用主题。 但请确认您的布局上的工具栏元素中没有定义其他主题。

  <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:elevation="4dp" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

如果使用Toolbar ,你可以试试这个

 Drawable drawable = toolbar.getNavigationIcon(); drawable.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP); 

Carles的答案是正确的答案,但像getDrawable(),getColor()这样的方法很less在我写这个答案的时候被弃用 。 所以更新的答案是

 Drawable upArrow = ContextCompat.getDrawable(context, R.drawable.abc_ic_ab_back_mtrl_am_alpha); upArrow.setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP); getSupportActionBar().setHomeAsUpIndicator(upArrow); 

以下一些其他的stackoverflow查询,我发现调用ContextCompat.getDrawable()是类似的

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { return resources.getDrawable(id, context.getTheme()); } else { return resources.getDrawable(id); } 

ContextCompat.getColor()类似

 public static final int getColor(Context context, int id) { final int version = Build.VERSION.SDK_INT; if (version >= 23) { return ContextCompatApi23.getColor(context, id); } else { return context.getResources().getColor(id); } } 

链接1:ContextCompat.getDrawable()

链接2:ContextCompat.getColor()

在compileSdkVersoin 25上,你可以这样做:

styles.xml

 <style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="android:textColorSecondary">@color/your_color</item> </style> 

我发现了一个解决scheme,在棒棒糖前工作。 在“actionBarWidgetTheme”中设置“colorControlNormal”以更改homeAsUpIndicator颜色。 从上面修改rockgecko的答案是这样的:

 <style name="MyTheme" parent="Theme.AppCompat.Light"> <item name="actionBarTheme">@style/MyApp.ActionBarTheme</item> <item name="actionBarStyle">@style/MyApp.ActionBar</item> <!-- color for widget theming, eg EditText. Doesn't effect ActionBar. --> <item name="colorControlNormal">@color/my_awesome_color</item> <!-- The animated arrow style --> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> <!-- The style for the widgets on the ActionBar. --> <item name="actionBarWidgetTheme">@style/WidgetStyle</item> </style> <style name="WidgetStyle" parent="style/ThemeOverlay.AppCompat.Light"> <item name="colorControlNormal">@color/my_awesome_color</item> </style> 

在这里输入图像描述

更改菜单导航图标颜色

最终转换菜单图标颜色

在style.xml中:

 <style name="MyMaterialTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="windowNoTitle">true</item> <item name="windowActionBar">false</item> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> <item name="android:textColor">@color/colorAccent</item> </style> <style name="DrawerArrowStyle" parent="@style/Widget.AppCompat.DrawerArrowToggle"> <item name="spinBars">true</item> <item name="color">@color/colorPrimaryDark</item> </style> In Mainfests.xml : <activity android:name=".MainActivity" android:theme="@style/MyMaterialTheme.Base"></activity> 

使用下面的方法:

 private Drawable getColoredArrow() { Drawable arrowDrawable = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); Drawable wrapped = DrawableCompat.wrap(arrowDrawable); if (arrowDrawable != null && wrapped != null) { // This should avoid tinting all the arrows arrowDrawable.mutate(); DrawableCompat.setTint(wrapped, Color.GRAY); } return wrapped; } 

现在你可以设置drawable:

 getSupportActionBar().setHomeAsUpIndicator(getColoredArrow()); 

另一个可能适用于您的解决scheme是不要将您的工具栏声明为应用程序的操作栏(通过setActionBarsetSupportActionBar ),并使用本页另一个答案中提到的代码在onActivityCreated中设置后退图标

 final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP); toolbar.setNavigationIcon(upArrow); 

现在,当您按下后退button时,您不会得到onOptionItemSelectedcallback。 不过,您可以使用setNavigationOnClickListener来注册。 这就是我所做的:

 toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { getActivity().onBackPressed(); //or whatever you used to do on your onOptionItemSelected's android.R.id.home callback } }); 

如果使用菜单项,我不确定它是否可以正常工作。

尝试这个

 public void enableActionBarHomeButton(AppCompatActivity appCompatActivity, int colorId){ final Drawable upArrow = ContextCompat.getDrawable(appCompatActivity, R.drawable.abc_ic_ab_back_material); upArrow.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP); android.support.v7.app.ActionBar mActionBar = appCompatActivity.getSupportActionBar(); mActionBar.setHomeAsUpIndicator(upArrow); mActionBar.setHomeButtonEnabled(true); mActionBar.setDisplayHomeAsUpEnabled(true); } 

函数调用:

 enableActionBarHomeButton(this, R.color.white); 

只需从你的主题中删除android:homeAsUpIndicatorhomeAsUpIndicator ,它会没事的。 DrawerArrowStyle样式中的color属性必须足够。

如果要更改主题中所有图标的箭头button的颜色,请仅覆盖可绘制文件夹中的默认文件。 默认文件名是“abc_ic_ab_back_mtrl_am_alpha.png”。

我们遇到了同样的问题,所有我们想要的是设置

应用:collapseIcon

属性在最后的工具栏,我们没有find,因为它不是很好的logging:)

 <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="@dimen/toolbarHeight" app:collapseIcon="@drawable/collapseBackIcon" /> 

您可以像这样以编程方式更改导航图标的颜色:

 mToolbar.setNavigationIcon(getColoredArrow()); private Drawable getColoredArrow() { Drawable arrowDrawable = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); Drawable wrapped = DrawableCompat.wrap(arrowDrawable); if (arrowDrawable != null && wrapped != null) { // This should avoid tinting all the arrows arrowDrawable.mutate(); DrawableCompat.setTintList(wrapped, ColorStateList.valueOf(this.getResources().getColor(R.color.your_color))); } } return wrapped; } 

我只是将工具栏主题更改为@ style / ThemeOverlay.AppCompat.Light

箭头变成深灰色

  <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:gravity="center" app:layout_collapseMode="pin" app:theme="@style/ThemeOverlay.AppCompat.Light"> 

除非有更好的解决scheme

我所做的是采取@drawable/abc_ic_ab_back_mtrl_am_alpha图像,这似乎是白色的,并使用照片编辑器以我想要的颜色绘制它们。