¿Cómo mantener los espacios al final y / o al principio de una cadena?


359

Tengo que concatenar estas dos cadenas de mis archivos de recursos / valores:

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on </string>
<string name="Toast_Memory_GameWon_part2"> flips !</string>

Lo hago de esta manera:

String message_all_pairs_found = getString(R.string.Toast_Memory_GameWon_part1)+total_flips+getString(R.string.Toast_Memory_GameWon_part2);

Toast.makeText(this, message_all_pairs_found, 1000).show();

Pero los espacios al final de la primera cadena y al comienzo de la segunda cadena han desaparecido (cuando se muestra el Toast) ...

Qué tengo que hacer ?

Supongo que la respuesta está aquí en este enlace de documentación.

¿o es algo así como usar &amp ;para el carácter "&"?


2
Hay algunas buenas respuestas, pero ninguna de ellas funciona para mí (ver mis comentarios). La recompensa es por cualquier respuesta que proporcione una forma de obtener un carácter de espacio real (U + 0020) como el primer o último carácter del recurso de cadena.
Thomas

3
Android desagradable desagradable :(
Vlad Spreys

Respuestas:


502

Incluso si usa el formato de cadena, a veces aún necesita espacios en blanco al principio o al final de su cadena. Para estos casos, ni escapar con \, ni xml:spaceatribuir ayuda. Debe usar la entidad HTML &#160;para un espacio en blanco.

Uso &#160;para espacios en blanco no rompibles.
Úselo &#032;para espacio regular.


12
Este tipo de trabajo funciona, pero inserta un espacio que no se rompe (U + 00A0) en lugar de un espacio normal. Eso puede ser indeseable en algunas situaciones.
Thomas

50
& # 160 no funciona ... xml editor da un error y no puedes construir el proyecto ... \ u0020 funciona bien!
jcamacho

10
Necesita agregar el punto y coma (;) al final.
user1010160

36
\ u0020 es generalmente la mejor solución. & # 032; requiere que analices html y puede ser ignorado al azar en algunos casos, lo que no tiene espacio
HaydenKai

55
En Android Studio 3.2 que se implementó en un emulador API 25, utilicé &#032;y no obtuve ningún error de compilación, pero mi espacio aún se ignoró. &#160;funcionó, pero no quiero un espacio en blanco no rompible. Solo quiero un espacio regular. \u0020trabajó.
Heath Borders el

490

Me encontré con el mismo problema. Quería dejar un espacio en blanco al final de una cadena de recursos que representa un nombre de campo en pantalla.

Encontré una solución en este informe de problema: https://github.com/iBotPeaches/Apktool/issues/124

Esta es la misma idea que sugiere Duessi. Inserte \u0020directamente en el XML para un espacio en blanco que le gustaría conservar.

Ejemplo:

<string name="your_id">Score :\u0020</string>

El reemplazo se realiza en el momento de la compilación, por lo tanto, no afectará el rendimiento de su juego.


Funciona genial. me pregunto cuál es la diferencia entre usarlo y & # 160;
Desarrollador de Android

3
@androiddeveloper, \ u indica un carácter unicode como una secuencia de escape (no un carácter unicode directamente en el archivo). & # nnn; indica una entidad html, lo que significa que confía en que su cadena xml se analice html (de forma predeterminada, cuando se usa en vistas de texto). Ver w3schools.com/html/html_entities.asp
greg7gkb

@ greg7gkb Interesante, pero no sabía que era por defecto. ¿Quiere decir que si uso "setText" en el recurso de cadena, funcionará igual?
Desarrollador de Android el

@androiddeveloper Sí, acabo de confirmar esto en el código. Puede tener entidades html en su archivo xml de cadenas y se convertirán por defecto con setText (int resId). Ejemplo: <string name = "test"> T & # 160; S & # 160; T & # 160; </string>.
greg7gkb

55
\u0020es ESPACIO del código ASCII. Esta fue la mejor opción para mi proyecto ya que tenía que asegurarme de que fuera ASCII.
OneWorld

138

Esta documentación sugiere que las citas funcionarán:

<string name="my_str_spaces">" Before and after? "</string>

2
¿Garantiza?<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek

55
¡Me gusta más que usar caracteres Unicode! ¡Gracias!
Sumit Anantwar

2
Desafortunadamente, algunas herramientas de localización, como Passolo, agregan automáticamente una barra diagonal antes de la cotización. Y la cadena se convierte en esto: <string name = "my_str_spaces"> \ "¿Antes y después? \" </string>. Por lo tanto, estas citas aparecen en el texto. Entonces, usar \ u0020 parece ser mejor en este caso.
Fox

No veo esto mencionado en ninguna parte de la documentación. Lo más cerca que puedo ver es Enclose the entire string in double quotes ("This'll work", for example)donde se discute el escape a Single quote (').
Heath Borders

Esto no funciona para mí
James Riordan

38

Solo uso el código UTF para el espacio "\ u0020" en el archivo strings.xml.

<string name="some_string">\u0020The name of my string.\u0020\u0020</string>

Funciona genial. (Android ama los códigos UTF)


2
Esto funcionó para mí donde la respuesta aceptada no.
Lance

1
¿Hay algo nuevo en la respuesta existente ?
user905686

21

Esta pregunta puede ser antigua, pero a partir de ahora la forma más fácil de hacerlo es agregar comillas. Por ejemplo:

<string name="Toast_Memory_GameWon_part1">"you found ALL PAIRS ! on "</string>
<string name="Toast_Memory_GameWon_part2">" flips !"</string>

Esto funciona perfectamente. Simplemente rodee el texto deseado con comillas "su texto"
Tarun Kumar

10

Es posible espaciar con diferentes anchos:

<string name="space_demo">|&#x20;|&#x2009;|&#x200A;||</string>

El | ESPACIO | ESPACIO DELGADO | ESPACIO PARA EL CABELLO | sin espacio |

Visualización:

ingrese la descripción de la imagen aquí


8

Si realmente quieres hacerlo de la manera que lo estabas haciendo, entonces creo que tienes que decirle que el espacio en blanco es relevante escapándolo:

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on\ </string>
<string name="Toast_Memory_GameWon_part2">\ flips !</string>

Sin embargo, usaría el formato de cadena para esto. Algo como lo siguiente:

<string name="Toast_Memory_GameWon">you found ALL PAIRS ! on %d flips !</string>

entonces

String message_all_pairs_found = String.format(getString(R.string.Toast_Memory_GameWon), total_flips);

1
Escapar con una barra invertida no funciona (al menos para mí). Usar una cadena de formato es una gran solución en general, pero no siempre. Por ejemplo, String.formatcausa muchas asignaciones de memoria que no son deseables en un juego.
Thomas

escapar de los espacios (usando la "\") tampoco funcionó para mí.
Desarrollador de Android

El formateo solo funciona si su texto se muestra en el mismo estilo. En mi caso, las 2 cosas que se unen son negrita vs. colores normales y diferentes.

5

use "" con el valor del recurso de cadena.

Ejemplo: "valor con espacios"

O

use el código \ u0020 para espacios.


4

Trabajando bien, estoy usando \ u0020

<string name="hi"> Hi \u0020 </string>
<string name="ten"> \u0020 out of 10  </string>
<string name="youHaveScored">\u0020 you have Scored \u0020</string>

Archivo Java

String finalScore = getString(R.string.hi) +name+ getString(R.string.youHaveScored)+score+ getString(R.string.ten);
               Toast.makeText(getApplicationContext(),finalScore,Toast.LENGTH_LONG).show();

Captura de pantalla aquí Imagen de mostrar el funcionamiento de este código


2

Se puede hacer un argumento para agregar el espacio mediante programación. Dado que estos casos se usarán a menudo en concatenaciones, decidí detener la locura y simplemente hacer lo viejo + " " +. Tendría sentido en la mayoría de los idiomas europeos, me daría cuenta.


1

Todas las respuestas aquí no funcionaron para mí. En cambio, para agregar un espacio al final de una cadena en XMLhice esto

<string name="more_store">more store<b> </b> </string>

0

No tengo idea sobre Android en particular, pero esto se parece al manejo habitual de espacios en blanco XML: los espacios en blanco iniciales y finales dentro de un elemento generalmente se consideran insignificantes y se eliminan. Prueba xml:space:

<string name="Toast_Memory_GameWon_part1" xml:space="preserve">you found ALL PAIRS ! on </string>
<string name="Toast_Memory_GameWon_part2" xml:space="preserve"> flips !</string>

Lamentablemente, xml:spaceparece ser ignorado.
Thomas

0

Es posible que esto realmente no responda la pregunta (Cómo mantener espacios en blanco en XML) pero puede resolver el problema subyacente con más gracia.

En lugar de confiar solo en los recursos XML, concatene utilizando cadenas de formato. Así que primero elimine los espacios en blanco

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on</string>
<string name="Toast_Memory_GameWon_part2">flips !</string>

Y luego construye tu cadena de manera diferente:

String message_all_pairs_found = 
      String.format(Locale.getDefault(), 
                    "%s %d %s", 
                    getString(R.string.Toast_Memory_GameWon_part1),
                    total_flips,
                    getString(R.string.Toast_Memory_GameWon_part2);

Toast.makeText(this, message_all_pairs_found, 1000).show();

0

También existe la solución de usar CDATA. Ejemplo:

<string name="test"><![CDATA[Hello          world]]></string>

Pero en general creo que \u0020es lo suficientemente bueno.


-1

Si necesita el espacio para luego concatenarlo con otras cadenas, puede usar el enfoque de formato de cadena para agregar argumentos a su definición de cadena:

<string name="error_">Error: %s</string>

Luego, para formatear la cadena (por ejemplo, si el servidor devuelve un error, de lo contrario, use getString(R.string.string_resource_example)):

String message = context.getString(R.string.error_, "Server error message here")

Lo que resulta en:

Error: Server error message here

-6

No funciona con xml: space = "preserve"

así que lo hice de la manera más rápida =>

Simplemente agregué un + "" + donde lo necesitaba ...

String message_all_pairs_found = getString(R.string.Toast_Memory_GameWon_part1)+" "+total_flips+" "+getString(R.string.Toast_Memory_GameWon_part2);

2
¿De qué sirve usar recursos si solo vas a mezclar algunos literales de cadena Java?
Kristopher Johnson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.