XML资源的字符串引用

时间:2015-04-21 20:21:12

标签: android google-analytics

是否可以从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 的方法,因为我不想以编程方式设置分析配置。

2 个答案:

答案 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.xmlsrc/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