Passer une application à Material Design

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J'ai développé il y a quelques temps une application avec le thème Holo d'Android 4.4, et comme Android Lolipop est arrivé, j'aimerais la faire passer au Material Design.

Après quelques recherches dans la doc sur le sujet, j'ai pu voir que le plus simple (du moins en théorie…) était de changer le target SDK sur celle de Lolipop (API 21) et de créer un fichier nommé styles.xml dans un nouveau dossier res/values-v21 (ce qui, si j'ai bien compris, permet d'activer le Material Design uniquement pour l'API 21+, tandis que les versions précédentes utiliseront Holo).

Le contenu de mon styles.xml est relativement simple :

1
2
3
4
5
6
7
<resources>

    <style name="AppBaseTheme" parent="android:Theme.Material.Light">

    </style>

</resources>

La première chose que j'ai pu remarquer, c'est qu'IntelliJ IDEA me signale ceci au niveau du android:Theme.Material.Light :

Cannot resolve symbole 'android:Theme.Material.Light'

Et à la compilation (que j'ai lancé uniquement pour essayer d'avoir une erreur un peu plus explicite), le compilateur me jette avec l'erreur suivante :

Error:(3, -1) android-apt-compiler: […] error: Error retrieving parent for item: No resource found that matches the given name 'android:Theme.Material.Light'.

Quelle erreur ai-je faite ? :(

Merci d'avance.

+0 -0

Salut,

Je pense que mon SDK est bien à jour, comment vérifier cela ? En tout cas j'utilise bien l'API 21 (correspondant à Lolipop).

Sinon, j'ai choisi d'utiliser Materrial Design sur Lolipop uniquement car personnellement, je trouve que cette nouvelle interface s'intègre mal à KitKat et versions antérieures, qui sont à mon avis plus faites pour utiliser Holo. De plus, mon application doit être au minimum compatible avec Android 4.0 (API 14), pour lequel Material Design n'est pas disponible nativement (ce qui me semble logique).

+0 -0

Salut,

Pour ton problème majeur, partons du principe que tu as installé la dernière version du SDK via le SDK Manager que ton IDEA utilise, est-ce que tu peux nous montrer ton build.gradle du module principal de ton projet ?

Pour ton problème mineur, il est maintenant possible de porter Material Design sur les versions ultérieurs à Lollipop (il y a deux l à Lollipop :-°). Tout comme il existe des projets de compatibilité pour d'autres versions d'Android vers des versions anciennes comme 2.1, 2.2. Il existe une équivalence qui permet une retrocompatibilité vers les anciennes versions (2.3 de mémoire). Après, libre à toi de vouloir l'utiliser ou non.

Pour ton problème majeur, partons du principe que tu as installé la dernière version du SDK via le SDK Manager que ton IDEA utilise, est-ce que tu peux nous montrer ton build.gradle du module principal de ton projet ?

Andr0

Bonsoir,

Euh, c'est quoi le build.gradle ? :-°

Désolé de paraître noob, je début un peu dans le développement Android ^^'

+0 -0

Ah, comme tu parlais d'IntelliJ, je pensais que tu utilisais Android Studio basé sur IntelliJ. Du coup, est-ce que tu utilises un gestionnaire de dépendances du type Maven (ou Gradle) ? Si oui, tu peux nous le montrer ? Est-ce que tu pourrais nous montrer ton Android Manifest aussi ?

En fait, je ne connaissais même pas l'existence d'un tel outil… Tu me conseilles quoi ? :honte:

Sinon, voici le contenu de mon AndroidManifest.xml :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.deuchnord.gestioncarteru"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Holo.Light">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".AddMoneyActivity"
            android:label="@string/title_activity_add_money"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.deuchnord.gestioncarteru.MainActivity" />
        </activity>
        <activity android:name=".SpendMoneyActivity"
            android:label="@string/add_spend"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.deuchnord.gestioncarteru.MainActivity" />
        </activity>
        <activity android:name=".PredefinedPaymentsManagerActivity"
            android:label="@string/managePredefinedPayments"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.deuchnord.gestioncarteru.MainActivity" />
        </activity>
        <activity android:name=".AddPredefinedPaymentActivity"
                  android:label="@string/addPredefinedPayment"
                  android:parentActivityName=".PredefinedPaymentsManagerActivity">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                       android:value="com.dechnord.gestioncarteru.AddPredefinedPaymentActivity" />
                  </activity>
        <activity android:name=".AboutActivity"
                  android:label="@string/aboutApp"
                  android:parentActivityName=".MainActivity">
            <meta-data android:name="android/support.PARENT_ACTIVITY"
                       android:value="com.dechnord.gestioncarteru.AboutActivity" />
                  </activity>
    </application>

</manifest>

PS : IntelliJ m'a un peu fait du nawak avec l'indentation, je corrigerai ça quand j'en aurai le temps, désolé :-°

+0 -0

Ca dépend beaucoup des outils que tu utilises et ta motivation a vouloir migrer vers un gestionnaire de dépendances (personnellement, je ne peux que te le conseiller). Il en existe 2 pour Android : Maven et Gradle.

Maven est un support "historique" dans le sens où dans les débuts d'Android, il fallait un gestionnaire de dépendances et Maven était le plus utilisé (toujours à ce jour d'ailleurs). Cependant, Google a récemment sorti Android Studio, un IDE basé sur IntelliJ qui intègre Gradle.

