android - resource - Cadena dinámica utilizando String.xml?
string-array android studio (9)
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.
Se les llama especificadores de formato. En la cadena xml están en la forma de
%[parameter_index$][format_type]
- % : El signo de porcentaje marca el comienzo del especificador de formato.
- índice de parámetros : Este es un número seguido de un signo de dólar. Si tuviera tres parámetros que quisiera insertar en la cadena, entonces se llamarían
1$
,2$
y3$
. No importa el orden en el que los coloque en la cadena de recursos, solo el orden en que proporcione los parámetros. tipo de formato : hay muchas formas de formatear las cosas ( consulte la documentación ). Éstos son algunos de los más comunes:
-
s
cadena -
d
decimal entero -
f
número de punto flotante
-
Ejemplo
Crearemos la siguiente cadena con formato donde las partes grises se insertan mediante programación.
Mi hermana
Mary
tiene12
años.
string.xml
<string name="my_xml_string">My sister %1$s is %2$d years old.</string>
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 usarcontext.getResources().getString(...)
si no está disponible. -
String.format()
también formateará una cadena. - Los términos
1$
y2$
no necesitan usarse en ese orden. Es decir,2$
pueden venir antes de1$
. Esto es útil cuando se internacionaliza una aplicación para idiomas que usan un orden de palabras diferente. - Puede usar un especificador de formato como
%1$s
varias veces en el xml si desea repetirlo. - Utilice
%%
para obtener el carácter%
real. - Para obtener más detalles, lea el siguiente tutorial útil: SDK de Android Consejo rápido: formato de cadenas de recursos
¿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 alguna cadena más
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 colocando 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. Puedes formatear la cadena con argumentos de tu 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 utiliza la cadena como una cadena de formato:
String text = res.getString(R.string.welcome_messages, username, mailCount);
Plurales
Si necesitas manejar los plurales, usa 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 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);
Vea String Resources: Plurals para más detalles.
Cuando desee utilizar un parámetro del archivo strings.xml real sin usar 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 todos los archivos de recursos, es decir, las variables deben copiarse en cada archivo XML que las necesite.
En Kotlin solo necesitas establecer el valor de tu cadena de esta manera:
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
Crea una vista de texto en tu diseño:
<TextView android:id="@+id/song_number_and_title"/>
Entonces 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.
Estaba buscando lo mismo y finalmente encontró la siguiente solución muy simple. Lo 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. Utilice la sustitución de cadena:
c.getString(R.string.welcome_messages,name,count);
donde c es el contexto, nombre 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. :)
Puedes usar MessageFormat
<string name="customer_address">Wellcome: {0} {1}</string>
En código Java:
String text =MessageFormat(R.string.customer_address).format("Name","Family");
API de nivel 1:
https://developer.android.com/reference/java/text/MessageFormat.html
Sin embargo, también debe leer la respuesta de Elias Mårtenson en el tratamiento de los plurales con Android de “cero” . Hay 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)
en res / values / string.xml
<resources>
<string name="app_name">Hello World</string>
<string name="my_application">Application name: %s, package name: %s</string>
</resources>
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);