valeriy katkov
Vamos a tener lo siguiente strings.xml
archivo de recursos:
<resources>
<!-- basic string -->
<string name="app_name">My Playground</string>
<!-- basic string with an argument -->
<string name="greeting">Hello %!</string>
<!-- plural string -->
<plurals name="likes">
<item quantity="one">%1d like</item>
<item quantity="other">%1d likes</item>
</plurals>
<!-- string array -->
<string-array name="planets">
<item>Earth</item>
<item>Mars</item>
</string-array>
</resources>
¿Cómo puedo usar estos recursos en Jetpack Compose?
valeriy katkov
hay androidx.compose.ui.res paquete que contiene funciones para cargar recursos de cadena, así como otros tipos de recursos.
cadena
Puedes obtener una cadena usando stringResource()
función, por ejemplo:
...
import androidx.compose.ui.res.stringResource
@Composable
fun StringResourceExample() {
Text(
// a string without arguments
text = stringResource(R.string.app_name)
)
Text(
// a string with arguments
text = stringResource(R.string.greeting, "World")
)
}
matriz de cadenas
Se puede obtener usando stringArrayResource()
función:
val planets = stringArrayResource(R.array.planets_array)
plural (cadena de cantidad)
A partir de componer 1.0.0-alpha10
no hay una función incorporada para obtener un recurso plural, pero puede obtener el contexto de Android a través de Contexto local y utilícelo de la misma manera que lo hace en una aplicación basada en vistas. Aún mejor si crea su propia función similar a otras funciones de recursos (como lanzador de chorro componer muestra hace por ejemplo):
// PluralResources.kt
package com.myapp.util
import androidx.annotation.PluralsRes
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
@Composable
fun quantityStringResource(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): String {
return LocalContext.current.resources.getQuantityString(id, quantity, *formatArgs)
}
para que puedas usarlo de la misma manera:
val likes = quantityStringResource(R.plurals.likes, 10, 10)
una nota sobre la recomposición
Como sabe, al componer, una función componible puede volver a ejecutarse hasta cientos de veces por segundo durante recomposición. Si la cadena que construye no es trivial y requiere algún cálculo, es mejor recordar el resultado del cálculo, por lo que no se volverá a ejecutar en cada recomposición. Por ejemplo:
...
import androidx.compose.runtime.remember
@Composable
fun BirthdayDateComposable(username: String, dateMillis: Long) {
// formatDate() function will be executed only if dateMillis value
// is changed, otherwise the remembered value will be used
val dateStr = remember(dateMillis) {
formatDate(dateMillis)
}
Text(
text = stringResource(R.string.birthday_date, dateStr)
)
}
-
Con respecto a la recomposición, ¿estás seguro
remember
sería necesario en este ejemplo? El documentación oficial sugiere que una función componible no se recompone si sus parámetros permanecen iguales: “Al omitir todas las funciones o lambdas que no tienen parámetros modificados, Compose puede recomponerse de manera eficiente”.– Jonik
15 de septiembre de 2021 a las 8:42
Esto ahora es compatible a partir de componer 1.2.0-alpha06
:
val likes = pluralStringResource(R.plurals.likes, 10, 10)
-
¿Puede compartir cómo definió cadena en plurals.xml?
– Wafi_ck
25 de abril de 2022 a las 12:34
-
@Wafi_ck Puse mis plurales en strings.xml, exactamente con la misma sintaxis que en la pregunta original.
– lt0
28 de abril de 2022 a las 0:25
-
Ahora se lanza en 1.2 🙂
– DamienL
28 de julio de 2022 a las 12:39
benjamin sinzore
Aquí hay un ejemplo:
Text(text = stringResource(id = R.string.myString)