web-dev-qa-db-fra.com

Comment définir la couleur de l'icône de MenuItem?

J'ai défini un élément de menu avec ShareActionProvider et une icône blanche partagée, comme ceci: 

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

Mais lorsque je lance l'application, j'obtiens une autre icône de partage noire. Comment définir l'icône de partage sur blanc? 

Voici le résultat que j'ai

 enter image description here

29
Dimitri

C'est un problème de thématique. En fonction de votre thème actuel, vous devez définir le bon thème de superposition ActionBar. Le fournisseur d'actions lit une valeur dans le thème (qui indique si le thème est sombre ou clair) pour déterminer la couleur de l'icône.

Si votre thème principal est clair et votre barre Action est sombre, votre barre Action/barre d'outils doit utiliser le thème ThemeOverlay.AppCompat.Dark.ActionBar.

37
BladeCoder

L’icône est en fait fournie par la variable ShareActionProvider et vous ne pouvez pas la changer à l’avance. Vous pouvez toutefois personnaliser la couleur en définissant la textColorPrimary dans votre 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>

Pour toute icône personnalisée, vous devez les colorier vous-même, c.-à-d.

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

essaye ça :

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

Réponse courte et douce -> app: iconTint = "@ color/yourcolor

ajoutez app:iconTint="@color/yourcolor" dans votre MenuItem pour changer la couleur de l'icône.

<item
    Android:icon="@drawable/ic_share_white_24dp"
    Android:id="@+id/action_share"
    Android:title="@string/action_share"
    Android:orderInCategory="200"
    app:iconTint="@color/yourcolor"
    app:showAsAction="ifRoom"
    app:actionProviderClass="Android.support.v7.widget.ShareActionProvider"/>
11
Nikunj Paradva

réponse courte -> utilisez app:iconTint="?android:textColorPrimary" si vous voulez que la couleur de l'icône soit blanche, écrivez: Android:theme = "@style/ThemeOverlay.MaterialComponents.Dark.ActionBar" sinon, si vous voulez une couleur noire, écrivez: Android:theme="@style/ThemeOverlay.MaterialComponents.Light" dans votre barre d'outils

1
Masood Farmani
@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);
    }
}
1
Ahamadullah Saikat

Ce comportement est attendu, car la ShareActionProvider est 

responsable de la création de vues qui permettent le partage de données et également de afficher un sous-menu avec des activités de partage si l'élément d'hébergement est placé dans le menu de débordement.

selon à la documentation.

Cela signifie que vous ne contrôlez pas la personnalisation de la vue lorsque vous l'utilisez. 

0
Robert Estivill