如何更改工具栏导航和溢出菜单图标(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>
上述所有的解决方案在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>
有一个简单,方便和更好的方法,如果我们只需要改变汉堡包/后退图标的颜色。
它更好,因为它只改变所需图标的颜色,而colorControlNormal
和android: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));
我认为这是最好的答案。因为没有任何与修改主题和样式有关的答案对我有用。 – 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;
}
这是结果:
如果你正在使用一个矢量,你可以像这样做[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"
我只是要改变那些项目的颜色。我可以在不改变drawable的情况下做到吗? – sandalone 2015-03-13 20:10:39
我已经从代码中尝试了'setNavigationIcon',但它不会更改图标。我是否必须在工具栏XML中引用任何参考,这是对Style的引用?或者,我只需在Manifest文件中设置完整应用程序的样式,并按照您的建议重新设置它的样式呢? – sandalone 2015-03-13 20:13:55
@sandalone你可以在不更改绘图的情况下改变颜色。刚刚更新了答案 – 2015-03-13 20:43:59