【问题标题】:How to preserve line breaks in xml <string> resources in Android?如何在 Android 中的 xml <string> 资源中保留换行符?
【发布时间】:2013-09-27 02:51:03
【问题描述】:

我正在尝试使用多行常量(在 /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”(换行符被单个空格替换)。有什么办法可以避免吗?

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

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

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

【问题讨论】:

  • 参见stackoverflow.com/questions/10917555/… - 答案是为 LF 使用 HTML 实体。
  • (...) 不可能在那里保留换行符 - 它们都在空格中转换 - 这不是真的。在所有情况下,第一个(A 之前)和最后一个(C 之后)换行符都被清楚地删除了。

标签: android xml line-breaks aapt


【解决方案1】:

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

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

将显示为

A
  B
  C

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

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

这将使新行正确显示。

【讨论】:

  • (这是我讨厌编写 Android 的众多愚蠢原因之一)
  • 这仍然会在每一行的末尾添加一个空格。
  • 是的,最后的空格是不可避免的,除非你只内联所有内容,它也没有开头的那么明显哈哈
  • 天哪,谢谢你,我尝试了很多不同的组合来摆脱那个缩进!
【解决方案2】:

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

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

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

仍然很丑,但它有效。

【讨论】:

  • Jin 的回答不错,但是这个回答更好,应该是公认的回答。
  • 我已经在 API 17 上使用 Android Studio 2.1 进行了测试,但它不起作用。
  • 仍然在 API 25 和 Android Studio 3.4 上不起作用。 \nA“不幸的是”仍然是一个更好/有效的解决方案。
【解决方案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"/>

希望对你有帮助

【讨论】:

  • 结果只是单行字符串“A B C”
  • @shujatAli,你读过我的问题的后记吗?当然我知道我可以使用“\n”,但问题是使用跨越多行的大字符串常量,并在源 xml 文件中的位置保留换行符。例如,我试图将格式化的 SQL 查询存储在 xml 文件中的 常量中,因为它们中的大多数都非常大(通常有几十行),并且直接在源代码中定义这样的字符串很不方便。这里的“格式化”意味着“带有换行符”。为此,目前我必须在每一行的末尾添加“\n”,这有点烦人。
  • 此外,aapt 会插入额外的空间来代替源 xml 中的每个实际换行符。不幸的是,似乎没有更好的解决方案。
【解决方案4】:

像这样使用 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>

【讨论】:

  • 如何制作两条折线?我需要删除两个空行
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

      在最新的 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>
      

      您可以添加 &lt;br /&gt; 标签而不使用 &lt;![CDATA[...]]&gt; 标签。 这在 Android Studio 4.2.1 中 100% 有效>。但我只使用 API 级别 30 对其进行了测试。 @Chris Moore 对于 android studio 4.2.1 不正确。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多