Contexte
Utilisation d'AppCompat v7 21.0.0/21.0.2/21.0.3
Problème
Le popupTheme de la ToolBar n'est pas appliqué à la ShareAction
Style dans la barre d'outils:
<style name="MyActionBarStyle" parent="Widget.AppCompat.Toolbar">
<item name="Android:background">@color/green</item>
<item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
<item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>
L'élément de menu de débordement utilise correctement le popupTheme
Le ShareAction en revanche ne reçoit pas le popupTheme. Après quelques tests, j'ai remarqué qu'il recevait l'application: le thème de la barre d'outils étant donc sombre.
<item name="Android:colorBackground">@color/white</item>
Afin d'obtenir le texte noir sur la ShareAction, j'ai essayé de définir de nombreux attributs et en définissant "Android: textColorPrimary" (sur le thème ToolBar) j'obtiens ce que je veux MAIS alors mes icônes sur la ToolBar prennent également cette couleur qui est bizarre .. .
Le menu xml est le suivant:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:cycle="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/ic_share"
Android:icon="@drawable/abc_ic_menu_share_holo_dark"
Android:title="@string/media_share"
cycle:showAsAction="ifRoom"
cycle:actionProviderClass="Android.support.v7.widget.ShareActionProvider" />
<item
Android:icon="@drawable/abc_ic_menu_share_holo_dark"
Android:showAsAction="ifRoom"
Android:title="br">
<menu>
<item
Android:id="@+id/menuSortNewest"
Android:title="Sort by newest" />
<item
Android:id="@+id/menuSortRating"
Android:title="Sort by rating" />
</menu>
</item>
</menu>
Je m'attendrais à ce que le ShareAction et le débordement aient le popupTheme mais ce n'est pas le cas
Solution
Je modifierai ce message une fois que j'aurai trouvé une solution de contournement
Réf: https://code.google.com/p/Android/issues/detail?id=87285&thanks=87285&ts=1419254842
Alors, voici ce qui a fonctionné pour moi. Voici ma barre d'outils xml:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/action_bar_main"
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
app:theme="@style/Toolbar"
app:popupTheme="@style/Toolbar_Popup"
Android:minHeight="?attr/actionBarSize"
Android:background="?attr/colorPrimary" />
Notez que j'ai défini à la fois le thème et le popupTheme, et j'ai également remplacé l'arrière-plan par colorPrimary. Voici la description principale du thème de l'application avec des thèmes pour la barre d'outils:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="Android:actionMenuTextColor">@color/white</item>
<!-- Support library compatibility -->
<item name="actionMenuTextColor">@color/white</item>
<item name="actionBarSize">@dimen/actionbar_height</item>
<item name="colorPrimary">@color/dark_blue</item>
<item name="colorPrimaryDark">@color/dark_blue</item>
<item name="Android:textColorPrimary">#607d8b</item>
</style>
<style name="Toolbar" parent="Base.ThemeOverlay.AppCompat.ActionBar">
<item name="Android:textColorPrimary">#fff</item>
<item name="Android:background">@color/dark_blue</item>
</style>
<style name="Toolbar_Popup" parent="Base.ThemeOverlay.AppCompat.ActionBar">
<item name="Android:textColorPrimary">#fff</item>
<item name="Android:background">@color/dark_blue</item>
</style>
Par conséquent, le fond d'action Partager est défini sur la valeur de fond dans le thème principal de la barre d'outils. Et l'arrière-plan de la barre d'outils elle-même est remplacé.
Je me grattais la tête depuis des siècles pour essayer de résoudre ce problème. J'ai trouvé une solution à mon problème. Espérons que cela aidera également les autres:
Dans ma définition de barre d'outils, je définissais un thème personnalisé comme suit:
<Android.support.v7.widget.Toolbar
...
app:theme="@style/ActionBarThemeOverlay"
... />
Dans mon styles.xml, mon thème était défini comme:
<style name="ActionBarThemeOverlay" parent="ThemeOverlay.AppCompat.Light">
<item name="Android:textColorPrimary">#fff</item>
<item name="colorControlNormal">#fff</item>
<item name="colorControlHighlight">#3fff</item>
</style>
Je voulais des icônes d'action blanches dans ma barre d'outils, alors je mettais ces valeurs en blanc. Malheureusement, le texte du menu ShareActionProvider était également blanc (sur fond blanc).
La solution pour moi était de supprimer le paramètre de style pour textColorPrimary
. Mes icônes de barre d'outils étaient toujours blanches mais j'avais maintenant le texte sombre souhaité dans le menu contextuel du fournisseur de partage.
<style name="ActionBarThemeOverlay" parent="ThemeOverlay.AppCompat.Light">
<item name="colorControlNormal">#fff</item>
<item name="colorControlHighlight">#3fff</item>
</style>
Cette page peut aider à résoudre votre problème: http://www.murrayc.com/permalink/2014/10/28/Android-changing-the-toolbars-text-color-and-overflow-icon-color /
Une différence que j'ai remarquée dans votre XML est que vous utilisez une fois la propriété Android: showAsAction = "ifRoom" et une fois cycle: showAsAction = "ifRoom".