web-dev-qa-db-fra.com

Comment utiliser le thème par défaut de l'appareil pour l'application?

J'ai une application que je souhaite développer pour Android 2.1, 2.2, 2.3.3, 3.0/3.1 et 4.0.x. Entre ces niveaux d'API, il existe environ 3 types de thèmes différents. Le dernier thème 4.0.x est Holo.

Quoi qu'il en soit, je veux que mon application utilise le thème par défaut Android pour tout appareil sur lequel elle se trouve. Si elle est sur un appareil 4.0.x, je veux qu'elle utilise Holo. Si elle est sur 2.3.3, je Je veux qu'il utilise le thème de cette version d'Android. etc ...

Existe-t-il un moyen simple d'aborder cela? J'ai remarqué qu'avec 4.0, ils ont ajouté un Theme.DeviceDefault thème que vous pouvez utiliser, mais cela ne m'aide pas pour les anciens niveaux d'API. Quelle est la meilleure approche à ce sujet?

41
Jake Wilson

Il existe actuellement jusqu'à 3, parfois 4 thèmes disponibles pour les appareils Android (.Light variations et similaires non inclus)

Theme

Theme

la valeur par défaut pour les premières versions de Android jusqu'à 2.3 Gingerbread (10), y compris quelques changements de style mineurs dans ces versions


Theme.Holo

Theme.Holo

introduit avec Android 3.0 Honeycomb (11)


Theme.Material

Theme.Material

nouveau dans Android 5.0 Lollipop (21)


Theme.DeviceDefault

(Ça pourrait être n'importe quoi)

introduit avec 4.0 Ice cream sandwich (14), un thème qui peut être personnalisé par le fabricant de l'appareil. Il représente l'aspect natif de l'appareil - c'est-à-dire Holo ou Material sur les appareils Nexus (& dans Android l'éditeur de conception de Studio), peut-être quelque chose de personnalisé sur d'autres appareils. Dans le cas où "quelque chose de personnalisé" n'est pas une option, ces appareils doivent être livrés avec les thèmes de stock. Les applications qui veulent que le thème de stock doivent le spécifier cependant.


Quelle est la meilleure approche à ce sujet?

Aucun thème + targetSdkVersion> = 14

L'option la plus simple, mais pas nécessairement la meilleure, est de ne définir aucun thème. Android sélectionnera alors la valeur par défaut pour vous. Mais Android ne veut pas surprendre votre application avec des thèmes auxquels vous ne vous attendez pas, elle revient donc au thème vous avez probablement conçu votre application. Pour ce faire, consultez le Android:targetSdkVersion dans AndroidManifest.xml (qui peut être réglé de nos jours via gradle).

  • Les applications qui ciblent les anciennes plates-formes, qui n'avaient que Theme (c'est-à-dire les niveaux d'API 3 à 10), recevront uniquement Theme.
  • Les applications ciblant 11-13 obtiennent Theme.Holo.
  • 14 ou plus obtiendra Theme.DeviceDefault.

Comme c'est juste pour une compatibilité ascendante, vous n'obtiendrez pas Theme.Material sur votre ancien téléphone Gingerbread. Par conséquent, aucun thème + cible 14+ = appareil par défaut.

Spécification de différents thèmes

Le système de superposition de ressources d'Android permet de spécifier des styles en fonction du niveau d'API de l'appareil. Par exemple, différentes versions d'un style dans res/values-v11 et res/values-v21. C'est également ce que toute application nouvellement créée via Android Studio configurera pour vous.

Par exemple, la configuration la plus basique pour un .Light l'application à thème ressemble à ceci:

/res/values/styles.xml est appliqué à chaque appareil et sert de base

<resources>
    <style name="AppTheme" parent="Android:Theme.Light"/>
</resources>

/res/values-v11/styles.xml est chargé sur tous les appareils dotés de l'API de niveau 11 et supérieur (y compris ceux de 21 ans et plus). Mais seule la dernière version de "AppTheme" est réellement utilisée.

<resources>
    <style name="AppTheme" parent="Android:Theme.Holo.Light"/>
</resources>

/res/values-v21/styles.xml

<resources>
    <style name="AppTheme" parent="Android:Theme.Material.Light"/>
</resources>

Remarque: spécifiez également Theme.DeviceDefault dans /res/values-v14/styles.xml devrait suffire pour avoir un look par défaut mais cela ne permet pas d'affiner le design. Cela ne fait pas de mal d'ajouter le remplacement v14. DeviceDefault et Holo pourraient être différents après tout.


AndroidManifest.xml est l'endroit où le thème personnalisé est utilisé. Par exemple. par défaut à l'échelle de l'application:

...
<application
    Android:theme="@style/AppTheme"
    ...

Liens vers la documentation officielle

Sélectionnez un thème basé sur la version de la plateforme - Doc officiel pour définir différents styles via les configurations de ressources

Holo Everywhere - article de blog qui explique le mécanisme par défaut et le thème DeviceDefault/Holo

tilisation du thème Material - documentation matérielle

68
zapl

Vous pouvez déclarer un thème dans vos valeurs/styles.xml puis dans vos valeurs-v11/styles.xml le remplacer par la version Holo:

values ​​/ styles.xml:

 <style name="DialogTheme" parent="@Android:style/Theme.Dialog"></style>

values-v11/styles.xml:

 <style name="DialogTheme" parent="@Android:style/Theme.Holo.Light.Dialog.NoActionBar"></style>

Faites-le de cette façon, et vous aurez des thèmes Holo sur les appareils API 11+ et des thèmes réguliers sur les autres.

Cordialement, Steffen Vangsgaard

3
Steffen Vangsgaard