Tengo un array de cadenas de caracteres en el que el % símbolo se utiliza. Formato adecuado para el uso de la % es %. Cuando tengo una cadena en la matriz con múltiples % que me da este error.

 Multiple annotations found at this
 line:
 - error: Multiple substitutions specified in non-positional format;
   did you mean to add the formatted="false" attribute?
 - error: Found tag </item> where </string-array> is expected
  • Puedes publicar el XML que está causando este error? Puede ser muy difícil identificar un problema sin ver la causa del mismo.
  • este es un error que puede ser replicado fácilmente por cualquier cadena con 2 o más % símbolos.
  • Si no se busca formato propósito, mejor camino para llevar a cabo.
  • En mi caso, yo erróneamente entró en el formato param 1%$s, en lugar de %1$s.
InformationsquelleAutor zaid | 2010-12-11

14 Comentarios

  1. 447

    Android Asset Packaging Tool (aapt) se ha convertido en muy estricto en su versión más reciente y ahora se utiliza para todos versiones de Android. La aapt-error que estás recibiendo es generado porque ya no permite no-posicional de los especificadores de formato.

    Aquí están algunas ideas de cómo usted puede incluir la %-símbolo en sus cadenas de recursos.

    Si usted no necesita ningún especificadores de formato o sustituciones en su cadena, se puede simplemente hacer uso de la formatted atributo y configurarlo para que false:

    <string formatted="false">%a + %a == 2%a</string>

    En este caso, la cadena no se utiliza como una cadena de formato para la Formateador así que usted no tiene que salir de su %-símbolos. La cadena resultante es «%a + %a == 2%».

    Si se omite el formatted="false" atributo, la cadena se utiliza como una cadena de formato y tienes que escapar de la %-símbolos. Esto se hace correctamente con doble-%:

    <string>%%a + %%a == 2%%a</string>

    Ahora aapt le da ningún error, pero dependiendo de cómo usted lo utiliza, la cadena resultante puede ser «%%a + %%a == 2%%a» si una Formateador se invoca sin ningún tipo de formato argumentos:

    Resources res = context.getResources();
    
    String s1 = res.getString(R.string.str);
    //s1 == "%%a + %%a == 2%%a"
    
    String s2 = res.getString(R.string.str, null);
    //s2 == "%a + %a == 2%a"

    Sin ningún tipo de xml y el código es difícil decir qué es exactamente tu problema pero espero que esto le ayuda a entender los mecanismos un poco mejor.

    • he seleccionado esta la respuesta de porque se debe trabajar, pero al parecer hay un bug que estoy corriendo con esa cadena, así que he decidido usar %% y «XXX.replaceAll(«%%», «%»);»
    • el uso de formato=false funciona bien. Esto es como lo he usado: <string nombre=»information_description» formatted=»false»>\’Sweet\’ 10% a 20% hasta 35% de su peso en azúcar</string>
    • con formato=false funciona muy bien para mí también. El uso de %%, que, literalmente, se mostraba como %% de mi dispositivo y el emulador..
    • con formato=false trabajado bien para mí en el pasado. ahora (ADT 22) , por alguna razón no lo hace. y si yo uso : «str=mContext.getString(R. string.str,»hola») » , que tendrá este pelusa advertencia: «cadena de Formato» str » no es un formato válido de cadena por lo que no debe ser pasado a la Cadena.formato»
    • %% funciona muy bien para mí en Android 4.3
    • formato de falso no elimina el error para mí :/
    • Olvídalo, yo sólo tenía que limpiar el proyecto
    • Si no para dar formato a propósito, este respuesta proporciona la mejor manera de hacer mostrar cualquier número de % de símbolos en la vista de la utilización de XML y recursos de cadena.
    • Lo que si quiero formatear mi cadena?
    • Usted siempre debe usar formatted="false" cuando se utiliza String.format.
    • Si usted está accediendo desde <string-array/>, a continuación, para la impresión de porcentaje de uso \u0025. Esto funcionó para mí.
    • Como por la respuesta de Pablo E, en el SDK de 22 tuve que agregar el de dólares símbolo para aplicar un formato de: %1$s and %2$d

  2. 153

    Para permitir la aplicación a través de cadenas con formato de recursos que debe corregir su xml. Así, por ejemplo

    <string name="app_name">Your App name, ver.%d</string>

    debe ser reemplazado con

    <string name="app_name">Your App name, ver.%1$d</string>

    Se puede ver este para más detalles.

    • Gracias, siempre el eslabón perdido, literalmente.
    • Para varios parámetros de sustitución (por ejemplo, con las cuerdas), el uso de %1$s, %2$s etc.
    • ¿quién va a leer una gran respuesta para esta pequeña cosa? Gracias, me desplácese hacia abajo para encontrar.
  3. 57

    Puede escapar de la % con %% para el analizador XML, pero se muestra dos veces en el dispositivo.

    Para mostrar una vez, pruebe lo siguiente formato: \%%

    Por Ejemplo

    <string name="zone_50">Fat Burning (50\%% to 60\%%)</string> 

    se muestra como
    Fat Burning (50% to 60%) en el dispositivo

    • \%% causas de los accidentes en el Nexus 4 4.2.1. No he probado otros.
    • Esto funciona bien y es fácil cuando ya sabes el por ciento que desea incluir en sus cuerdas, y no por medio de la cadena de formateador y siempre tener que establecer los valores codificados mediante programación.
    • Este se estrelló por mí en el Nexus 5.1.1. @ViliusK respuesta es la correcta.
    • sólo usar %% en lugar de %
  4. 33

    Uso

    <string name="win_percentage">%d%% wins</string>

    para obtener

    80% wins como una cadena con formato.

    Estoy usando String.format() método para obtener el número insertado en lugar de %d.

  5. 10

    En su strings.xml archivo que se puede utilizar cualquier Unicode señal de que te quiere.

    Por ejemplo, el número de Unicode para el signo de porcentaje es 0025:

    <string name="percent_sign">&#x0025;</string>

    Usted puede ver una lista completa de Unicode signos aquí

    • Que no tiene ningún sentido. &#x0025; y % son idénticas en un archivo xml.
    • El archivo de recursos se convierte en una Java de recursos, y al hacerlo, el % carácter devuelve. Me temo que esto no resuelve el problema.
    • stackoverflow.com/a/3061297/1787135
    • Mejor camino para llevar a cabo.
  6. 10

    escapar el símbolo de porcentaje, sólo se necesita %%

    por ejemplo :

    String.format("%1$d%%", 10)

    devuelve «10%»

    • Su respuesta es prácticamente el mismo como varias otras de las respuestas
    • … y el mal, porque devuelve 10% no %10. FIY: Cuando se utiliza String.format debe siempre especificar la configuración Regional. Puede ser muy sorprendido cuando usted no pone la configuración Regional y el uso de árabe de la configuración regional de formato de números de…
    • gracias @mtrakal para la configuración regional de asesoramiento~
  7. 7

    No es exactamente tu problema, sino uno similar.

    Si usted tiene más de un formato de entrada de cadena de caracteres, no debe utilizar «%s» varias veces.

    NO :

    <string name="entry">Planned time %s - %s (%s)</string>

    HACER :

    <string name="entry">Planned time %1$s - %2$s (%3$s)</string>
  8. 5

    Puede escapar de la % en xml con %%, pero es necesario establecer el texto en el código, no en el layout xml.

    • Sí lo hace el escape con doble %, y compilar muy bien. Pero cuando se ejecuta en el emulador, o incluso dispositivos, se podría mostrar como %%.
  9. 5

    Este podría ser un caso de la IDE de llegar a ser demasiado estricto.

    La idea es que el sonido, en general, usted debe especificar el orden de sustitución de variables por lo que se debe agregar recursos para otro idioma, el código java no necesita ser cambiado. Sin embargo, hay dos problemas con esto:

    En primer lugar, una cadena, tales como:

    You will need %.5G %s

    para ser utilizado como tendrá 2.1200 mg tendrá el fin de la misma en ningún idioma, ya que la cantidad de masa es representado siempre en ese orden científicamente.

    La segunda es que si pones el orden de las variables en lo que nunca idioma predeterminado de recursos especificado en (por ejemplo, el inglés), a continuación, sólo es necesario especificar las posiciones en las cadenas de recursos para las lenguas, el uso de un orden diferente a su idioma por defecto.

    La buena noticia es que esto es sencillo de solucionar. Aunque no es necesario especificar las posiciones, y el IDE es ser demasiado estricto, sólo tiene que especificar ellos de todos modos. Para el ejemplo anterior uso:

    Necesitará %1$.5 G %2$s

  10. 3

    Probar este (a la derecha):

    <string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \n\nGo to download this application %s</string>
  11. -1

    Supongamos que desea mostrar (50%) e introduzca 50 en tiempo de ejecución. Aquí está el código:

    <string name="format_discount"> (
    <xliff:g id="discount">%1$s</xliff:g>
    <xliff:g id="percentage_sign">%2$s</xliff:g>
     OFF)</string>

    En la clase de java a utilizar este código:

    String formattedString=String.format(context.getString(R.string.format_discount),discountString,"%");
    holder1.mTextViewDiscount.setText(formattedString);
  12. -16

    Trate de usar una barra invertida delante de él, como a continuación:

    \%
    • Mismo error que antes.
    • esto debería ser \%%
    • Esta solución conduce a estrellarse .

Dejar respuesta

Please enter your comment!
Please enter your name here