Me gustaría hacer referencia a una cadena de otra cadena en mi archivo strings.xml, como a continuación (tenga en cuenta específicamente el final del contenido de la cadena "message_text"):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="button_text">Add item</string>
<string name="message_text">You don't have any items yet! Add one by pressing the \'@string/button_text\' button.</string>
</resources>
He intentado la sintaxis anterior pero luego el texto imprime "@ string / button_text" como texto claro. No es lo que quiero. Me gustaría que el texto del mensaje imprima "¡Aún no tiene ningún artículo! Agregue uno presionando el botón 'Agregar artículo'".
¿Hay alguna forma conocida de lograr lo que quiero?
JUSTIFICACIÓN:
Mi aplicación tiene una lista de elementos, pero cuando esa lista está vacía, en su lugar, muestro un TextView "@android: id / empty". El texto en ese TextView es para informar al usuario cómo agregar un nuevo elemento. Me gustaría hacer que mi diseño sea infalible a los cambios (sí, soy el tonto en cuestión :-)
Respuestas:
Una buena manera de insertar una cadena de uso frecuente (por ejemplo, nombre de la aplicación) en xml sin usar el código Java: fuente
ACTUALIZAR:
Incluso puede definir su entidad globalmente, por ejemplo:
res / raw / entidades.ent:
res / values / string.xml:
fuente
Es posible hacer referencia una dentro de otra siempre que su cadena completa consista en el nombre de referencia. Por ejemplo, esto funcionará:
Es aún más útil para establecer valores predeterminados:
Ahora puede usar
string_default
cualquier parte de su código y puede cambiar fácilmente el valor predeterminado en cualquier momento.fuente
Creo que no puedes Pero puede "formatear" una cadena como desee:
En el codigo:
fuente
String text = res.getString(R.string.message_text, res.getString(R.string.button_text));
Está un poco más limpio.En Android no puedes concatenar cadenas dentro de xml
Lo siguiente no es compatible
Consulte este enlace a continuación para saber cómo lograrlo
¿Cómo concatenar múltiples cadenas en Android XML?
fuente
Creé un complemento de gradle simple que le permite referir una cadena de otra. Puede hacer referencia a cadenas definidas en otro archivo, por ejemplo, en una variante de compilación o biblioteca diferente. Contras de este enfoque: el refactor IDE no encontrará tales referencias.
Use la
{{string_name}}
sintaxis para referir una cadena:Para integrar el complemento, simplemente agregue el siguiente código en su aplicación o
build.gradle
archivo de nivel de módulo de bibliotecaACTUALIZACIÓN: La biblioteca no funciona con el complemento de Android Gradle versión 3.0 y superior porque la nueva versión del complemento utiliza aapt2 que empaqueta recursos en formato binario .flat, por lo que los recursos empaquetados no están disponibles para la biblioteca. Como solución temporal, puede deshabilitar aapt2 configurando android.enableAapt2 = false en su archivo gradle.properties.
fuente
> Could not get unknown property 'referencedString'
Puede usar su propia lógica, que resuelve las cadenas anidadas de forma recursiva.
De un
Activity
, por ejemplo, llámalo asífuente
Soy consciente de que esta es una publicación anterior, pero quería compartir la solución rápida y sucia que se me ocurrió para un proyecto mío. Solo funciona para TextViews, pero también podría adaptarse a otros widgets. Tenga en cuenta que requiere que el enlace esté entre corchetes (por ejemplo
[@string/foo]
).La desventaja de este enfoque es que
setText()
convierteCharSequence
a aString
, lo cual es un problema si pasa cosas como aSpannableString
; para mi proyecto, esto no fue un problema, ya que solo lo usé para elTextViews
que no necesitaba acceder desde miActivity
.fuente
Con el nuevo enlace de datos puede concatenar y hacer mucho más en su xml.
por ejemplo, si tienes mensaje1 y mensaje2 puedes:
incluso puede importar algunas utilidades de texto y llamar a String.format y amigos.
desafortunadamente, si desea reutilizarlo en varios lugares, puede desordenarse, no desea que este código se encuentre en todas partes. y no puedes definirlos en xml en un solo lugar (no lo sé) para que puedas crear una clase que encapsule esas composiciones:
entonces puede usarlo en su lugar (deberá importar la clase con enlace de datos)
fuente
Además de la respuesta anterior de Francesco Laurita https://stackoverflow.com/a/39870268/9400836
Parece que hay un error de compilación "& entity; fue referenciado, pero no declarado", que puede resolverse haciendo referencia a la declaración externa como esta
res / raw / entidades.ent
res / values / strings.xml
Aunque se compila y ejecuta, tiene un valor vacío. Quizás alguien sepa cómo resolver esto. Hubiera publicado un comentario, pero la reputación mínima es de 50.
fuente
Puede usar marcadores de posición de cadena (% s) y reemplazarlos con java en tiempo de ejecución
y en java
y luego establecerlo en el lugar donde usa la cadena
fuente
%1$s
,%2$s
etc. en lugar de%s
.He creado una pequeña biblioteca que le permite resolver estos marcadores de posición en el momento de la compilación, por lo que no tendrá que agregar ningún código Java / Kotlin para lograr lo que desea.
Según su ejemplo, tendría que configurar sus cadenas de esta manera:
Y luego el complemento se encargará de generar lo siguiente:
Funciona también para cadenas localizadas y de sabor, también las cadenas generadas se mantendrán actualizadas cada vez que realice cambios en sus plantillas o sus valores.
Más información aquí: https://github.com/LikeTheSalad/android-string-reference
fuente