studio resource manejo crear como arreglo array android string string-formatting android-resources

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$ y 3$ . 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 tiene 12 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 usar context.getResources().getString(...) si no está disponible.
  • String.format() también formateará una cadena.
  • Los términos 1$ y 2$ no necesitan usarse en ese orden. Es decir, 2$ pueden 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.
  • 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. :)




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);