web-dev-qa-db-fra.com

Comment utiliser le thème Holo.Light alors que l'ActionBar utilise Hulu sans ICS?

J'aimerais avoir un ActionBar sombre mais que le reste de l'application utilise le thème Holo.Light. Je sais qu'il existe un thème Theme.Holo.Light.DarkActionBar dans ICS/4.0 mais je souhaite également que cela fonctionne également dans Honeycomb/3.0 +.

À l'heure actuelle, j'utilise le thème sombre Holo et, pour le reste de mes composants, j'utilise un ContextThemeWrapper. Mais c'est beaucoup de travail et peut facilement conduire à des erreurs.

Est-ce possible?

15
Thomas

Créez un style personnalisé et définissez le style Parent sur le thème holo light mais sur la barre Action sur Holo normal.

un fichier xml avec quelque chose comme ceci devrait faire le travail (juste de ma mémoire):

<style name="appstyle0" parent="Android:style/Theme.Holo.Light">
    <item name="Android:actionBarStyle">@Android:style/Widget.Holo.ActionBar</item>
</style>

Ensuite, définissez appstyle0 dans le style de votre AndroidManifest.xml et, dans toutes vos activités, le thème holo light, mais le style de la barre d’action est holo dark.

Edit: J'ai vérifié pourquoi ma première réponse ne fonctionnait pas.

<style name="Widget.Holo.Light.ActionBar" parent="Widget.Holo.ActionBar">
    <item name="Android:titleTextStyle">@Android:style/TextAppearance.Holo.Widget.ActionBar.Title</item>
    <item name="Android:subtitleTextStyle">@Android:style/TextAppearance.Holo.Widget.ActionBar.Subtitle</item>
    <item name="Android:background">@Android:drawable/ab_transparent_light_holo</item>
    <item name="Android:backgroundStacked">@Android:drawable/ab_stacked_transparent_light_holo</item>
    <item name="Android:backgroundSplit">@Android:drawable/ab_bottom_transparent_light_holo</item>
    <item name="Android:homeAsUpIndicator">@Android:drawable/ic_ab_back_holo_light</item>
    <item name="Android:progressBarStyle">@Android:style/Widget.Holo.Light.ProgressBar.Horizontal</item>
    <item name="Android:indeterminateProgressStyle">@Android:style/Widget.Holo.Light.ProgressBar</item>
</style>

La barre d'action est définie dans styles.xml avec des attributs définis par le thème principal en général . Tout d'abord, le BG est transparent; vous devez donc utiliser "Widget.Holo.Light.ActionBar.Solid" comme parent. Ensuite, vous devez définir les différents éléments un par un sur le thème sombre . Prenons titleTextStyle comme exemple:

<style name="TextAppearance.Holo.Widget.ActionBar.Title.Own"
       parent="TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="Android:textColor">@Android:color/primary_text_holo_dark</item>
    <item name="Android:textColorHighlight">@Android:color/highlighted_text_holo_dark</item>
    <item name="Android:textColorHint">@Android:color/hint_foreground_holo_dark</item>
    <item name="Android:textColorLink">@Android:color/holo_blue_light</item>
</style>

Définissez ceci maintenant.

<item name="Android:titleTextStyle">@Android:style/TextAppearance.Holo.Widget.ActionBar.Title.Own</item>

Procédez comme ceci avec les attributs XML ci-dessus. 

Pour rechercher tous les attributs connexes, recherchez-le dans les fichiers styles.xml et themes.xml . Désolé de le dire, mais je suppose qu’il n’existe aucun moyen simple, selon ce que je vois ...

24
KarlKarlsom

J'ai rencontré un problème similaire lorsque je voulais mettre une vue personnalisée dans la barre d'actions. Je voulais une barre d'action sombre tandis que le reste de l'application est resté léger. Plus précisément, j'avais des fileuses dans la barre d'action.

D'abord, votre thème devrait s'étendre 

<style name="MyTheme.Light" parent="Android:Theme.Holo.Light.DarkActionBar">

Ensuite, dans votre activité, utilisez getActionBar().getThemedContext() comme contexte pour gonfler vos vues. Dans mon cas, c'est ce que j'ai transmis à mes adaptateurs multidisques. 

A parfaitement fonctionné pour moi.

5
kristesla

J'ai trouvé ça facile ... 100% fonctionne

ajoutez la ligne ci-dessous à Assemblyinfo.cs

[Assembly: Application(Theme = "@Android:style/Theme.Material.Light.DarkActionBar")]
0
Rajat