【问题标题】:Change string resource by flavor / debug-build通过风味/调试构建更改字符串资源
【发布时间】:2016-04-04 01:04:00
【问题描述】:

假设我们有 strings_test.xml,它存储用于测试的字符串值,应该在调试版本中显示。当 apk 被构建为发布版本时,所有值都应更改为空字符串,例如<string name="test_some_card_text">@string/empty</string>.

有没有可能做到这一点?

一如既往,提前致谢。

【问题讨论】:

    标签: android build resources


    【解决方案1】:

    是的,您可以在 buildTypes 下的应用程序 gradle 中执行此操作。

     buildTypes {
            mybuild {
                     resValue "string", "test_some_card_text", '"test"'
                     resValue "string", "other_text", '"other"'
                    }
             debug {
                     resValue "string", "test_some_card_text", '"test"'
                     resValue "string", "other_text", '"other"'
                  }
              }
    

    然后像这样访问它。

    getApplicationContext().getResources().getString(R.string.test_some_card_text);
    getApplicationContext().getResources().getString(R.string.other_text);
    

    对于构建,您需要选择 build variants 并且必须构建它。

    【讨论】:

    • 是否可以在我的 strings.xml 文件中将其用作 Doctype 实体?
    • @Syzygy 您能否详细说明您的问题或提出新问题?
    • Madhukar,我相信@Syzygy 指的是这里部分回答的内容:stackoverflow.com/a/51310147 但是,我也无法使用风味来切换 XML 实体(用于字符串)。
    • 这可以在 XML 文件中作为字符串资源访问吗?
    【解决方案2】:

    是的,Gradle 允许您覆盖字符串。

    • 在你的 app/build.gradle 中的 buildTypes{} 中添加这个

      调试{ applicationIdSuffix “调试” }

    • 这应该在main 旁边创建一个名为debug 的目录。如果没有,则手动创建一个。 (说真的,我还没有尝试过,但我知道这是可能的。)

    • 然后,如果您的 strings_test.xmlres/values 下,请在 debug/ 下创建类似的目录结构,并将带有调试特定字符串的 strings_text.xml 放在那里。这将显示在您的调试版本中。 release/main/res/values 下的那些将显示在您的发布版本中。

    PS:您可以根据 buildTypes 和风格覆盖所有资源和资产数据。您不能覆盖 Java 文件,但是您可以添加它们。

    【讨论】:

      【解决方案3】:

      正如@Aditya Naik 所说,可以使用 Flavors。 官方文档说

      BuildType -> Flavor -> main -> 依赖项。

      这意味着如果在 Build Type 和 main 中都声明了一个资源,则会选择 Build Type 中的那个。

      请注意,对于合并的范围,相同(类型、名称)但不同限定符的资源分别处理。

      这意味着如果 src/main/res 有

      • res/layout/foo.xml
      • res/layout-land/foo.xml

        并且 src/debug/res 有

      • res/layout/foo.xml

        然后合并的资源文件夹将包含来自 src/debug/res 的默认 foo.xml,但来自 src/main/res 的横向版本

      更多信息请访问Official doc - Resource Merging

      【讨论】:

        【解决方案4】:

        创建 apk 后无法更改字符串值。 但是您可以在创建 apk 后动态地将值分配给 text 或 edittext ... etx。

        【讨论】:

        • 是的,那是真的.. 但是覆盖每个 TextView/EditText 本身似乎有点不方便。我猜应该有可能通过提供不同的构建风格,但我还没有找到解决方案。
        • 你能告诉我你为什么要更改字符串值,以便我可以给你一些想法
        • 当我测试我的应用程序时,我希望能够在 GUI 中插入一些虚拟数据(包括各种组合的多行等)-> 我们称之为对布局进行压力测试。 :) 但是如果这些测试资源在发布版本中被覆盖会很好。
        • 是的,但我们不能这样做。在数据库中创建一个带有名称和 id 的表,并将所有值传递给 db 和 from 到 gui。它有点长,但只有一次处理。对于一个我的 gui 我做了同样的事情。
        【解决方案5】:

        对于那些来这里寻找某种方式将类似方法应用于raw 资源的人,我使用buildConfigField 处理它。

        gradle
        ...
        buildTypes {
            debug {
                ...
        
                buildConfigField "int", "shared_resource_name", 'R.raw.debug_resource_name'
        
                ...
            }
            prod {
                ...
        
                buildConfigField "int", "shared_resource_name", 'R.raw.prod_resource_name'
        
                ...
            }
        }
        

        注意引号。之后,将BuildConfig.shared_resource_name 放在以前可以直接访问R.raw.resource_value 的文件中。

        这可以用于我认为的其他资源。

        【讨论】:

          猜你喜欢
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-08
          • 2022-07-01
          • 1970-01-01
          • 2011-08-22
          • 2013-10-18
          相关资源
          最近更新 更多