2015-08-11 15 views
15

I zdefiniowany element menu, który ma ShareActionProvider i dzielić białą ikonę tak:Jak ustawić kolor ikony MenuItem?

<item 
    android:icon="@drawable/ic_share_white_24dp" 
    android:id="@+id/action_share" 
    android:title="@string/action_share" 
    android:orderInCategory="200" 
    app:showAsAction="ifRoom" 
    app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/> 

Ale kiedy uruchomić aplikację, mam inną ikonę czarny zakładowego. Jak ustawić ikonę udostępniania jako biały?

Oto wynik, że mam enter image description here

Odpowiedz

20

jest to kwestia theming. W zależności od bieżącego motywu należy ustawić poprawną motyw nakładki ActionBar. Dostawca działań odczytuje wartość w kompozycji (która wskazuje, czy motyw jest ciemny lub jasny), aby określić kolor ikony.

Jeśli Twój główny motyw jest jasny i Twój pasek akcji jest ciemny, pasek narzędzi/pasek narzędzi Actionbar musi używać motywu ThemeOverlay.AppCompat.Dark.ActionBar.

+0

Jestem tematem "Theme.AppCompat.Light.NoActionBar", jak mogę to osiągnąć? – Dimitri

+0

Rzeczywiście głównym tematem jest światło i używasz paska narzędzi. Musisz określić 'android: theme =" @ style/ThemeOverlay.AppCompat.Dark.ActionBar "' jako atrybut na twoim 'Pasku narzędzi' w twoim układzie XML. Jeśli chcesz, aby menu podręczne paska narzędzi było lekkie, gdy pasek narzędzi jest ciemny, musisz również dodać: "app: popupTheme =" @ style/ThemeOverlay.AppCompat.Light "". – BladeCoder

+0

Jeśli ustawię motyw "android: theme =" @ style/ThemeOverlay.AppCompat.Dark.ActionBar ", czy on zmieni kolor paska narzędzi? – Dimitri

0

Takie zachowanie jest oczekiwane, jak ShareActionProvider jest

odpowiedzialny za tworzenie widoków, które umożliwiają wymianę danych, a także do wykazują podmenu z dzielenia działania, jeśli obiekt hostingowy znajduje się na w menu przelewowym.

według to the documentation.

Oznacza to, że nie masz kontroli nad tym dostosowanie widoku podczas korzystania z niego.

38

Ikona jest rzeczywiście dostarczana przez ShareActionProvider i nie można jej zmienić afaik. Można jednak dostosować kolor ustawiając textColorPrimary w swoim styles.xml:

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

<style name="MyActionBarTheme" parent="ThemeOverlay.AppCompat.Dark.ActionBar"> 
    <item name="android:textColorPrimary">#fa0</item> 
</style> 

przypadku jakichkolwiek niestandardowych ikon, trzeba by je pokolorować siebie, tj.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 

    for(int i = 0; i < menu.size(); i++){ 
     Drawable drawable = menu.getItem(i).getIcon(); 
     if(drawable != null) { 
      drawable.mutate(); 
      drawable.setColorFilter(getResources().getColor(R.color.textColorPrimary), PorterDuff.Mode.SRC_ATOP); 
     } 
    } 

    return true; 
} 
+3

'textColorPrimary' zmienia kolor tekstu, a nie ikona kolor –

+0

@YoannHercouet Próbujesz zmienić kolor inną ikonę, a nie' jako ikona ShareActionProvider' to pytanie jest szczególnie wymagane? Czy używasz 'Paska narzędziowego'? – tachyonflux

+0

Pytanie określa MenuItems, ale w każdym razie spróbowałem z ShareActionProvider. Zauważyłem, że ta ikona jest ustawiana automatycznie, więc nie trzeba jej ustawiać, wystarczy zmienić motyw, jak wyjaśniono w BladeCoder, i będzie on wyświetlany automatycznie na biało. Próbowałem ustawić 'textColorPrimary' tak jak powiedziałeś, to niczego nie zmienia, a nawet gdyby tak było, to nie tylko zmieniłoby ActionBar lub ToolBar, ale wszystkie tytuły i wiele komponentów w aplikacji. –

15

spróbuj tego:

public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.MENU, menu); 

    // change color for icon 0 
    Drawable yourdrawable = menu.getItem(0).getIcon(); // change 0 with 1,2 ... 
    yourdrawable.mutate(); 
    yourdrawable.setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_IN); 
    return true; 
}  
+1

Awesome.Nie powinno być jednak tak trudno: / –

0
@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { 
    menuInflater.inflate(R.menu.menu_confirm, menu); 
    MenuItem action_done = menu.findItem(R.id.action_done); 
    action_done.setIcon(R.drawable.ic_filter); 
    Utils.menuIconColor(action_done, Color.WHITE); 
    super.onCreateOptionsMenu(menu, menuInflater); 
} 

public static void menuIconColor(MenuItem menuItem, int color) { 
    Drawable drawable = menuItem.getIcon(); 
    if (drawable != null) { 
     drawable.mutate(); 
     drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); 
    } 
}