2014-06-19 15 views
16

Sto costruendo un'app per Android e utilizzo le icone del Pacchetto icone della barra delle azioni da utilizzare nella barra delle azioni. Li definisco tramite i file xml nella cartella menu. C'è un modo per "colorare" queste icone in modo che siano tutte dello stesso colore? Finora, devo farlo manualmente con un software di modifica delle immagini, ma se decido di cambiare il colore, devo rifarlo tutto da capo.Icone del menu Tint

So che esiste un attributo android:tint per ImageView ma non ho trovato il modo di usarlo per le icone del menu.

Grazie

+0

sarebbe possibile, ad esempio per creare un attributo per il tag 'item' xml, ad esempio, un attributo 'iconTint' e applica programmaticamente setColorFilter sul drawable corrispondente? –

risposta

41

ci può essere un modo migliore per fare questo, ma una possibilità è quella di ridisegnare l'icona nel codice.

Supponiamo di avere una voce di menu per i preferiti e si desidera per colorare di grigio:

MenuItem favoriteItem = menu.findItem(R.id.action_favorite); 
Drawable newIcon = (Drawable)favoriteItem.getIcon(); 
newIcon.mutate().setColorFilter(Color.argb(255, 200, 200, 200), PorterDuff.Mode.SRC_IN); 
favoriteItem.setIcon(newIcon); 

È inoltre possibile utilizzare una risorsa colore come

newIcon.mutate().setColorFilter(getResources().getColor(R.color.myCustomTint), PorterDuff.Mode.SRC_IN); 
+0

Ottima risposta, grazie! –

6

Ora è possibile utilizzare la colorazione da DrawableCompat piuttosto che filtro colore:

MenuItem favoriteItem = menu.findItem(R.id.action_favorite); 
Drawable favoriteIcon = DrawableCompat.wrap(favoriteItem.getIcon()); 
ColorStateList colorSelector = ResourcesCompat.getColorStateList(getResources(), R.color.tinted_selector, getTheme()); 
DrawableCompat.setTintList(favoriteIcon, colorSelector); 
favoriteItem.setIcon(favoriteIcon); 
12

Se la fonte originale di icona è l'immagine raster, allora è possibile avvolgerlo entro il <bitmap>.

Aggiungi questo file nella cartella drawable - settings_icon.xml:

<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/ic_action_settings" 
    android:tint="@color/colorRed"/> 

e quindi utilizzare questo drawable per voce di menu:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<item android:id="@+id/new_game" 
    android:icon="@drawable/settings_icon" 
    android:title="@string/settings" 
    app:showAsAction="always"/> 
</menu> 
+0

Soluzione sensata. –

+0

Questa è una soluzione pulita per voci di menu statiche. – box

0

Per migliorare è possibile creare un metodo statico in una classe utils e usa quel metodo ogni volta che vuoi.

-------- DEFINIRE IL TUO METODO -----------------------------------

public static void tintMenuIcon(Context context, MenuItem item, @ColorRes int color) { 
    Drawable normalDrawable = item.getIcon(); 
    Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable); 
    DrawableCompat.setTint(wrapDrawable, context.getResources().getColor(color)); 

    item.setIcon(wrapDrawable); 
} 

--------------------- COME USARE ------------------- ------------

Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    MenuItem menuItem = menu.findItem(R.id.action_delete); 

    if (menuItem != null) { 
     tintMenuIcon(MainActivity.this, menuItem, android.R.color.holo_purple);//HERE 
    } 

    return true; 
} 

la mia fonte è: https://futurestud.io/tutorials/android-quick-tips-8-how-to-dynamically-tint-actionbar-menu-icons

Problemi correlati