¿Es posible tener marcadores de posición en valores de cadena en los string.xml
que se puedan asignar valores en tiempo de ejecución?
Ejemplo:
algo de cuerda PLACEHOLDER1 algo más de cuerda
android
string
string-formatting
android-resources
SoftReference
fuente
fuente
Respuestas:
Formateo y estilo
Sí, consulte lo siguiente en Recursos de cadena: formato y estilo
Uso básico
Tenga en cuenta que
getString
tiene una sobrecarga que usa la cadena como una cadena de formato:Plurales
Si necesita manejar plurales, use esto:
El primer
mailCount
parámetro se usa para decidir qué formato usar (simple o plural), los otros parámetros son sus sustituciones:Ver Recursos de cadena: Plurales para más detalles.
fuente
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 forma de
1$
,2$
y3$
. No importa el orden en que los coloque en la cadena de recursos, solo el orden en que proporciona los parámetros.tipo de formato : hay muchas formas de formatear las cosas ( consulte la documentación ). Aquí hay algunos comunes:
s
cuerdad
entero decimalf
número de coma flotanteEjemplo
Crearemos la siguiente cadena formateada donde las partes grises se insertan mediante programación.
string.xml
MyActivity.java
Notas
getString
porque estaba en una Actividad. Puedes usarcontext.getResources().getString(...)
si no está disponible.String.format()
también formateará una cadena.1$
y2$
términos no necesita ser utilizado en ese orden. Es decir,2$
puede venir antes1$
. Esto es útil al internacionalizar una aplicación para idiomas que usan un orden de palabras diferente.%1$s
varias veces en el xml si desea repetirlo.%%
para obtener el%
personaje real .fuente
Cuando desee utilizar un parámetro del archivo strings.xml real sin utilizar ningún código Java:
Esto no funciona en todos los archivos de recursos, es decir, las variables deben copiarse en cada archivo XML que las necesite.
fuente
<!DOCTYPE... ]>
parte en un archivo separado e incluirlo en múltiples archivos de recursos? ¿Algún truco para lograr esto?Estaba buscando lo mismo y finalmente encontré la siguiente solución muy simple. Lo mejor: funciona fuera de la caja.
1. altere su recurso de cadena:
2. usar sustitución de cadena:
c.getString(R.string.welcome_messages,name,count);
donde c es el contexto, el nombre es una variable de cadena y cuenta su variable int
Tendrás que incluir
en su res / strings.xml. Funciona para mi. :)
fuente
xliff
etiquetas alrededor de los especificadores de formato? ¿Qué valor adicional agregan en lugar de usar solo los especificadores%s
y%d
?En Kotlin solo necesita establecer su valor de cadena de esta manera:
Cree una vista de texto en su diseño:
Luego haga esto en su código si está usando Anko:
Es posible que necesite obtener sus recursos del contexto de la aplicación.
fuente
Sin embargo, también debe leer la respuesta de Elias Mårtenson sobre el tratamiento plural de Android de "cero" . Hay un problema con la interpretación de ciertos valores como "cero".
fuente
en res / values / string.xml
en código java
fuente
Puedes usar
MessageFormat
:En código Java:
Nivel API 1:
https://developer.android.com/reference/java/text/MessageFormat.html
fuente
Si desea escribir porcentaje (%), duplíquelo:
Si se escribe simplemente
%1$d%
, obtendrá el error:Format string 'percent' is not a valid format string so it should not be passed to String.format
.fuente
¡Si! puede hacerlo sin escribir ningún código Java / Kotlin, solo XML utilizando esta pequeña biblioteca que creé, que lo hace en el momento de la compilación, para que su aplicación no se vea afectada por ella: https://github.com/LikeTheSalad/android -cadena-referencia
Uso
Sus cuerdas:
La cadena generada después de construir:
fuente
Una solución directa de Kotlin al problema:
strings.xml
kotlinActivityORFragmentFile.kt:
fuente
En su archivo de cadena use esto
Y en su código use como corresponda
fuente
Versión de Kotlin de la respuesta aceptada ...
fuente
resources.getString(int, ... args)
método con argumentos en lugar deString.format
. Tampoco hay detalles específicos de kotlin en este código, aparte de laval
palabra clave. Ver respuesta de msbodw001