2015-04-21 2 views
2

Возможно ли сделать ссылку на строку из XML-ресурса?Ссылка на строку из 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> 

Я использую SDK Google Analytics v4, и моя основная цель - использовать другой ключ Google Analytics для debug и релиз без дублирования всего analytics.xml.

Я был бы признателен за любой подход, который работает с использованием analytics.xml, так как я не хочу программно настраивать конфигурацию аналитики.

ответ

2

В вашем приложении 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

+0

Как я могу сделать аналитику.xml ссылается на этот ресурс строки, созданный Gradle? SDK Google Analytics загружает конфигурацию дыр из этого XML следующим образом: analytics.newTracker (R.xml.analytics) – marcioggs

+0

С предлагаемым ответом вам необходимо создать свой трекер следующим образом: 'GoogleAnalytics.getInstance (this) .newTracker (BuildConfig. ANALYTICS_TRACKING_ID) ' – Gero

+1

Спасибо, Геро, но я ищу подход, который использует этот XML, поэтому я могу изолировать конфигурацию аналитики от кода. – marcioggs

1

Вы могли бы использовать что-то вроде этого

public static String getGoogleAnalyticsKey(Context context){ 
     return BuildConfig.DEBUG ? context.getString(R.string.analitcs_debug) : context.getString(R.string.analitics_store); 
    } 

Это решение не является самым Elegent, но я не мог сопротивляться, пытаясь, если это будет на самом деле Работа. Удивительно, что делает: 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 
+0

Спасибо за предложение, но я избегаю программной настройки Google Analytics. – marcioggs

+1

как насчет этой версии? : DDDD –

+0

Ничего себе! Здесь у нас есть Gradle/Groovy. Даже не думал, что смогу сделать что-то подобное. – marcioggs