2015-08-11 25 views
15

Ho definito una voce di menu che ha ShareActionProvider e condividere l'icona bianca in questo modo:Come impostare il colore dell'icona di 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"/> 

Ma quando lancio l'applicazione, ottengo una diversa icona di condivisione nero. Come impostare l'icona di condivisione per essere bianca?

Ecco il risultato che ho enter image description here

risposta

20

Questo è un problema tematizzazione. A seconda del tema corrente, è necessario impostare il tema di overlay ActionBar corretto. Il fornitore di azioni legge un valore nel tema (che indica se il tema è scuro o chiaro) per determinare il colore dell'icona.

Se il tema principale è chiaro e ActionBar è scuro, ActionBar/Toolbar devono utilizzare il tema ThemeOverlay.AppCompat.Dark.ActionBar.

+0

Io sono il tema 'Theme.AppCompat.Light.NoActionBar', come posso ottenerlo? – Dimitri

+0

In effetti il ​​tuo tema principale è leggero e stai utilizzando una barra degli strumenti. Devi specificare 'android: theme =" @ style/ThemeOverlay.AppCompat.Dark.ActionBar "' come attributo sulla tua 'Toolbar' nel tuo layout XML. Se vuoi che il menu popup della barra degli strumenti sia chiaro mentre la barra degli strumenti è scura, devi anche aggiungere 'app: popupTheme =" @ style/ThemeOverlay.AppCompat.Light "'. – BladeCoder

+0

Se imposto il tema 'android: theme =" @ style/ThemeOverlay.AppCompat.Dark.ActionBar', cambierà il colore della barra degli strumenti? – Dimitri

0

Questo comportamento è previsto, come il ShareActionProvider è

responsabile per la creazione di viste che consentono la condivisione dei dati e anche per mostrano un sottomenu con la condivisione attività se l'oggetto di hosting è posizionato nel menu di overflow.

secondo to the documentation.

Questo significa che non si ha il controllo sulla personalizzazione della visualizzazione quando lo si utilizza.

38

L'icona è attualmente fornita dallo ShareActionProvider e non è possibile modificarla di conseguenza. È possibile, tuttavia, personalizzare il colore impostando la textColorPrimary nel 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> 

Per eventuali icone personalizzate, si dovrebbe colorare voi stessi, vale a dire.

@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' cambia il colore del testo, non l'icona colore –

+0

@YoannHercouet Stai cercando di cambiare il colore di qualche altra icona e non un'icona' ShareActionProvider' come questa domanda è specificamente chiedendo? Stai usando una 'Toolbar'? – tachyonflux

+0

La domanda specifica MenuItems, ma comunque ho provato con ShareActionProvider. Ho realizzato che questa icona è impostata automaticamente, quindi non è necessario impostarne una, basta cambiare il tema come spiegato da BladeCoder, e verrà automaticamente visualizzato in bianco. Ho provato a impostare 'textColorPrimary' come hai detto, non cambia nulla, e anche se lo fosse, non cambierebbe solo ActionBar o ToolBar ma tutti i titoli e molti componenti nell'app. –

15

provare questo:

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

Fantastico. Non dovrebbe essere così difficile però: / –

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