如何在字符串的末尾和/或开头保留空格?


358

我必须将资源/值文件中的这两个字符串连接起来:

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

我这样做:

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

但是第一个字符串结尾处和第二个字符串开头处的空格已经消失(当显示Toast时)...

我该怎么办 ?

我猜答案在此文档链接中的某处

还是像使用&amp ;“&”字符?


2
有几个很好的答案,但是没有一个对我有用(请参阅我的评论)。赏金用于任何提供以实数字符(U + 0020)作为字符串资源的第一个或最后一个字符的方式的答案。
托马斯

3
讨厌的讨厌的Android的人:(
Vlad Spreys 2013年

Answers:


501

即使您使用字符串格式,有时您仍然需要在字符串的开头或结尾使用空格。对于这些情况,使用\,或xml:space属性进行转义都无济于事。您必须将HTML实体&#160;用于空白。

使用&#160;非易碎的空白。
使用&#032;正规的空间。


12
类型的作品,但它插入一个非换空间(U + 00A0),而不是常规的空间。在某些情况下,这可能是不可取的。
托马斯

50
&#160不起作用... xml编辑器给出了一个错误,您无法构建该项目... \ u0020正常!
jcamacho

10
您需要在末尾添加分号(;)。
user1010160

36
\ u0020通常是更好的解决方案。&#032; 要求您解析html,并且在某些情况下可以被随机忽略而导致没有空间
HaydenKai16年

5
在将Android Studio 3.2部署到API 25仿真器上时,我使用&#032;,并且没有构建错误,但是我的空间仍然被忽略。&#160;有用,但我不希望出现不间断的空格。我只想要一个普通的空间。\u0020工作了。
Heath Borders '18

489

我遇到了同样的问题。我想在表示屏幕上字段名称的资源字符串的末尾保留一个空白。

我找到了此问题报告的解决方案:https : //github.com/iBotPeaches/Apktool/issues/124

这与杜西提出的想法相同。\u0020直接在XML中插入要保留的空白。

范例:

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

替换是在构建时完成的,因此不会影响游戏性能。


效果很好。想知道使用它和&#160;有什么区别
Android开发人员

3
@androiddeveloper,\ u表示一个Unicode字符作为转义序列(不是直接在文件中的Unicode字符)。&#nnn; 表示一个html实体,这意味着您依赖于对html字符串进行html解析(在文本视图中默认使用)。参见w3schools.com/html/html_entities.asp
greg7gkb 2014年

@ greg7gkb有趣,但是我不知道它是默认设置。您的意思是,如果我在字符串资源上使用“ setText”,它将起作用吗?
Android开发人员

@androiddeveloper是的,我刚刚在代码中确认了这一点。您可以在字符串xml文件中包含html实体,默认情况下将使用setText(int resId)对其进行转换。例如:<string name =“ test”> T&#160; S&#160; T&#160; </ string>。
greg7gkb

5
\u0020是ASCII码的SPACE。这是我的项目的最佳选择,因为我必须确保它是ASCII。
OneWorld 2014年

138

文档建议引用将起作用:

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

2
它能保证<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek

5
这样比使用unicode字符更重要!谢谢!
Sumit Anantwar

2
不幸的是,某些本地化工具(例如Passolo)会在引号之前自动添加斜杠。字符串变成这样:<string name =“ my_str_spaces”> \“之前和之后?\” </ string>。因此,此引号出现在文本中。因此,在这种情况下,使用\ u0020似乎更好。
Fox

我在文档的任何地方都没有提到这一点。我所看到的最接近的Enclose the entire string in double quotes ("This'll work", for example)地方是讨论转义的地方Single quote (')
Heath Borders

这对我不起作用
James Riordan

38

我只是在strings.xml文件中使用UTF代码来存储空格“ \ u0020”。

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

效果很好。(Android喜欢UTF代码)


2
在没有被接受的答案的情况下,这对我有用。
兰斯

1
现有答案是否有新内容?
user905686

21

这个问题可能很老了,但是到目前为止,最简单的方法是添加引号。例如:

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

这很完美。只需用引号“您的文本”括住所需文本即可
Tarun Kumar,

10

可能有不同宽度的空间:

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

| 空间| 薄型空间| 头发空间| 没有空间|

可视化:

在此处输入图片说明


8

如果您确实想按照自己的方式进行操作,那么我认为您必须通过转义来告诉它空格是相关的:

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

但是,我会为此使用字符串格式。类似于以下内容:

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

然后

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

1
用反斜杠转义不起作用(至少对我而言)。通常,使用格式字符串是一个很好的解决方案,但并非总是如此。例如,String.format导致许多游戏中不希望的内存分配。
托马斯

转义空格(使用“ \”)对我也不起作用。
Android开发人员

仅当您的文本全部以相同的样式显示时,格式设置才有效。在我的情况下,要加入的两件事分别是粗体,普通和不同的颜色。


4

工作正常,我正在使用\ 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文件

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

屏幕截图 显示此代码的工作原理


2

可以为以编​​程方式添加空间提供参数。由于这些情况经常会被串联使用,因此我决定停止疯狂,只做旧事+ " " +。我会收集到,这些语言在大多数欧洲语言中都有意义。


1

这里的所有答案都不适用于我。而是在XML我的字符串末尾添加一个空格

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

0

我特别不了解Android,但是这看起来像是通常的XML空格处理-元素中的前导和尾随空格通常被认为无关紧要并已删除。尝试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>

不幸的是,xml:space似乎被忽略了。
托马斯

0

这实际上可能无法回答问题(如何在XML中保留空格),但可以更优雅地解决潜在的问题。

使用格式字符串进行连接,而不是仅依赖XML资源。所以首先删除空格

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

然后以不同的方式构建您的字符串:

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

还有使用的解决方案CDATA。例:

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

但总的来说,我认为\u0020已经足够了。


-1

如果您需要空间以便以后将其与其他字符串连接在一起,则可以使用在字符串定义中添加参数的字符串格式化方法:

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

然后用于格式化字符串(例如,如果服务器返回错误,则使用getString(R.string.string_resource_example)):

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

结果是:

Error: Server error message here

-6

它不适用于xml:space =“ preserve”

所以我做到了最快的方法=>

我只是在需要的地方添加了一个+“” + ...

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

2
如果只想混入一些Java字符串文字,那么根本不使用资源有什么意义?
克里斯托弗·约翰逊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.