在Gradle for Android中,我正在尝试生成与此字符串数组资源等效的资源...
<resources>
<string-array name="url_array">
<item>http://www.url1.com</item>
<item>http://www.url2.com</item>
<item>http://www.url3.com</item>
</string-array>
</resources>...in我的应用程序的build.gradle配置文件。我不想在res/ values /arrays.xml中硬编码这些值,因为我希望能够为不同的构建变量(dev和prod)生成不同的数组内容。我知道有变通的方法,但如果可能的话,这将是最干净的解决方案。
我尝试了下面摘录的“字符串数组”或“数组”的resValue类型,但是我得到了一个错误,说resValue()不存在。当然,resValue类型参数" string“适用于单个字符串,但我需要生成字符串数组资源。
resValue "string-array", "url_array",
["http://www.url1.com",
"http://www.url2.com",
"http://www.url3.com"]Android的Gradle文档没有帮助。它列出了这个方法...
void resValue(String type, String name, String value)
...but它不指示类型参数的有效值。它只有一个链接,上面写着"See Resource Types“,但它只指向常规的Android文档中的资源类型,并没有描述如何在Gradle Android DSL中表达它们。
有谁有什么建议吗?我在网上找遍了,什么也没找到。
发布于 2016-07-13 00:57:55
这是我在@schwiz的指导下得到的最接近的结果。我仍然找不到使用resValue实现这一点的方法,但是可以定义一个可以实现相同目标的buildConfigField:
buildConfigField "String[]", "URL_ARRAY",
"{" +
"\"http://www.url1.com\"," +
"\"http://www.url2.com\"," +
"\"http://www.url3.com\"" +
"}"这使您可以通过BuildConfig访问该阵列:
public static final String[] URL_ARRAY = {
"http://www.url1.com",
"http://www.url2.com",
"http://www.url3.com"}; // whitespace added for clarity然后,您可以覆盖每个buildType的buildConfigField值。因此,除非您特别需要在R.array.*中使用它,否则这将满足您的需要。现在让它开放,以防其他人知道如何使用resValue做到这一点。
发布于 2017-01-15 06:16:07
为了能够通过resValue创建数组,您应该将所有数组元素存储在item标记中。因此,您应该在gradle中编写类似下面这样的代码:
resValue('array', 'ver_2_skus', "<item>sku1</item><item>sku2</item>")但是有一个可怕的bug --所有的<符号都以<的形式写入到res中。我花了一些时间来寻找如何使用gradle来编写<,但是失败了。所以我做了一个技巧--我用一些字符串替换<,然后在构建之后,用<替换它。我讨厌这个黑客,也许我错过了一些东西,但它是有效的。下面是你必须放在gradle脚本末尾的代码(是的,代码必须被复制才能工作)。
创建res数组时,
<替换为某个字符串,即IWANTTOREPLACEITWITHLEFTARROWresValue('array', 'ver_2_skus', "IWANTTOREPLACEITWITHLEFTARROWitem>sku1IWANTTOREPLACEITWITHLEFTARROW/item>IWANTTOREPLACEITWITHLEFTARROWitem>sku2IWANTTOREPLACEITWITHLEFTARROW/item>")android.applicationVariants.all { variant ->
println("variant: "+variant.dirName)
variant.mergeResources.doLast {
try {
println("3")
ext.env = System.getenv()
File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/values/values.xml")
String content = valuesFile.getText('UTF-8')
content = content.replaceAll(/IWANTTOREPLACEITWITHLEFTARROW/, '<')
valuesFile.write(content, 'UTF-8')
} catch (Exception e) {
println("Exception = " + e)
}
}
try {
println("try")
ext.env = System.getenv()
File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/values/values.xml")
String content = valuesFile.getText('UTF-8')
content = content.replaceAll(/IWANTTOREPLACEITWITHLEFTARROW/, '<')
valuesFile.write(content, 'UTF-8')
} catch (Exception e) {
println("Exception = " + e)
}
}发布于 2017-06-15 04:42:23
在BuildConfig中定义Urls的String[]:
android {
...
def tests1 = ["url-a1", "url-b1", "url-c1"]
ext {
tests2 = ["url-a2", "url-b2", "url-c2"]
}
// Specifies one flavor dimension.
flavorDimensions "default"
productFlavors {
devel {
dimension 'default'
}
}
//Default values for all productFlavors
productFlavors.all {
ext.tests3 = ["url-a3", "url-b3", "url-c3"]
}
android.applicationVariants.all { variant ->
buildConfigField("String[]", "TESTS1", '{' + tests1.collect {
"\"${it}\""
}.join(",") + '}')
buildConfigField("String[]", "TESTS2", '{' + android.ext.tests2.collect {
"\"${it}\""
}.join(",") + '}')
//TEST3 works only when is some Flavor defined
buildConfigField("String[]", "TESTS3", '{' + variant.productFlavors.get(0).ext.tests3.collect {
"\"${it}\""
}.join(",") + '}')
}
}https://stackoverflow.com/questions/38316564
复制相似问题