Comment conserver les espaces à la fin et / ou au début d'une chaîne?


359

Je dois concaténer ces deux chaînes de mes fichiers de ressources / valeurs:

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

Je le fais de cette façon:

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();

Mais les espaces à la fin de la première chaîne et au début de la deuxième chaîne ont disparu (lorsque le Toast est affiché) ...

Que devrais-je faire ?

Je suppose que la réponse se trouve quelque part ici dans ce lien de documentation

ou est-ce quelque chose comme utiliser &amp ;pour le caractère "&" ??


2
Il y a quelques bonnes réponses, mais aucune ne fonctionne pour moi (voir mes commentaires). La prime est pour toute réponse qui fournit un moyen d'obtenir un caractère d'espace réel (U + 0020) comme premier ou dernier caractère de la ressource de chaîne.
Thomas

3
Nasty Nasty Android :(
Vlad Spreys

Réponses:


502

Même si vous utilisez le formatage de chaîne, vous avez parfois besoin d’espaces blancs au début ou à la fin de votre chaîne. Pour ces cas, ni échapper avec \, ni xml:spaceattribut n'aide. Vous devez utiliser une entité HTML &#160;pour un espace.

À utiliser &#160;pour les espaces blancs incassables.
Utilisez &#032;pour l'espace régulier.


12
Ce genre de travaux, mais il insère un espace insécable (U + 00A0) au lieu d'un espace régulier. Cela peut être indésirable dans certaines situations.
Thomas

50
& # 160 ne fonctionne pas ... l'éditeur xml donne une erreur et vous ne pouvez pas construire le projet ... \ u0020 fonctionne très bien!
jcamacho

10
Vous devez ajouter le point-virgule (;) à la fin.
user1010160

36
\ u0020 est généralement la meilleure solution. & # 032; nécessite que vous
analysiez le code

5
Sur Android Studio 3.2 déployant sur un émulateur API 25, j'ai utilisé &#032;et je n'ai eu aucune erreur de construction, mais mon espace était toujours ignoré. &#160;travaillé, mais je ne veux pas d'un espace blanc incassable. Je veux juste un espace régulier. \u0020travaillé.
Heath Borders

490

J'ai rencontré le même problème. Je voulais laisser un blanc à la fin d'une chaîne de ressources représentant un nom de champ à l'écran.

J'ai trouvé une solution sur ce rapport de problème: https://github.com/iBotPeaches/Apktool/issues/124

C'est la même idée que Duessi suggère. Insérez \u0020directement dans le XML pour un espace que vous souhaitez conserver.

Exemple :

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

Le remplacement est effectué au moment de la construction, il n'affectera donc pas les performances de votre jeu.


fonctionne très bien. me demande quelle est la différence entre l'utiliser et & # 160;
développeur Android

3
@androiddeveloper, \ u indique un caractère unicode comme séquence d'échappement (pas un caractère unicode directement dans le fichier). & # nnn; indique une entité html, ce qui signifie que vous comptez sur l'analyse de votre chaîne xml html (elle est par défaut lorsqu'elle est utilisée dans les vues de texte). Voir w3schools.com/html/html_entities.asp
greg7gkb

@ greg7gkb Intéressant, mais je ne savais pas que c'était par défaut. Vous voulez dire que si j'utilise "setText" sur la ressource de chaîne, cela fonctionnera de la même manière?
développeur Android

@androiddeveloper Oui, je viens de le confirmer dans le code. Vous pouvez avoir des entités html dans votre fichier xml de chaînes et elles seront converties par défaut avec setText (int resId). Exemple: <string name = "test"> T & # 160; S & # 160; T & # 160; </string>.
greg7gkb

5
\u0020est l'ESPACE du code ASCII. C'était le meilleur choix pour mon projet car je devais m'assurer qu'il était ASCII.
OneWorld

138

Cette documentation suggère que la citation fonctionnera:

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

2
Est-ce que cela garantit<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek

5
Comme ça, plus que d'utiliser des caractères Unicode! Merci!
Sumit Anantwar du

2
Malheureusement, certains outils de localisation, comme Passolo, ajoutent automatiquement une barre oblique avant le devis. Et la chaîne devient ceci: <string name = "my_str_spaces"> \ "Avant et après? \" </string>. Par conséquent, ces citations apparaissent dans le texte. Donc, utiliser \ u0020 semble être mieux dans ce cas.
Fox

Je ne vois cela mentionné nulle part dans la documentation. Le plus proche que je peux voir est l' Enclose the entire string in double quotes ("This'll work", for example)endroit où il discute de la fuite d'un Single quote (').
Heath Borders

Cela ne fonctionne pas pour moi
James Riordan

38

J'utilise simplement le code UTF pour l'espace "\ u0020" dans le fichier strings.xml.

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

fonctionne très bien. (Android aime les codes UTF)


2
Cela a fonctionné pour moi où la réponse acceptée n'a pas fonctionné.
Lance

1
Y a-t-il quelque chose de nouveau dans la réponse existante ?
user905686

21

Cette question est peut-être ancienne, mais la méthode la plus simple consiste à présent à ajouter des guillemets. Par exemple:

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

cela fonctionne parfaitement. Entourez simplement votre texte souhaité avec des marques de quota "votre texte"
Tarun Kumar

10

Il est possible d'espacer avec différentes largeurs:

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

| ESPACE | ESPACE MINCE | ESPACE CHEVEUX | pas d'espace |

Visualisation:

entrez la description de l'image ici


8

Si vous voulez vraiment le faire comme vous le faisiez, je pense que vous devez lui dire que l'espace est pertinent en l'échappant:

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

Cependant, j'utiliserais un formatage de chaîne pour cela. Quelque chose comme ceci:

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

puis

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

1
S'échapper avec une barre oblique inverse ne fonctionne pas (du moins pour moi). L'utilisation d'une chaîne de formatage est une excellente solution en général, mais pas toujours. Par exemple, String.formatprovoque de nombreuses allocations de mémoire indésirables dans un jeu.
Thomas

échapper aux espaces (en utilisant le "\") n'a pas fonctionné pour moi non plus.
développeur Android

Le formatage ne fonctionne que si votre texte est affiché dans le même style. Dans mon cas, les 2 choses jointes sont en gras par rapport aux couleurs normales et différentes.

5

utilisez "" avec la valeur de ressource de chaîne.

Exemple: "valeur avec espaces"

OU

utilisez le code \ u0020 pour les espaces.


4

Fonctionne bien que j'utilise \ u0020

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

Fichier 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();

Capture d'écran ici Image montrant le fonctionnement de ce code


2

Un argument peut être avancé pour ajouter l'espace par programmation. Étant donné que ces cas seront souvent utilisés dans les enchaînements, j'ai décidé d'arrêter la folie et de faire juste l'ancien + " " +. Je dirais que cela aura du sens dans la plupart des langues européennes.


1

Toutes les réponses ici n'ont pas fonctionné pour moi. Au lieu de cela, pour ajouter un espace à la fin d'une chaîne dans XMLje l'ai fait

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

0

Je n'ai aucune idée d'Android en particulier, mais cela ressemble à la gestion habituelle des espaces blancs XML - les espaces blancs de début et de fin dans un élément sont généralement considérés comme insignifiants et supprimés. Essayez 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>

Malheureusement, xml:spacesemble être ignoré.
Thomas

0

Cela peut ne pas réellement répondre à la question (Comment conserver les espaces blancs en XML), mais cela peut résoudre le problème sous-jacent plus gracieusement.

Au lieu de compter uniquement sur les ressources XML, concaténer à l'aide de chaînes de format. Donc, supprimez d'abord les espaces blancs

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

Et puis construisez votre chaîne différemment:

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

Il y a aussi la solution de l'utilisation CDATA. Exemple:

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

Mais en général, je pense que \u0020c'est assez bon.


-1

Si vous avez besoin de l'espace pour le concaténer ultérieurement avec d'autres chaînes, vous pouvez utiliser l'approche de formatage de chaîne pour ajouter des arguments à votre définition de chaîne:

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

Ensuite, pour formater la chaîne (par exemple si vous avez une erreur retournée par le serveur, sinon utilisez getString(R.string.string_resource_example)):

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

Ce qui se traduit par:

Error: Server error message here

-6

Cela ne fonctionne pas avec xml: espace = "préserver"

donc je l'ai fait le plus rapidement =>

J'ai simplement ajouté un + "" + là où j'en avais besoin ...

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

2
Quel est l'intérêt d'utiliser des ressources si vous allez simplement mélanger certains littéraux de chaîne Java?
Kristopher Johnson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.