首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在Gradle中定义Android字符串数组资源?

是否可以在Gradle中定义Android字符串数组资源?
EN

Stack Overflow用户
提问于 2016-07-12 05:32:39
回答 4查看 5.7K关注 0票数 12

在Gradle for Android中,我正在尝试生成与此字符串数组资源等效的资源...

代码语言:javascript
运行
复制
<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“适用于单个字符串,但我需要生成字符串数组资源。

代码语言:javascript
运行
复制
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中表达它们。

有谁有什么建议吗?我在网上找遍了,什么也没找到。

EN

回答 4

Stack Overflow用户

发布于 2016-07-13 00:57:55

这是我在@schwiz的指导下得到的最接近的结果。我仍然找不到使用resValue实现这一点的方法,但是可以定义一个可以实现相同目标的buildConfigField

代码语言:javascript
运行
复制
buildConfigField "String[]", "URL_ARRAY",
        "{" +
                "\"http://www.url1.com\"," +
                "\"http://www.url2.com\"," +
                "\"http://www.url3.com\"" +
                "}"

这使您可以通过BuildConfig访问该阵列:

代码语言:javascript
运行
复制
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做到这一点。

票数 15
EN

Stack Overflow用户

发布于 2017-01-15 06:16:07

为了能够通过resValue创建数组,您应该将所有数组元素存储在item标记中。因此,您应该在gradle中编写类似下面这样的代码:

代码语言:javascript
运行
复制
resValue('array', 'ver_2_skus', "<item>sku1</item><item>sku2</item>")

但是有一个可怕的bug --所有的<符号都以&lt;的形式写入到res中。我花了一些时间来寻找如何使用gradle来编写<,但是失败了。所以我做了一个技巧--我用一些字符串替换<,然后在构建之后,用<替换它。我讨厌这个黑客,也许我错过了一些东西,但它是有效的。下面是你必须放在gradle脚本末尾的代码(是的,代码必须被复制才能工作)。

创建res数组时,

  1. 将所有<替换为某个字符串,即IWANTTOREPLACEITWITHLEFTARROW

代码语言:javascript
运行
复制
resValue('array', 'ver_2_skus', "IWANTTOREPLACEITWITHLEFTARROWitem>sku1IWANTTOREPLACEITWITHLEFTARROW/item>IWANTTOREPLACEITWITHLEFTARROWitem>sku2IWANTTOREPLACEITWITHLEFTARROW/item>")

  1. 将以下内容添加到gradle文件的末尾:

代码语言:javascript
运行
复制
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)
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-06-15 04:42:23

在BuildConfig中定义Urls的String[]:

代码语言:javascript
运行
复制
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(",") + '}')
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38316564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档