【问题标题】:Defining 'resValue' using an existing string definition使用现有字符串定义定义“resValue”
【发布时间】:2016-04-04 23:25:49
【问题描述】:

我更感兴趣的是在 strings.xml 文件而不是 build.gradle 中定义我的应用程序的多种风格。鉴于多种口味,我想要一个简化的发布/调试变体:

  buildTypes {
    release {
        signingConfig signingConfigs.release
        resValue "string", "app_name", "@string/prod_name"
    }
    debug {
        applicationIdSuffix ".beta"
        resValue "string", "app_name", "@string/beta_name"
    }

然后在我的每个构建风格的自定义 res/values/strings.xml 文件中,我将定义每个自己的“prod_name”和“beta_name”。我也想使用这个类似的框架来定义提供者的权限等......

目前可以通过 gradle 命令行正常构建,但无法被 Android Studio 识别。

Android Studio 错误:

我在 'generated.xml' 中找到了这个

<!-- Values from build type: debug -->
<string name="app_name">@string/beta_name</string>

这是一个字符串引用另一个字符串的典型方式。但是这次Android Studio给了我这个错误:

Error:(7, 29) No resource found that matches the given name 
(at 'app_name' with value '@string/beta_name').

我正在使用 Android Studio 2.1 Preview 5

【问题讨论】:

  • 您能否更具体地说明“无法被 Android Studio 识别”的具体含义?
  • ..w.你为什么不把正确的字符串放到正确的资源目录中? src/release/res/values/strings.xml 用于发布特定字符串,src/debug/res/values/strings.xml 用于调试版本?

标签: android gradle android-gradle-plugin build.gradle android-resources


【解决方案1】:

这实际上是可能的。您所要做的就是在您的 defaultConfig 中将这些字符串声明为空,如下所示:

defaultConfig {
    resValue "string", "prod_name", ""
    resValue "string", "beta_name", ""
}

【讨论】:

  • 这不会和每个flavor的strings.xml文件中的定义冲突吗?风味的 strings.xml 文件覆盖了 gradle 的 'defaultConfig'?
  • 请注意,自从更新到 Gradle 插件 v3.5.0 后,这似乎是必需的
  • 这似乎不再起作用了。我过去也这样用过(当你写这个答案时)
【解决方案2】:

根据我的经验,您无法在 resValue DSL 中解析 @string/my_string。 Gradle 将值作为一个简单的字符串放入资源文件中。

在这种情况下,您可以使用不同的文件夹来实现它:

只需使用:

src/release/res/values/strings.xml
src/debug/res/values/strings.xml

如果您想为每个构建变体(构建类型+风味)使用不同的资源,您可以使用:

src/flavor1Release/res/values/strings.xml
src/flavor1Debug/res/values/strings.xml
src/flavor2Release/res/values/strings.xml
src/flavor2Debug/res/values/strings.xml

【讨论】:

  • 如果我已经在处理多种口味怎么办?我有我的常规“res”目录,以及我的风味 res 目录:“/one/res/”、“/two/res”等......我最初只是想定义“prod_name”和“beta_name”每个风味的 res 子目录,从而最大限度地减少 2 倍的目录...
  • 在这种情况下,只需在这些文件中添加字符串(在 buildtype 中具有不同的值)。
  • 在文档中找不到很好的示例。如何为每种风味定义调试和发布目录。我已经有了我的主要“res”以及“one/res”、“two/res”等......适用于所有口味。
  • 这与使用 Gradle 的 resValues 有何不同?
【解决方案3】:

您可以在 gradle 中为您的构建风格添加 res 值

productFlavors {

   prod {
        dimension "default"
        resValue "string", "app_name", "your prod app name"    
    }


    staging {
       dimension "default"
        resValue "string", "app_name", "your staging app name"    

    }
}

【讨论】:

  • 最初的目的是将所有定义保存在各种strings.xml文件中,而不是直接在gradle文件中设置定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
相关资源
最近更新 更多