Cadena dinámica utilizando String.xml?

¿Es posible tener marcadores de posición en valores de cadena en string.xml que se pueden asignar valores en tiempo de ejecución?

Ejemplo:

Alguna cadena PLACEHOLDER1 un poco más de cadena

Formato y estilo

Sí, vea lo siguiente en Recursos de cadenas: Formato y estilo

Si necesita formatear sus cadenas utilizando String.format(String, Object...) , puede hacerlo poniendo sus argumentos de formato en el recurso de cadena. Por ejemplo, con el siguiente recurso:

 <string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string> 

En este ejemplo, la cadena de formato tiene dos argumentos:% 1 $ s es una cadena y% 2 $ d es un número decimal. Puede formatear la cadena con argumentos de su aplicación de la siguiente manera:

 Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount); 

Uso básico

Tenga en cuenta que getString tiene una sobrecarga que utiliza la cadena como una cadena de formato:

 String text = res.getString(R.string.welcome_messages, username, mailCount); 

Plurales

Si necesita manejar plurales, use esto:

 <plurals name="welcome_messages"> <item quantity="one">Hello, %1$s! You have a new message.</item> <item quantity="other">Hello, %1$s! You have %2$d new messages.</item> </plurals> 

El primer parámetro mailCount se utiliza para decidir qué formato utilizar (único o plural), los demás parámetros son sus sustituciones:

 Resources res = getResources(); String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount); 

Consulte Recursos de cadenas: Plurales para obtener más detalles.

Cuando desee utilizar un parámetro del archivo real strings.xml sin utilizar ningún código Java:

 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE resources [ <!ENTITY appname "WhereDat"> <!ENTITY author "Oded"> ]> <resources> <string name="app_name">&appname;</string> <string name="description">The &appname; app was created by &author;</string> </resources> 

Esto no funciona en los archivos de recursos, es decir, las variables deben copiarse en cada archivo XML que las necesite.

Respuesta Suplementaria

Cuando vi por primera vez %1$s y %2$d en la respuesta aceptada, no tenía sentido. Aquí hay un poco más de explicación.

Los marcadores de sustitución de formato de cadena en xml están en forma de

 %[parameter index]$[format type] 
  • Índice de parámetros : Si tenía tres partes de la cadena que quería reemplazar, se llamaría %1 , %2 y %3 . El orden en el que se colocan en la cadena de recursos no importa, sólo el orden en que se proporcionan los parámetros en String.format .
  • Tipo de formato : Hay muchas maneras en las que puede formatear cosas ( consulte la documentación ). Éstos son algunos de los más comunes:

    • Cadena
    • $d entero decimal
    • $f número de coma flotante

Personajes de escape

  • Utilice %% para obtener el carácter % real.

Para más detalles lea el siguiente tutorial útil.

  • Android SDK Sugerencia rápida: Formato de cadenas de recursos

Ejemplo

Gol

Cree la siguiente cadena formateada donde las partes grises se pueden reemplazar mediante programación.

  • 12 es un int y Hello es una cadena.

Solución

MyActivity.java

 int myInt = 12; String myString = "Hello"; String myFormattedString = String.format(getString(R.string.my_xml_resource_string), myInt, myString); 

String.xml

 <string name="my_xml_resource_string">%1$d is an int and %2$s is a String.</string> 

Estaba buscando lo mismo y finalmente encontró la siguiente solución muy simple. Mejor: funciona fuera de la caja.
1. Alterar su cadena de recursos:

 <string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have <xliff:g name="count">%d</xliff:g> new messages.</string> 

2. Utilizar sustitución de cadenas:

c.getString(R.string.welcome_messages,name,count);

Donde c es el Contexto, name es una variable de cadena y cuenta tu variable int

Tendrá que incluir

 <resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> 

En su res / strings.xml. Funciona para mi. 🙂

Sin embargo, también debe leer la respuesta de Elias Mårtenson en el tratamiento de los plurales de Android de "cero" . Hay un problema con la interpretación de ciertos valores como "cero".

Kotlin versión de la respuesta aceptada …

 val res = resources val text = String.format(res.getString(R.string.welcome_messages), username, mailCount) 
  • Android: evita romper la línea en las partes TextView String
  • Alternativa de DatatypeConverter.printHexBinary (byte array) y DatatypeConverter.parseHexBinary (String str) en Android
  • Conversión de TextView a String (tipo de) Android
  • Marcador de posición de la cadena de Android diferentes idiomas
  • Ellipsize sólo una sección en un TextView
  • Android (cambio de cadena en código java)
  • Cuerdas Android dependientes del tema
  • Android - agregando una cadena sobre una imagen Drawable?
  • Enviar una cadena en Android con HttpPost sin usar nameValuePairs
  • Android, ¿Cómo puedo convertir la cadena a la fecha?
  • Android Preferences error, "String no se puede convertir en int"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.