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:
- Android convertir Cadena a byte - tomar byte en las piezas
- StringBuilder perdió datos al convertir a String
- String-arrays de referencia en android strings.xml
- Android: ¿dividido en un salto de línea en String? (Párrafos)
- Reemplazar el dígito inglés con el dígito persa en Cadena, excepto las URL
Alguna cadena PLACEHOLDER1 un poco más de cadena
- Cómo getResources (). GetString () funciona android
- Byte array -> String -> Conjunto de bytes
- Comprobando si existe subobjeto en JSON
- Cómo agregar recursos de cadena en Eclipse?
- ¿Por qué la marquesina no funciona en Widget?
- Calendario de Android Java getDisplayName / s devolver null
- Cómo formatear una cadena para un android de textview
- ¿Cómo comprobar el idioma de un dispositivo en android?
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 enString.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 yHello
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)
- No se puede crear dispositivo virtual Android
- ¿Los fragmentos realmente necesitan un constructor vacío?