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 Android par défaut, quel que soit le périphérique sur lequel elle se trouve. Si c’est sur un périphérique 4.0.x, je veux qu’il utilise Holo. Si c’est sur 2.3.3, je veux qu’il utilise le thème de cette version d’Android. etc…

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

Il y a actuellement jusqu’à 3, parfois 4 thèmes disponibles pour les appareils Android (variations .Light et similaires non incluses).

Theme

Thème

la valeur par défaut pour les premières versions d’Android jusqu’à 2.3 Gingerbread (10), y compris des modifications mineures de style dans ces versions


Theme.Holo

Thème.Holo

introduit avec Android 3.0 Honeycomb (11)


Theme.Material

Thème.Matériel

nouveau dans Android 5.0 Lollipop (21)


Theme.DeviceDefault

(Pourrait être n’importe quoi)

introduit avec 4.0 Ice Cream Sandwich (14), un thème personnalisable par le fabricant du périphérique. Il représente l’apparence native de l’appareil – à savoir Holo ou Material sur les appareils Nexus (et dans l’éditeur de conception d’Android 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 périphériques doivent être fournis avec les thèmes de stock. Les applications qui veulent le thème de stock doivent cependant le spécifier.


Quelle est la meilleure approche à cela?

Pas de thème + targetSdkVersion> = 14

La solution la plus simple, mais pas nécessairement la meilleure, consiste à 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 inattendus, elle revient donc au thème pour lequel vous avez probablement conçu votre application. Il le fait en regardant l’ android:targetSdkVersion dans AndroidManifest.xml (qui peut maintenant être défini via gradle).

  • Les applications qui ciblent les anciennes plates-formes, qui ont uniquement un Theme (à savoir les niveaux API 3-10), n’obtiendront que le Theme .
  • Les applications ciblant les 11-13 obtiennent Theme.Holo .
  • 14 ou supérieur obtiendra Theme.DeviceDefault .

Comme il ne s’agit que d’une compatibilité avec les Theme.Material , vous n’obtiendrez pas le Theme.Material sur votre ancien téléphone Gingerbread. Par conséquent, aucun thème + cible 14+ = valeur par défaut de l’appareil.

Spécifier différents thèmes

Le système de superposition des ressources d’Android permet de spécifier les styles en fonction du niveau de l’API du périphérique. Par exemple différentes versions d’un style dans res/values-v11 et res/values-v21 . C’est aussi ce que les applications nouvellement créées via Android Studio vont configurer pour vous.

Par exemple, la configuration la plus élémentaire d’une .Light thème .Light ressemble à ceci:

/res/values/styles.xml est appliqué à chaque périphérique et sert de base

    

/res/values-v11/styles.xml est chargé sur tous les périphériques ayant l'API de niveau 11 et supérieur (y compris ceux de 21 et plus). Mais seule la version la plus récente de "AppTheme" est utilisée.

    

/res/values-v21/styles.xml

    

Note: alternativement, spécifier Theme.DeviceDefault dans /res/values-v14/styles.xml devrait suffire pour avoir un aspect par défaut, mais cela ne permet pas d'affiner le design. Cela ne fait pas mal d'append 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, comme application large par défaut:

 ...  

Liens vers la documentation officielle

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

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

Utilisation du thème matériel - documentation matérielle

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:

   

values-v11 / styles.xml:

   

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

Cordialement, Steffen Vangsgaard