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

AndroidString Concatenation

Android Problem Overview


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 ??

Android Solutions


Solution 1 - Android

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.

Solution 2 - Android

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.

Solution 3 - Android

This documentation suggests quoting will work:

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

Solution 4 - Android

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)

Solution 5 - Android

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>

Solution 6 - Android

There is possible to space with different widths:

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

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

Visualisation:

enter image description here

Solution 7 - Android

use "" with the string resource value.

Example :

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

OR

use \u0020 code for spaces.

Solution 8 - Android

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

Solution 9 - Android

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

Solution 10 - Android

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>

Solution 11 - Android

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.

Solution 12 - Android

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>

Solution 13 - Android

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

Solution 14 - Android

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.

Solution 15 - Android

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

Solution 16 - Android

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHubertView Question on Stackoverflow
Solution 1 - AndroidduessiView Answer on Stackoverflow
Solution 2 - AndroidDavGinView Answer on Stackoverflow
Solution 3 - AndroidSkywalker5446View Answer on Stackoverflow
Solution 4 - AndroidJasenView Answer on Stackoverflow
Solution 5 - Androidkyay10View Answer on Stackoverflow
Solution 6 - AndroidAndrewView Answer on Stackoverflow
Solution 7 - AndroidBhupendra JoshiView Answer on Stackoverflow
Solution 8 - AndroidJeremy LoganView Answer on Stackoverflow
Solution 9 - AndroidTarsbir SinghView Answer on Stackoverflow
Solution 10 - AndroidEtienne LawlorView Answer on Stackoverflow
Solution 11 - AndroidMPelletierView Answer on Stackoverflow
Solution 12 - AndroidPavel MinaevView Answer on Stackoverflow
Solution 13 - AndroidSkuskuView Answer on Stackoverflow
Solution 14 - Androidandroid developerView Answer on Stackoverflow
Solution 15 - AndroidTheITView Answer on Stackoverflow
Solution 16 - AndroidHubertView Answer on Stackoverflow