如何在Android中的xml <string>资源中保留换行符?</string>

时间:2013-09-21 22:37:35

标签: android xml line-breaks aapt

我正在尝试使用多行常量(在/ 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>

所有这些字符串声明变体都会产生相同的结果 - 五个字符的字符串“A B C”(换行符被替换为单个空格)。有什么方法可以避免这种情况吗?

P.S。我知道我可以使用“\ n”来插入换行符,但无论如何,结果字符串将包含空格来代替实际的换行符;即,遵循声明:

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

产生字符串“A \ n B \ n C \ n”(每个手动插入的换行符后跟恼人的空格)。有没有解决办法?..

7 个答案:

答案 0 :(得分:14)

如果人们遇到此问题,在XML字符串末尾插入\n会导致缩进。例如:

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

将显示为

A
  B
  C

相反,您需要在BEGINNING of XML strings

中插入\n
<string name="test">
    A
    \nB
    \nC
</string>

这将导致新行正确显示。

答案 1 :(得分:10)

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

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

这样,您可以使用&#34; \ n&#34;来插入换行符。并且您在资源文件中转义行末尾,因此它不会转换为空格。

仍然很难看,但确实有效。

答案 2 :(得分: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"/>

希望这有帮助

答案 3 :(得分: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>

答案 4 :(得分:1)

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

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

还有another one

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

Tested 使用 API 21 和 30 上的 Android Studio 4.1.2。

答案 5 :(得分: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"));
    }

答案 6 :(得分: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[...]]> 标签。这在 Android studio 4.2 中 100% 有效。 1。但我只使用 API 级别 30 对其进行了测试。 @Chris Moore 对于 android studio 4.2.1 不正确。