web-dev-qa-db-fra.com

Erreur de graduation resValue: type non pris en charge «chaîne» dans «généré.xml»

Il y a quelques semaines, j'ai posté une question Comment remplacer les ressources en fonction de buildType . Et hier encore, il y a eu version du plugin Gradle pour Android . Basé sur ce post sur G + J'ai décidé d'écrire cette question.

Le problème que j'ai décrit en détail:

Je veux créer des valeurs de ressource en fonction de buildType, mais cela ne fonctionne pas correctement: le fichier "generate.xml" ne sera créé que si je fais une construction complète sur la ligne de commande:

gradlew build

Mais j'obtiens également une erreur en construisant le projet complet sur la ligne comannd:

* What went wrong: Execution failed for task ':app:merge<buildVariant>Resources'.
Unsupported type 'String' in file C:\Users\...\build\res\generated\release\values\generated.xml

Aucun autre essai de génération ne crée ce fichier. J'ai essayé de suivre:

  • sur IDE:
    • projet de reconstruction
    • exécuter la tâche externe "assembleBuildVariant"
  • sur la ligne de commande:
    • gradlew assembleBuildVariant

Étrange sortie console Gradle:

:app:generateBuildVariantResValues UP-TO-DATE

Mon build.gradle:

buildTypes {
    debug{
        buildConfigField "String", "FOO", "\"FOO DEBUG\""
        resValue "String", "RES FOO", "RES FOO DEBUG"
    }
    release {
        buildConfigField "String", "FOO", "\"FOO RELEASE\""
        resValue "String", "RES FOO", "RES FOO RELEASE"
    }
}

Mon "généré.xml":

<!-- Automatically generated file. DO NOT MODIFY -->

<!-- Values from build type: release -->
<item name="RES FOO" type="String">RES FOO RELEASE</item>

Ma question:

Est-ce un bug ou ai-je raté quelque chose? Et pourquoi ce fichier n'est pas créé par un Rebuild sur l'IDE?

Mon build.gradle (MISE À JOUR 2014-02-10 basée sur la réponse de rciovatis):

defaultConfig {
    minSdkVersion 14
    targetSdkVersion 19
    versionCode 1
    versionName "1.0"
    resValue "string", "RES_FOO", "RES FOO"
}

buildTypes {
    debug{
        buildConfigField "String", "FOO", "\"FOO DEBUG\""
        resValue "string", "RES_FOO", "RES FOO DEBUG"
    }
    release {
        buildConfigField "String", "FOO", "\"FOO RELEASE\""
        resValue "string", "RES_FOO", "RES FOO RELEASE"
    }
}

MISE À JOUR 2014-02-14 IL FONCTIONNE:

Après ne mise à jour du gradle Android tout fonctionne bien:

Dans/build/res/all/vous devriez voir les dossiers suivants:

  • tout
  • généré (-> ici vous trouvez les valeurs des ressources générées par resValue)

Le premier dossier all contient toutes les ressources fusionnées. Dans la direction all/<buildVariant>/values/values.xml vous devriez trouver les ressources générées, dans mon cas:

// for buildType DEBUG
<item name="TESTFOO" type="string">TEST FOO DEBUG</item>
// for buildType RELEASE
<item name="TESTFOO" type="string">TEST FOO RELEASE</item>

Pour obtenir les valeurs dans le code, utilisez simplement la ressource générée comme toutes les autres:

getResources().getString(R.string.TESTFOO)
36
owe

J'ai résolu d'ajouter les ressources également dans le bloc defaultConfig. Pour vous, ce serait quelque chose comme:

Android {
    defaultConfig {
        resValue "string", "RES_FOO", "RES FOO RELEASE"
    }

    buildTypes {
        debug{
            buildConfigField "String", "FOO", "\"FOO DEBUG\""
            resValue "string", "RES_FOO", "RES FOO DEBUG"
        }
        release {
            buildConfigField "String", "FOO", "\"FOO RELEASE\""
            resValue "string", "RES_FOO", "RES FOO RELEASE"
        }
    }
}

Veuillez noter que:

  • le type d'élément doit être string et non String
  • le nom de l'élément ne doit pas contenir d'espaces (comme nom de ressource normal)

EDIT: depuis la version 0.8.3, cela devrait fonctionner correctement en déclarant simplement la resValue dans le bloc de type de construction.

62
rciovati