是否可以从XML资源引用字符串?
我想做这样的事情:
值/ strings.xml中:
<resources>
<string name="google_analytics_key">UA-99999999-9</string>
</resources>
XML / analytics.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- THIS KIND OF REFERENCE DOESN'T WORK IN XML/ ASSETS -->
<string name="ga_trackingId">@string/google_analytics_key</string>
<bool name="ga_autoActivityTracking">true</bool>
</resources>
我正在使用Google Analytics SDK v4,我的主要目标是为 debug 和发布使用不同的Google Analytics密钥,而不会复制整个分析。 XML
我很感激任何使用 analytics.xml 的方法,因为我不想以编程方式设置分析配置。
答案 0 :(得分:2)
在您的app build.gradle脚本中,您可以添加不同的构建配置字段,如下所示:
buildTypes {
debug {
buildConfigField "String", "ANALYTICS_TRACKING_ID", "\"UA-XXXXXXXX-X\""
//...
}
release {
buildConfigField "String", "ANALYTICS_TRACKING_ID", "\"UA-XXXXXXXX-X\""
//...
}
}
然后通过BuildConfig.ANALYTICS_TRACKING_ID
如果您不想进行任何编码,则需要在src
文件夹中创建以下路径和文件:
注意:这不适用于分析sdk v4,因为xml
文件夹中的文件中的资源无法引用其他资源在这种情况下,您唯一的选择是使用此技术复制xml/analytics.xml
和src/debug/res/xml/analytics.xml
src/release/res/xml/analytics.xml
个文件
<!-- src/debug/res/values/strings.xml -->
<resources>
<string name="google_analytics_key">UA-XXXXXXXX-X</string>
</resources>
<!-- src/release/res/values/strings.xml -->
<resources>
<string name="google_analytics_key">UA-XXXXXXXX-X</string>
</resources>
并从默认google_analytics_key
中删除strings.xml
。这样,构建系统将根据当前构建变体从正确的文件中选择资源。
有关此主题的更多信息,请参阅Configuring Gradle Builds
答案 1 :(得分:1)
你可以使用这样的东西
public static String getGoogleAnalyticsKey(Context context){
return BuildConfig.DEBUG ? context.getString(R.string.analitcs_debug) : context.getString(R.string.analitics_store);
}
这个解决方案并不是最优秀的解决方案,但如果它真的有用,我就无法抗拒。令人惊讶的是:D
在最顶部,在apply plugin: 'com.android.application'
下方放置变量
def resourceString = "";
在构建类型中,声明它们。这是你需要改变的。
buildTypes {
debug {
resourceString = "UA-99999999-9"
}
release{
resourceString = "UA-11111111-1"
}
}
除此之外,发布这些行
def String makePath(String... args){
StringBuilder sb = new StringBuilder(args.length);
for(String s : args){
sb.append(s);
sb.append(File.separator);
}
return sb.toString();
}
def fix_strings_file(String filePath, String replacement){
def fileExists = new File(filePath).exists() //Check if it exists, it may already be deleted
if (fileExists) {
def newFileContent = new File(filePath).getText()
newFileContent = newFileContent.replaceAll("(name=\"google_analytics_key\"\\s*>).*(<)", "\$1" + replacement + "\$2")
new File(filePath).write(newFileContent)
} else {
println "!!!!!!!!!!!!!!!! File :" + filePath + " not fixed, because it doesn't exist !!!!!!!!!!!!!"
}
}
task changeResouceFile << {
String stringsPath = makePath("$rootProject.projectDir", "app", "src", "main", "res", "values") + "strings.xml"
fix_strings_file(stringsPath, resourceString)
}
preBuild.dependsOn changeResouceFile