cadena dinámica usando cadena.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 MARCADOR DE POSICIÓN1 alguna cadena más

Author: Rahul Tiwari, 2010-09-07

9 answers

Formato y estilo

Sí, vea lo siguiente de String Resources: Formatting and Styling

Si necesita formatear sus cadenas usando String.format(String, Object...), puede hacerlo poniendo sus argumentos de formato en el recurso string. 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 como esta:

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 mailCount param se usa para decidir qué formato usar (simple o plural), los otros params 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.

 794
Author: Megha Joshi - GoogleTV DevRel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-18 03:46:04

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.

Se llaman 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 por un signo de dólar. Si tuvieras tres parámetros que quisieras insertar en el cadena, entonces se llamarían 1$, 2$, y 3$. El orden en el que los coloque en la cadena de recursos no importa, solo el orden en el que proporcione los parámetros.
  • Tipo de formato : Hay un lote de formas en que puede formatear las cosas ( ver la documentación). Aquí están algunos comunes:

    • s string
    • d entero decimal
    • f coma flotante número

Ejemplo

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

Mi hermana Mary tiene 12 años.

cuerda.xml

<string name="my_xml_string">My sister %1$s is %2$d years old.</string>

Mi actividad.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á a Cadena.
  • Los términos 1$ y 2$ no necesitan ser usados 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 especificador de formato como %1$s varias veces en el xml si desea repetirlo.
  • Use %% para obtener el carácter % real.
  • Para obtener más detalles, lea el siguiente tutorial útil: Android SDK Consejo rápido: Formateo Cadenas de recursos
 167
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-11 04:30:33

Cuando desea utilizar un parámetro de las cadenas reales.archivo 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 fuente, es decir, las variables deben copiarse en cada archivo XML que las necesite.

 107
Author: WhereDatApp.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-22 15:58:05

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

<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. usar sustitución de cadenas:

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

Donde c es el Contexto, name es una variable de cadena y count su variable int

Tendrás que incluir

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

En tus cadenas res/.XML. Funciona para mí. :)

 15
Author: user3016503,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-05 13:16:46

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

 2
Author: JJD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:45

Versión Kotlin de la respuesta aceptada...

val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
 0
Author: jesses.co.tt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-21 06:03:37

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 nivel 1:

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

 0
Author: Ahmad Aghazadeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-02 18:16:19

En Kotlin solo necesita establecer el valor de su cadena de la siguiente 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"/>

Luego haga esto en su código si usa 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.

 0
Author: msbodw001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-10 19:17:58

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);
 0
Author: Chanh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-17 08:12:37