21

У меня возникли проблемы с панелью инструментов 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).

ответ

89

Чтобы изменить значок навигации вы можете использовать:

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

Я только, что изменить цвет этих предметов. Могу ли я это сделать без изменения чертежей? – sandalone

+2

Я уже пробовал 'setNavigationIcon' из кода, но он не меняет значок. Должен ли я делать какие-либо ссылки на панели инструментов XML, ссылку на стиль? Или я просто устанавливаю стиль полного приложения в файле манифеста и переписываю его так, как вы предлагали? – sandalone

+1

@sandalone вы можете изменить цвет, не изменяя чертежи. Только что обновил ответ –

1

Все эти решения работали для меня в 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> 
1

Существует простой, легкий и лучший подход, если нам нужно изменить только цвет гамбургер/задней значок.

Лучше, поскольку он меняет цвет только нужного значка, тогда как 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> 
-1

Для того, чтобы показать значок, используйте getSupportActionBar().setIcon(R.xxx.xxx)

В моем случае код: -

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

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

Я думаю, что это лучший ответ. Потому что ни один из ответов, связанных с изменением тем и стилей, не работал для меня. – krisDrOid

4

Для правильного меню вы можете сделать это:

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

1

добавить эту строку вашу тему по умолчанию;

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

, если вы хотите изменить иконки на 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" 

Edit: Вы не можете использовать цвета из вашего colors.XML или где-то еще, то цвет должен быть decalred непосредственно в файле XML Вектора .. так что это будет выглядеть следующим образом:

android:fillColor="#FFF" 
Смежные вопросы