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