15

我正在尝试使用多行常量(在 /res/values/ 文件夹下的 .xml 文件中定义),但似乎不可能在那里保留换行符 - 它们都在空格中转换。我尝试使用字符串的“格式化”属性(将其设置为“true”和“false”,我还尝试将字符串包装在 CDATA 标记中,如下所示:

<string name="str1">
A
B
C
</string>

<string name="str2" formatted="true">
A
B
C
</string>

<string name="str3" formatted="false">
A
B
C
</string>

<string name="str4"><![CDATA[
A
B
C
]]></string>

<string name="str5" formatted="true"><![CDATA[
A
B
C
]]></string>

<string name="str6" formatted="false"><![CDATA[
A
B
C
]]></string>

所有这些字符串声明变体都产生相同的结果 - 五个字符的字符串“AB C”(换行符被单个空格替换)。有没有办法避免这种情况?

PS 我知道我可以使用 "\n" 来插入换行符,但无论如何生成的字符串将包含空格来代替实际的换行符;即,以下声明:

<string name="str1">
A\n
B\n
C\n
</string>

导致字符串“A\n B\n C\n”(每个手动插入的换行符后跟烦人的空格)。有什么办法吗?...

4

7 回答 7

25

如果人们对此有疑问,\n在 XML 字符串的末尾插入会导致缩进。例如:

<string name="test">
    A\n
    B\n
    C
</string>

将显示为

A
  B
  C

相反,您需要\n在 XML 字符串的开头插入

<string name="test">
    A
    \nB
    \nC
</string>

这将导致新行正确显示。

于 2015-07-28T17:45:12.407 回答
13

在每一行的末尾使用另一个反斜杠:

<string name="str1">
A\n\
B\n\
C\n\
</string>

这样,您使用“\n”插入换行符并在资源文件中转义行尾,因此它不会转换为空格。

仍然丑陋,但它的工作原理。

于 2016-01-29T10:34:30.430 回答
3

要从 XML 添加换行符,您需要添加“\n”。

这就是你的做法。

<string name="testing">A\nB\nC</string>

<TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:lines="4"
        android:text="@string/testing"/>

希望这可以帮助

于 2013-09-21T22:43:51.583 回答
3

像这样使用 html 中断:

<string name="your_string">
<![CDATA[
<p>
    Here is your text.<br/>
    This text is on a new line.<br/>
    So is this text. \n
    This is on the previous line with a space added.
</p>
]]>
</string>
于 2014-05-21T10:15:35.973 回答
1

我终于找到了一种不会在任何地方添加额外空格并且对我来说看起来不错的方法:

<string name="test">
A\
B\
C\
</string>

还有一个

<string name="test">
"A
B
C"
</string>

在 API 21 和 30 上使用 Android Studio 4.1.2 进行测试。

于 2021-02-08T22:02:47.053 回答
0

我的两分钱。
我解决了使用字符串数组,加载资源然后连接数组元素。
我还发现将每个长字符串放在单独的文件中也很好。

String[] storages = getResources().getStringArray(R.array.storages);
String oneline = new String();
    for (int i = 0; i < storages.length; i++) {
        oneline = oneline.concat(storages[i]);
        if (i < storages.length - 1)
            oneline.concat(System.getProperty("line.separator"));
    }
于 2014-05-28T08:22:56.337 回答
0

在最新的 android 版本中,您只有一种解决方案。

您的字符串数据必须如下所示。

<string name="thanks_from_head_shield">
    Mr. Prasanna Sumudu Chandrasekara<br />
    https://www.java2s.com<br />
    https://www.oracle.com/java<br />
    https://www.javatongue.blogspot.com<br />
    https://www.coderwall.com<br />
    https://www.igetintopc.com<br />
    https://www.tutorialspoint.com<br />
    https://stackoverflow.com<br />
    https://www.javatpoint.com<br />
    https://coderanch.com<br />
    https://www.c-sharpcorner.com<br />
    https://javapointers.com<br />
    https://www.fatalerrors.org<br />
    https://dzone.com<br />
    https://www.javamadesoeasy.com<br />
    https://www.geeksforgeeks.org<br />
    https://www.jetbrains.com<br />
    https://www.developer.android.com<br />
    Adobe.Inc<br />
    Thanks for other all softwares I used  and Other<br />
</string>

您可以添加<br />不带<![CDATA[...]]>标签的标签。这是 100% 在Android studio 4.2.1中工作。但我只用API Level 30对其进行了测试。@Chris Moore 对于 android studio 4.2.1 不正确。

于 2021-05-15T19:28:36.657 回答