ChatGPT解决这个技术问题 Extra ChatGPT

How to keep the spaces at the end and/or at the beginning of a String?

I have to concatenate these two strings from my resource/value files:

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

I do it this way :

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

But the spaces at the end of the first string and at the beginning of the second string have disappeared (when the Toast is shown) ...

What should I do ?

I guess the answer is somewhere here in this documentation link

or is it something like using &amp ; for the "&" character ??

There are a few good answers, but none of them work for me (see my comments). The bounty is for any answer that provides a way to get a real space character (U+0020) as the first or last character of the string resource.
Nasty nasty android :(

T
Tot Zam

Even if you use string formatting, sometimes you still need white spaces at the beginning or the end of your string. For these cases, neither escaping with \, nor xml:space attribute helps. You must use HTML entity &#160; for a whitespace.

Use &#160; for non-breakable whitespace.
Use &#032; for regular space.


This kind of works, but it inserts a non-breaking space (U+00A0) instead of a regular space. That can be undesirable in some situations.
  doesn't work... xml editor gives an error and you can't to build the project... \u0020 works fine!
You need to add the semi colon (;) at the end.
\u0020 is generally the better solution. requires that you parse html and can be randomly ignored in some cases resulting in no space
On Android Studio 3.2 deploying to an API 25 emulator, I used &#032;, and I got no build error, but my space was still ignored. &#160; worked, but I don't want a non-breakable whitespace. I want just a regular space. \u0020 worked.
m
mostar

I ran into the same issue. I wanted to leave a blank at the end of a resource string representing an on-screen field name.

I found a solution on this issue report : https://github.com/iBotPeaches/Apktool/issues/124

This is the same idea that Duessi suggests. Insert \u0020 directly in the XML for a blank you would like to preserve.

Example :

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

The replacement is done at build time, therefore it will not affect the performance of your game.


works great. wonder what's the difference between using it and  
@androiddeveloper, \u indicates a unicode character as an escape sequence (not a unicode char directly in the file). &#nnn; indicates an html entity, which means that you're relying on your xml string being html parsed (it is by default when used in text views). See w3schools.com/html/html_entities.asp
@greg7gkb Interesting, but I didn't know it's by default. You mean that if I use "setText" on the string resource, it will work the same?
@androiddeveloper Yes, I just confirmed this in code. You can have html entities in your strings xml file and they will be converted by default with setText(int resId). Example: T S T .
\u0020 is SPACE of ASCII code. This was the best choice for my project since I had to make sure it was ASCII.
R
Rahul Sharma

This documentation suggests quoting will work:

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

Does it guarantee <string name="my_str_spaces">" Before <b>and</b> after? "</string>
Like this more than using unicode characters! Thanks!
Unfortunately some localization tools, like Passolo, automatically adds slash before quote. And string becomes this: \" Before and after? \". Therefore, this quotes appears in text. So using \u0020 seems to be better in this case.
I don't see this mentioned anywhere in the documentation. The closest I can see is Enclose the entire string in double quotes ("This'll work", for example) where it discusses escaping a Single quote (').
J
Jasen

I just use the UTF code for space "\u0020" in the strings.xml file.

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

works great. (Android loves UTF codes)


This worked for me where the accepted answer did not.
Is there anything new to the existing answer?
k
kyay10

This question may be old, but as of now the easiest way to do it is to add quotation marks. For example:

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

this works perfectly. Just surround your desired text with quotaion marks " your text"
kamaal kar diya :D
A
Andrew

There is possible to space with different widths:

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

| SPACE | THIN SPACE | HAIR SPACE | no space |

Visualisation:

https://i.stack.imgur.com/QJeF4.png


H
Harshad Pansuriya

use "" with the string resource value.

Example :

<string>"value with spaces"</string>

OR

use \u0020 code for spaces.


J
Jeremy Logan

If you really want to do it the way you were doing then I think you have to tell it that the whitespace is relevant by escaping it:

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

However, I'd use string formatting for this. Something like the following:

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

then

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

Escaping with a backslash does not work (for me at least). Using a format string is a great solution generally, but not always. For instance, String.format causes many memory allocations that are undesirable in a game.
escaping the spaces (using the "\ " ) didn't work for me either.
Formatting only works if your text is all displayed in the same style. In my case the 2 things being joined are bold vs. normal and different colors.
T
Tarsbir Singh

Working well I'm using \u0020

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

Java file

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

Screenshot here Image of Showing Working of this code


E
Etienne Lawlor

All answers here did not work for me. Instead, to add a space at the end of a string in XML i did this

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

M
MPelletier

An argument can be made for adding the space programmatically. Since these cases will be often used in concatenations, I decided to stop the madness and just do the old + " " +. These will make sense in most European languages, I would gather.


P
Pavel Minaev

I've no idea about Android in particular, but this looks like the usual XML whitespace handling - leading and trailing whitespace within an element is generally considered insignificant and removed. Try 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>

Unfortunately, xml:space seems to be ignored.
S
Skusku

This may not actually answer the question (How to keep whitespaces in XML) but it may solve the underlying problem more gracefully.

Instead of relying only on the XML resources, concatenate using format strings. So first remove the whitespaces

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

And then build your string differently:

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

a
android developer

There is also the solution of using CDATA. Example:

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

But in general I think \u0020 is good enough.


T
TheIT

If you need the space for the purpose of later concatenating it with other strings, then you can use the string formatting approach of adding arguments to your string definition:

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

Then for format the string (eg if you have an error returned by the server, otherwise use getString(R.string.string_resource_example)):

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

Which results in:

Error: Server error message here

H
Hubert

It does not work with xml:space="preserve"

so I did it the quickest way =>

I simply added a +" "+ where I needed it ...

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

What's the point of using resources at all if you are just going to mix in some Java string literals?