2016-05-26 67 views
16

resValue方法(或任何它被称为)允许您在buildTypesproductFlavors设置资源值有没有相应的方法得到资源值是由resValue设置的?如何在build.gradle中获取资源值?

似乎productFlavorsbuildTypes之前评估,所以resValuebuildTypes优先。我想在调试版本中将“Debug”附加到应用程序名称中,但我需要获取在产品风格中设置的值以附加到它。

编辑:我试过马尔辛 - 科津斯基的建议,使用一个变量,但任何构建类型之前所有产品口味进行评估。因此,这并不工作:

android { 
    String appName = "" 

    productFlavors { 
     Foo { 
      appName = "Foo" 
     } 

     Bar { 
      appName = "Bar" 
     } 
    } 

    buildTypes { 
     release { 
      resValue "string", "app_name", appName 
     } 

     debug { 
      resValue "string", "app_name", appName + " Debug" 
     } 
    } 
} 

buildTypesappName总是从最后产品风味的价值。所以在这个例子中,所有版本都会收到名称"Bar""Bar Debug"

基本上,我需要一个resValueSuffix类似于applicationIdSuffix。显然没有这样的动物存在。 com.android.application插件是否暴露了我可以用来实现这一目的的任何内容?

+0

http://stackoverflow.com/questions/17275461/how-to-replace-strings-resources-with-android-gradle –

+0

@TimCastelijns Q&A是关于来自'strings.xml'的资源。我的资源是用'resValue'创建的。 –

+0

app_name是否在您的应用程序中除了清单之外的任何地方使用? – cyroxis

回答

21

如果哟你只是试图设置应用标签(或其他清单值),你可以用明显的占位符解决这个问题。

android { 

    productFlavors { 
     Foo { 
      applicationId "com.myexample.foo" 
      manifestPlaceholders = [ appName:"Foo"] 
     } 

     Bar { 
      applicationId "com.myexample.bar" 
      manifestPlaceholders = [ appName:"Bar"] 
     } 
    } 

    buildTypes { 
     release { 
      manifestPlaceholders = [ appNameSuffix:""] 
     } 

     debug { 
      manifestPlaceholders = [ appNameSuffix:".Debug"] 
      applicationIdSuffix ".debug" 
     } 
    } 
} 

然后在你的Android清单您只需使用这两个占位符为你的应用程序名称(或其他值)

<application 
     android:label="${appName}${appNameSuffix}" 
     ... 
</application> 

这允许您在单个设备上安装并排所有4个变量的一面,以及因为在应用程序抽屉/启动器中给他们不同的名字。

+0

非常好!谢谢。 –

+7

我仍然很好奇OP的问题如何在获取资源价值的问题上得到回答... –

+0

我不知道它是否可能,如果是我一直无法弄清楚。 – cyroxis

1

要在调试版本中拥有替代版本的资源,您可以使用调试源集。

strings.xml可以在以下路径src/main/res/values中找到,这意味着它位于主源集中。如果您创建了一个新目录src/debug/res/values,则可以将新的strings.xml文件与应该在调试版本中重写的值一起放入。例如:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="app_name">My Application Debug</string> 
</resources> 

这将取代您的主文件中的任何值app_name。你不必在这里复制所有的字符串 - 这里没有包含的字符串只是从主文件中获取。

+1

资源不在'strings.xml'中。我使用'resValue'创建它,因为我预计要增加构建变体*产品风格的数量,并且我希望避免为每个组合创建'strings.xml'。 –

+0

如果您使用'resValue'创建原始值,那么您不必从资源中读取它。您已在'build.gradle'脚本中拥有该值。只需将它分配给一个局部变量并用它为每个变体创建一个资源。 –

+0

我试着把变量放在'android'范围内。所有产品口味都在任何构建类型之前运行,因此每个构建类型都会看到最后一个产品口味中分配的值。 –

3

您可以检查构建变种这样

在gradle这个定义值

buildTypes { 
    debug{ 
     buildConfigField "String", "Your_string_key", '"yourkeyvalue"' 
     buildConfigField "String", "SOCKET_URL", '"some text"' 
     buildConfigField "Boolean", "LOG", 'true' 
    } 
    release { 
     buildConfigField "String", "Your_string_key", '"release text"' 
     buildConfigField "String", "SOCKET_URL", '"release text"' 
     buildConfigField "Boolean", "LOG", 'false' 

    } 
} 

并访问使用建变种这些值:

if(!BuildConfig.LOG) 
     // do something with the boolean value 

或者

view.setText(BuildConfig.yourkeyvalue); 
+0

有问题的资源是应用程序名称,所以它必须是一个资源。 –