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 algo más de cuerda

Formateo y estilo

Sí, consulte lo siguiente en Recursos de cadena: Formateo y estilo

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

 Hello, %1$s! You have %2$d new messages. 

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 esta 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 usa la cadena como una cadena de formato:

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

Plurales

Si necesita manejar plurales, use esto:

  Hello, %1$s! You have a new message. Hello, %1$s! You have %2$d new messages.  

El primer mailCount se usa para decidir qué formato usar (único o plural), los otros parámetros son sus sustituciones:

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

Ver Recursos de cadena: Plurales para más detalles.

Respuesta suplementaria

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

Los marcadores de reemplazo de formato de cadena en xml están en forma de

 %[parameter index]$[format type] 
  • índice de parámetro : si tenía tres partes de la cadena que desea reemplazar, entonces se llamarían %1 , %2 y %3 . No importa el orden en que los coloque en la cadena de recursos, solo el orden en que proporciona los parámetros en String.format .
  • tipo de formato : hay muchas maneras de formatear cosas ( ver la documentación ). Estos son algunos de los más comunes:

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

Ejemplo

Crearemos la siguiente cadena formateada donde las partes grises se insertan programáticamente.

Mi hermana Mary tiene 12 años.

string.xml

 My sister %1$s is %2$d years old. 

MyActivity.java

 String myString = "Mary"; int myInt = 12; String formatted = getString(R.string.my_xml_string, myString, myInt); 

Notas

  • Podría usar getString porque estaba en una actividad. Puede usar context.getResources().getString(...) si no está disponible.
  • String.format() también formateará una Cadena.
  • Los términos %1 y %2 no necesitan ser utilizados en ese orden. Es decir, %2 puede venir antes de %1 . Esto es útil cuando se internacionaliza una aplicación para idiomas que usan un orden de palabras diferente.
  • Puede usar un término como %1$s varias veces en el xml si desea repetirlo.
  • Use %% para obtener el % caracteres real.
  • Para obtener más información, lea el siguiente tutorial útil: Consejo rápido de Android SDK: Formateo de cadenas de recursos

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

    ]>  &appname; The &appname; app was created by &author;  

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

Estaba buscando lo mismo y finalmente encontré la siguiente solución muy simple. Lo mejor: funciona de la caja.
1. altera tu fuente de cadena:

 Hello, %s! You have %d new messages. 

2. use la sustitución de cadena:

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

donde c es el contexto, el nombre es una variable de cadena y cuenta tu variable int

Deberás incluir

  

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

Sin embargo, también debes leer la respuesta de Elias Mårtenson sobre el tratamiento de los plurals de Android de “cero” . Existe un problema con la interpretación de ciertos valores, como “cero”.

Versión de Kotlin de la respuesta aceptada …

 val res = resources val text = String.format(res.getString(R.string.welcome_messages), username, mailCount) 

Puedes usar MessageFormat

 Wellcome: {0} {1} 

En código Java:

 String text =MessageFormat(R.string.customer_address).format("Name","Family"); 

Nivel de API 1:

https://developer.android.com/reference/java/text/MessageFormat.html

En Kotlin solo necesitas establecer el valor de tu cadena así:

 "%1$d ~ %2$s" 

Crea una vista de texto en tu diseño:

  

Luego haz esto en tu código si usas Anko:

 val song = database.use { // get your song from the database } song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title)) 

Es posible que necesite obtener sus recursos del contexto de la aplicación.

en res / values ​​/ string.xml

  Hello World Application name: %s, package name: %s  

en código java

 String[] args = new String[2]; args[0] = context.getString(R.string.app_name); args[1] = context.getPackageName(); String textMessage = context.getString(R.string.my_application,(Object[]) args);