2014-02-06 77 views
33

幾周前,我發佈了一個問題How to override resources depending on buildType。 而就在昨天,有一個gradle plugin release for android。 基於this post on G+我決定寫這個問題。resValue gradle錯誤:「generated.xml」中的不受支持的類型「String」

我已經詳細描述的問題:

我想這取決於buildType創建一些資源價值,但是,這並不正常工作: 文件「generated.xml」將只創建如果我做一個完整的構建通過命令行:

gradlew build 

但我也通過在comannd線構建完整的項目得到一個錯誤210

每隔一個build-trial都不會創建這個文件。我嘗試以下操作:

  • 了IDE:
    • 改造項目
    • 在命令行中執行外部任務 「assembleBuildVariant」
    • gradlew assembleBuildVariant

奇怪gradle這個控制檯輸出:

:app:generateBuildVariantResValues UP-TO-DATE 

我的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" 
    } 
} 

我 「generated.xml」:

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

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

我的問題:

這是一個錯誤還是我錯過了什麼?爲什麼這個文件不是由IDE上的Rebuild創建的?

我的建設。gradle這個(基於rciovatis答案更新2014年2月10日):

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" 
    } 
} 

UPDATE 2014年2月14日IT WORKS:

an update of the gradle android plugin一切正常:

在/編譯/ RES /所有/你應該看到下列文件夾:

  • 所有
  • 產生( - >在這裏你會發現生成的資源通過resValue值)

第一個文件夾all包含所有合併的資源。在方向all/<buildVariant>/values/values.xml你應該找到生成的資源,在我的情況:

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

要獲得代碼值只使用生成的資源所有其他人一樣:

getResources().getString(R.string.TESTFOO) 
+0

爲什麼你需要** ** buildConfigField?你在你的代碼中調用它在哪裏? –

回答

57

我解決了增加的資源也在defaultConfig塊。對你來說會是這樣的:

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" 
     } 
    } 
} 

請注意:

  • 項目類型必須爲string,而不是String
  • 項目名稱不能包含空格(如正常的資源名稱)

編輯: 由於0.8.3應該工作正常剛剛宣佈resValue在構建類型塊。

+0

感謝您的回覆。它真的很有意義,項目名稱不應該包含空格:)。我想你的答案(見我的更新),但我還沒有從代碼中訪問到新的資源價值( - >'getResources()的getString(R.string.RES_FOO)')。此外,「generated.xml」文件不是通過IDE上的內部版本創建的。在控制檯的gradle我可以看到'resValue'的任務,但它總是UP-TO-DATE(:應用程序:生成 ResValues UP-TO-DATE)。你有權訪問代碼中生成的res值嗎? – owe

+2

使用gradle插件的最新版本( - > 0.8.3)可以正常工作。 – owe

+0

截至今天,另一種解決方案是創建src/debug/res/values/strings.xml並在其中添加RES_FOO字符串。在這種情況下,我假設RES_FOO在默認的strings.xml就是將用於發佈版本,但如果這不是你還可以創建一個src /發行/ RES /價值/ strings.xml中的情況。 – riper

相關問題