Pregunta

I tiene una matriz de cadenas en las que se utiliza el símbolo %. formato adecuado para el uso de la % se %. 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 </item> where </string-array> is expected
¿Fue útil?

Solución

El Activo Android Packaging Tool (aapt) se ha convertido en muy estricto en su última versión y ahora se utiliza para todos las versiones de Android. Se genera el aapt-error que se produce debido a que ya no permite especificadores de formato no posicionales .

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

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

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

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 se omite el atributo formatted="false", la cadena se usa como una cadena de formato y tienes que escapar de los símbolos-%. Esto se realiza correctamente con doble -%:

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

Ahora aapt le da ningún error, pero dependiendo de cómo se use, la cadena resultante puede ser "%% %% a + a == 2 %% un" si a Formatter 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 código XML y es difícil decir cuál es exactamente su problema es pero espero que esto le ayuda a comprender los mecanismos un poco mejor.

Otros consejos

Para permitir que la aplicación el uso de cadenas con formato de recursos que debe corregir el código XML. Así, por ejemplo

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

debe sustituirse por

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

Se puede ver este para más detalles.

Se puede escapar% utilizando %% por parser XML, pero se muestra dos veces en el dispositivo.

Para mostrar una vez, trate siguiente formato: \%%

Por ejemplo

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

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

Uso

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

obtener

80% wins como una cadena con formato.

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

En el archivo strings.xml se puede utilizar cualquier Unicode que desea firmar.

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

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

Se puede ver una lista completa de los signos Unicode aquí

para escapar el símbolo de porcentaje, sólo tiene %%

por ejemplo:

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

devuelve "10%"

No es exactamente su problema, pero una similar.

Si usted tiene más de un formato en su entrada de cadena, no se debe utilizar "% s" varias veces.

NO:

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

DO:

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

Se puede escapar del% en XML con %%, pero es necesario para establecer el texto en el código, no en xml diseño.

Esto podría ser un caso de la IDE se vuelva demasiado estricta.

La idea es buena, en general, se debe especificar el orden de las variables de sustitución de manera que en caso de que agregar recursos para otro idioma, no tendrá que cambiar su código java. Sin embargo, hay dos problemas con esto:

En primer lugar, una cadena como:

You will need %.5G %s

para ser utilizado como Tendrá 2,1200 mg tendrá el fin de la misma en cualquier idioma como la cantidad de masa siempre está representado en ese orden científicamente.

La segunda es que si se pone el orden de las variables en lo que cada vez el lenguaje de sus recursos por defecto se especifican en (por ejemplo, Inglés), después, sólo necesita especificar las posiciones en las cadenas de recursos para los idiomas el uso de un orden diferente a la predeterminada idioma.

La buena noticia es que esto es sencillo de solucionar. A pesar de que no hay necesidad de especificar las posiciones, y el IDE está siendo demasiado estricto, sólo tiene que especificar todos modos. Para el ejemplo anterior uso:

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

Trate de este (derecha):

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

Un método complicado: el uso de señal pequeña por ciento como abajo

 <string name="zone_50">Fat Burning (50&#65130; to 60&#65130;)</string> 

signo de porcentaje en la Wikipedia

Por google documentación oficial, el uso% 1 $ s y% 2 $ s http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

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

Supongamos que desea mostrar (50% OFF) y escriba 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 el uso de clases de Java este código:

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

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

\%
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top