java - recursos - strings.xml android studio
¿Es posible definir un recurso de matriz de Android en Gradle? (4)
La otra solución funcionará. pero descubrí que no funcionará con otros archivos de configuración de compilación como BUCK
también podría tener una larga cadena URL estática que contenga todas las URL pero separadas por comas (o separadas por algún otro delimitador). luego durante el tiempo de ejecución, leíste el valor, divídelo por comas.
En Gradle para Android, estoy intentando generar el equivalente de este recurso de matriz de cadena ...
<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>
... en el archivo de configuración build.gradle de mi aplicación. No quiero codificar estos valores en res / values / arrays.xml, ya que deseo poder generar diferentes contenidos de matriz para diferentes variantes de compilación (dev vs. prod). Sé que hay soluciones, pero esta sería la solución más limpia si es posible.
He intentado cosas como el siguiente fragmento con un tipo resValue de "string-array" o "array", pero aparece un error que dice que resValue () no existe. Por supuesto, un parámetro de tipo resValue de "cadena" funciona para cadenas simples, pero necesito generar un recurso de matriz de cadena.
resValue "string-array", "url_array",
["http://www.url1.com",
"http://www.url2.com",
"http://www.url3.com"]
La documentación de Gradle para Android no ayuda. Enumera este método ...
void resValue (Tipo de cadena, nombre de cadena, valor de cadena)
... pero no indica los valores válidos para el tipo param. Simplemente tiene un enlace que dice " Ver tipos de recursos ", pero que solo apunta a los documentos de Android normales para tipos de recursos y no describe cómo expresarlos en Gradle Android DSL.
¿Alguien tiene alguna guía? He buscado en línea y no he encontrado nada.
Para poder crear una matriz a través de resValue
, debe almacenar todos los elementos de la matriz dentro de la etiqueta del item
. Entonces deberías escribir en gradle algo como esto:
resValue(''array'', ''ver_2_skus'', "<item>sku1</item><item>sku2</item>")
Pero hay un error terrible: todos los <
símbolos escriben en res como <
. Dedico algo de tiempo a encontrar cómo puedo escribir <
con gradle, pero fallado. Así que hice un hack - Reemplace <
con una cadena y luego, después de la compilación, la reemplacé por <
. Odio este truco, tal vez extraño algo, pero funciona. Aquí hay un código que debes poner al final del script de Gradle (sí, el código debe estar duplicado para funcionar).
- Mientras crea una matriz de res, reemplace todo
<
con una cadena, es decir,IWANTTOREPLACEITWITHLEFTARROW
:
resValue(''array'', ''ver_2_skus'', "IWANTTOREPLACEITWITHLEFTARROWitem>sku1IWANTTOREPLACEITWITHLEFTARROW/item>IWANTTOREPLACEITWITHLEFTARROWitem>sku2IWANTTOREPLACEITWITHLEFTARROW/item>")
- Agregue esto al final del archivo gradle:
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)
}
}
Aquí está lo más cercano que tengo, con la orientación de @schwiz . Todavía no puedo encontrar una manera de hacerlo con resValue, pero es posible definir un buildConfigField que pueda lograr el mismo objetivo:
buildConfigField "String[]", "URL_ARRAY",
"{" +
"/"http://www.url1.com/"," +
"/"http://www.url2.com/"," +
"/"http://www.url3.com/"" +
"}"
Eso le da acceso a la matriz, a través de BuildConfig:
public static final String[] URL_ARRAY = {
"http://www.url1.com",
"http://www.url2.com",
"http://www.url3.com"}; // whitespace added for clarity
A continuación, puede anular el valor buildConfigField por buildType. Por lo tanto, a menos que específicamente necesite que esté en R.array. *, Esto satisfará sus necesidades. Dejando esto abierto por ahora en caso de que alguien más sepa cómo hacerlo con resValue.
Definición de String [] de Urls en 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(",") + ''}'')