Símbolo de porcentaje XML de Android

Tengo una serie de cadenas en las que se usa el símbolo % . El formato adecuado para usar el % es % . Cuando tengo una cadena en esa matriz con múltiples % 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  where  is expected 

La herramienta de empaquetado de activos de Android ( aapt ) se ha vuelto muy estricta en su último lanzamiento y ahora se usa para todas las versiones de Android. El error aapt que está obteniendo se genera porque ya no permite especificadores de formato no posicionales .

Aquí hay algunas ideas de cómo puede incluir el% -symbol en sus cadenas de recursos.

Si no necesita ningún formato de especificadores o sustituciones en su cadena, simplemente puede hacer uso del atributo formatted y establecerlo en false :

 %a + %a == 2%a 

En este caso, la cadena no se utiliza como una cadena de formato para el Formatter por lo que no tiene que escapar de sus símbolos-%. La cadena resultante es “% a +% a == 2% a”.

Si omite el atributo formatted="false" , la cadena se utiliza como una cadena de formato y debe escapar del% -symbols. Esto se hace correctamente con un doble%:

 %%a + %%a == 2%%a 

Ahora bien, aapt ofrece ningún error, pero dependiendo de cómo lo use, la cadena resultante puede ser “%% a + %% a == 2 %% a” si se invoca un Formatter sin ningún argumento de formato:

 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 código xml es difícil decir cuál es exactamente su problema, pero espero que esto le ayude a entender los mecanismos un poco mejor.

Para permitir que la aplicación utilice cadenas formateadas a partir de recursos, debe corregir su xml. Así por ejemplo

 Your App name, ver.%d 

debe ser reemplazado con

 Your App name, ver.%1$d 

Puedes ver esto para más detalles.

Puede escapar% usando %% para el analizador xml, pero se muestra dos veces en el dispositivo.

Para mostrarlo una vez, intente seguir el formato: \ %%

Por ejemplo

 Fat Burning (50\%% to 60\%%) 

se muestra como Quemagrasas (50% a 60%) en el dispositivo

Utilizar

%d%% wins

Llegar

80% wins como una cadena formateada.

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

En su archivo strings.xml, puede usar cualquier signo Unicode que desee.

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

 % 

Puede ver una lista completa de signos Unicode aquí

No es exactamente tu problema sino uno similar.

Si tiene más de un formato en su entrada de cadena, no debe usar “% s” varias veces.

NO HACER:

 Planned time %s - %s (%s) 

HACER:

 Planned time %1$s - %2$s (%3$s) 

Puede escapar del% en xml con %%, pero necesita establecer el texto en código, no en el diseño xml.

Este podría ser un caso en el que el IDE se vuelve demasiado estricto.

La idea es sólida, en general, debe especificar el orden de las variables de sustitución, por lo que si agrega recursos para otro idioma, no será necesario cambiar el código de Java. Sin embargo, hay dos problemas con esto:

En primer lugar, una cadena como:

 You will need %.5G %s 

para ser utilizado ya que necesitará 2.1200 mg tendrá el mismo orden en cualquier idioma ya que esa cantidad de masa siempre está representada científicamente en ese orden.

El segundo es que si coloca el orden de las variables en cualquier idioma en el que se especifiquen sus recursos predeterminados (por ejemplo, inglés), entonces solo necesita especificar las posiciones en las cadenas de recursos para los idiomas, use un orden diferente a su idioma predeterminado.

La buena noticia es que esto es fácil de arreglar. Aunque no es necesario especificar las posiciones, y el IDE es demasiado estricto, simplemente especifíquelas de todos modos. Para el ejemplo anterior use:

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

para escapar del símbolo de porcentaje, solo necesitas %%

por ejemplo :

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

devuelve “10%”

Prueba esta (derecha):

 Great application %s ☞ %s ☞ %s \\n\\nGo to download this application %s 

Un método complicado: usar un pequeño signo de porcentaje como se muestra a continuación

  Fat Burning (50﹪ to 60﹪) 

Signo de porcentaje en Wikipedia

Según la documentación oficial de Google, use% 1 $ s y% 2 $ s http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

Hola,% 1 $ s! Tienes% 2 $ d mensajes nuevos.

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

  ( %1$s %2$s OFF) 

En la clase java usa este código:

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

Intente usar una barra invertida delante de ella, como a continuación:

 \%