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?
Il existe actuellement jusqu'à 3, parfois 4 thèmes disponibles pour les appareils Android (.Light
variations et similaires non inclus)
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
introduit avec Android 3.0 Honeycomb (11)
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?
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).
Theme
(c'est-à-dire les niveaux d'API 3 à 10), recevront uniquement Theme
.Theme.Holo
.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.
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"
...
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
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