Как изменить значки меню навигации и переполнения панели инструментов (appcompat v7)?
Мне сложно с помощью панели инструментов V7. То, что когда-то было простой задачей для ActionBar
, теперь кажется слишком сложным. Независимо от того, какой стиль я устанавливаю, я не могу изменить значок навигации (который открывает ящик) или значок меню переполнения (который открывает меню).
Итак, у меня есть 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).
Ответы
Ответ 1
Чтобы изменить значок навигации, вы можете использовать:
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>
Ответ 2
mToolbar.setNavigationIcon(R.mipmap.ic_launcher);
mToolbar.setOverflowIcon(ContextCompat.getDrawable(this, R.drawable.ic_menu));
Ответ 3
Для правильного меню вы можете сделать это:
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;
}
Это результат:
![введите описание изображения здесь]()
Ответ 4
Существует простой, легкий и лучший подход, если нам нужно изменить только цвет значка гамбургера/назад.
Лучше, поскольку он меняет цвет только нужного значка, тогда как 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>
Ответ 5
если вы хотите изменить свои значки на Vector, создайте новый.
а затем в вашем 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"/>
Обратите внимание, что мы использовали эти атрибуты, чтобы установить цвет вектора:
android:fillColor="@color/Your_Color"
Изменить: вы не можете использовать цвет из вашего colors.XML или где-то еще, этот цвет должен быть удален непосредственно в файле Vector XML... поэтому он будет выглядеть следующим образом:
android:fillColor="#FFF"
Ответ 6
Все вышеперечисленные решения работали для меня в API 21 или выше, но не в API 19 (KitKat). Небольшие изменения сделали трюк для меня в более ранних версиях. Обратите внимание на Widget.Holo
вместо Widget.AppCompat
<style name="OverFlowStyle" parent="@android:style/Widget.Holo.ActionButton.Overflow">
<item name="android:src">@drawable/ic_overflow</item>
</style>
Ответ 7
добавьте свою тему по умолчанию в эту строку;
<item name="colorControlNormal">@color/my_color</item>
Ответ 8
если вы хотите изменить значки элементов меню, значок стрелки (назад/вверх) и значок 3 точки, вы можете использовать android:tint
<style name="ToolbarTheme" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:tint">@color/your_color</item>
</style>
Ответ 9
какую тему вы использовали в упражнении, добавьте ниже строчный код
для белых
<style name="AppTheme.NoActionBar">
<item name="android:tint">#ffffff</item>
</style>
or
<style name="AppThemeName" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:tint">#ffffff</item>
</style>
для черного
<style name="AppTheme.NoActionBar">
<item name="android:tint">#000000</item>
</style>
or
<style name="AppThemeName" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:tint">#000000</item>
</style>
Ответ 10
Вы можете использовать этот код
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.toolbar_Like:
item.setIcon(R.drawable.is_like);
break;
}
return true;
}
Ответ 11
Чтобы изменить цвет пунктов меню параметров, вы можете
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.your_menu, menu)
menu?.forEach {
it.icon.setTint(Color.your_color)
}
return true
}
Ответ 12
Чтобы показать значок, используйте getSupportActionBar().setIcon(R.xxx.xxx)
В моем случае код: -
getSupportActionBar().setIcon (R.mipmap.ic_launcher);