2016-07-11 9 views
6

In Gradle für Android, Ich versuche, das Äquivalent dieser String-Array-Ressource ...Ist es möglich, eine Android String-Array-Ressource in Gradle zu definieren?

meine App
<resources> 
    <string-array name="url_array"> 
     <item>http://www.url1.com</item> 
     <item>http://www.url2.com</item> 
     <item>http://www.url3.com</item> 
    </string-array> 
</resources> 

... in build.gradle config-Datei zu erzeugen. Ich möchte diese Werte nicht in res/values ​​/ arrays.xml fest codieren, da ich verschiedene Array-Inhalte für verschiedene Build-Varianten (dev vs. prod) erzeugen möchte. Ich weiß, es gibt Workarounds, aber das wäre die sauberste Lösung, wenn es möglich ist.

Ich habe Dinge wie den Auszug unten mit einer ResValue Art von "String-Array" oder "Array" versucht, aber ich bekomme eine Fehlermeldung, dass resValue() nicht existiert. Natürlich funktioniert ein resValue-Typ-Parameter von "string" für einzelne Strings, aber ich muss eine String-Array-Ressource generieren.

resValue "string-array", "url_array", 
    ["http://www.url1.com", 
    "http://www.url2.com", 
    "http://www.url3.com"] 

Die Gradle für Android-Dokumentation hilft nicht. Es listet diese Methode ...

void resValue(String type, String name, String value)

... aber nicht die gültigen Werte für den Typ param anzuzeigen. Es hat einfach einen Link, der sagt "See Resource Types", aber das zeigt nur auf die regulären Android-Dokumente für Ressourcen-Typen und beschreibt nicht, wie sie in der Gradle Android DSL auszudrücken.

Hat jemand eine Anleitung? Ich habe überall online nachgeschaut und nichts gefunden.

Antwort

10

Hier ist der nächste, den ich bekam, mit Anleitung von @schwiz. Ich kann immer noch nicht einen Weg finden, diese mit resValue zu tun, aber es ist möglich, ein buildConfigField zu definieren, die das gleiche Ziel erreichen können:

buildConfigField "String[]", "URL_ARRAY", 
     "{" + 
       "\"http://www.url1.com\"," + 
       "\"http://www.url2.com\"," + 
       "\"http://www.url3.com\"" + 
       "}" 

, die Sie den Array zuzugreifen gibt, über BuildConfig:

public static final String[] URL_ARRAY = { 
    "http://www.url1.com", 
    "http://www.url2.com", 
    "http://www.url3.com"}; // whitespace added for clarity 

Sie können dann den buildConfigField-Wert pro BuildType überschreiben. Also, es sei denn, Sie brauchen dies speziell in R.array. *, Das wird Ihre Bedürfnisse erfüllen. Lassen Sie dies für den Moment offen, falls jemand anders weiß, wie dies mit resValue zu tun ist.

+0

Wenn Sie es speziell in R.array * Sie sind im Unterschied productFlalvor Ordner definieren.. –

0

Die andere Lösung wird funktionieren. aber ich fand, dass es nicht mit anderen Build-Config-Dateien wie BUCK

arbeiten Sie könnten auch nur eine lange statische URL-Zeichenfolge, die alle URLs enthält, aber durch Kommas getrennt sind (oder durch ein anderes Trennzeichen getrennt). während der Laufzeit liest man den Wert aus und teilt ihn durch das Komma auf.

0

Um Arrays über resValue erstellen zu können, sollten Sie alle Array-Elemente innerhalb des Tags item speichern. So sollten Sie in gradle so etwas schreiben:

resValue('array', 'ver_2_skus', "<item>sku1</item><item>sku2</item>") 

Aber es ist ein schrecklicher Fehler - alle < Symbole schreiben res als &lt;. Ich verbringe etwas Zeit, um zu finden, wie ich < mit Gradle schreiben kann, aber gescheitert. Also habe ich einen Hack gemacht - ich ersetze < durch einen String und dann, nach dem Build, ersetze ihn durch <. Ich hasse diesen Hack, vielleicht vermisse ich etwas, aber es funktioniert. Hier ist Code, den Sie am Ende des Gradle-Skripts setzen müssen (ja, Code muss dupliziert werden, um zu funktionieren).

  1. Während schafft eine res Array all < mit einigen Zeichenfolge ersetzen, das heißt IWANTTOREPLACEITWITHLEFTARROW:
resValue('array', 'ver_2_skus', "IWANTTOREPLACEITWITHLEFTARROWitem>sku1IWANTTOREPLACEITWITHLEFTARROW/item>IWANTTOREPLACEITWITHLEFTARROWitem>sku2IWANTTOREPLACEITWITHLEFTARROW/item>") 
  1. diese von gradle Datei am Ende hinzufügen:
android.applicationVariants.all { variant -> 
    println("variant: "+variant.dirName) 
    variant.mergeResources.doLast { 
     try { 
      println("3") 
      ext.env = System.getenv() 
      File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/values/values.xml") 
      String content = valuesFile.getText('UTF-8') 
      content = content.replaceAll(/IWANTTOREPLACEITWITHLEFTARROW/, '<') 
      valuesFile.write(content, 'UTF-8') 
     } catch (Exception e) { 
      println("Exception = " + e) 
     } 
    } 

    try { 
     println("try") 
     ext.env = System.getenv() 
     File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/values/values.xml") 
     String content = valuesFile.getText('UTF-8') 
     content = content.replaceAll(/IWANTTOREPLACEITWITHLEFTARROW/, '<') 
     valuesFile.write(content, 'UTF-8') 
    } catch (Exception e) { 
     println("Exception = " + e) 
    } 
} 
+0

Wie bekomme ich diesen Mehrwert im Java-Code? –

+0

@Kannan_SJD, 'context.getResources(). GetStringArray (R.array.ver_2_skus)' – mohax

0

definieren String [] von Urls in BuildConfig:

productFlavors { 
    prod { 
     ext.centralUrls = ["http://www.url1.com", "http://www.url2.com", "http://www.url3.com"] 
    } 
    ... 
} 

buildConfigField("String[]", "CENTRAL_URLS", '{' + variant.productFlavors.get(0).ext.centralUrls.collect {"\"${it}\""}.join(",") + '}')