Quand je dois conseiller à un autre développeur les outils à utiliser dans le développement mobile (Android et iOS compris), je lui conseil toujours le combo Android Studio (IntelliJ pour iOS) et Gradle parce que (pour Android) Android Studio va devenir l'IDE par défaut et parce que Gradle permet de faire des choses assez sympas. La difficulté, c'est sa prise en main. Si tu connaissais Maven, c'est encore assez simple mais partir de 0, c'est un peu chaud.

Ca c'était la parenthèse … Oui, grosse parenthèse.

Retournons à ton problème principal. Déjà, quelque chose m'interpèle dans ton manifest : Tu sembles utiliser le style android:theme="@android:style/Theme.Holo.Light" alors que tu voudrais utiliser Material pour la version de l'API 21 et Holo pour les autres. Il faut donc que tu te retrouves avec deux styles : un dans res/values-v21/style.xml pour un thème Material Design sur les téléphones à partir de Lollipop et un autre dans res/values/style.xml pour un thème Holo sur toutes les autres versions. Dans ces deux fichiers XML que tu vas devoir faire évoluer en même temps (berk), tu vas devoir déclarer un style "root" avec le même nom dans les deux fichiers pour les utiliser dans l'Android Manifest, AppBaseTheme est un bon nom pour root comme tu le mentionnes dans le premier message de ton sujet.

Ceci ne règle pas ton problème, pour pouvoir régler ton problème, faudrait que tu nous dises si tu utilises la preview de Material Design (dans ce cas, il faudra spécifier 'L' comme version et pas 21 dans le manifest), sinon c'est sans doute lié à une mauvaise manipulation dans les dépendances de ton projet. Dans ce cas, est-ce que tu pourrais les lister ?

La liste des dépendances d'un projet, ce sont toutes les librairies que tu utilises : Le sdk et les librairies externes.

Par contre, ton problème est quand même bizarre si ton style.xml est bien dans le v21 et que tu peux utiliser les classes de Material Design dans le code source (confirme moi ce dernier point).

PS : Sorry, peu de temps en ce moment.

Si tu utilises Eclipse, tu peux trouver les librairies que ton projet emploie en cliquant droit sur le nom de ce dernier, onglet Properties (ou raccourci Alt+Entrée) > onglet Android, ou de manière plus détaillée dans l'onglet Java Build Path. Là tu pourra t'assurer d'utiliser ta lib android v21 compatible au Material Design.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte