21

Mam trudności z paskiem narzędzi Toolbar v7. To, co kiedyś było prostym zadaniem dla ActionBar, teraz wydaje się zbyt skomplikowane. Bez względu na ustawiony styl, nie mogę zmienić ani ikony nawigacji (która otwiera szufladę), ani ikony menu przepełnienia (która otwiera menu).Jak zmienić ikony menu Nawigacja i przepełnienie paska narzędzi (appcompat v7)?

więc mam 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" 
    > 

I Kod wygląda to

//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); 
} 

Teraz muszę zmienić Drawable dla tych dwóch ikon.

Jak mogę to zrobić dla compat v7 Toolbar? Sądzę, że musiałbym zmienić strzałkę widoczną, gdy szuflada jest otwarta (Android 5.0).

Odpowiedz

89

Aby zmienić ikonę nawigacji można użyć:

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

Aby zmienić ikonę przepełnienia można zdefiniować styl takiego:

<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> 

W każdym razie, to może nie być dobrym pomysł zmiany standardowej ikony, takiej jak menu przepełnienia.

Jeśli chcesz zmienić kolor ikony można użyć:

<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

I tylko co zmienić kolor tych przedmiotów. Czy mogę to zrobić bez zmiany rysunków? – sandalone

+2

Próbowałem 'setNavigationIcon' z kodu już, ale to nie zmienia ikony. Czy muszę zrobić odniesienie w pliku XML paska narzędzi, odniesienie do stylu? Czy mogę po prostu ustawić styl kompletnej aplikacji w pliku Manifestu i zmienić styl, tak jak sugerowałeś? – sandalone

+1

@sandalone można zmienić kolor bez zmiany rysunków. Właśnie zaktualizowałem odpowiedź: –

1

Wszystkie powyższe rozwiązania pracował dla mnie w API 21 lub większym, ale nie w API 19 (KitKat). Dokonanie niewielkiej zmiany zrobiło dla mnie trik we wcześniejszych wersjach. Zauważ Widget.Holo zamiast Widget.AppCompat

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

Jest prosty, łatwy i lepszym rozwiązaniem, jeśli musimy zmienić tylko kolor hamburger/Tył ikony.

Jest to lepsze, ponieważ zmienia tylko kolor pożądanej ikony, natomiast colorControlNormal i android:textColorSecondary może również wpływać na inne odsłonięcia potomne paska narzędzi.

<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

, aby pokazać ikonę, użyj getSupportActionBar().setIcon(R.xxx.xxx)

W moim przypadku kod jest: -

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

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

Myślę, że to najlepsza odpowiedź. Ponieważ żadna z odpowiedzi związanych z modyfikowaniem tematów i stylów nie zadziałała. – krisDrOid

4

Na prawym menu można zrobić:

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; 
     } 

A w swojej działalności

@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; 
    } 

Jest to wynikiem:

enter image description here

+0

Jeśli używasz wektora, możesz zrobić "android: tint =" TWÓJ KOLOR "' tak jak oni [tutaj] (https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the- wektory-91cbafa87c88) – ArtiomLK

1

dodać domyślny motyw tej linii;

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

jeśli chcesz zmienić swoje ikony do Vector, tworzyć nowe. a następnie w swojej 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)); 

Aby zmienić Vector ikona kolor, przejdź do pliku XML Vector .. w tym przypadku będzie to your_icon.xml będzie wyglądać następująco:

<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"/> 

Zauważ, że użyliśmy tych atrybutów, aby ustawić vECTOR kolor:

android:fillColor="@color/Your_Color" 

Edit: Nie można użyć koloru z colors.XML lub gdzieś indziej, kolor musi być decalred bezpośrednio w wektorze pliku XML za .. więc będzie wyglądać następująco:

android:fillColor="#FFF" 
Powiązane problemy