如何在Android TextView中添加换行?

186

我想在TextView中添加一个换行符。

我尝试了建议使用的 \n 但它没有起作用。这是我设置文本的方式。

TextView txtSubTitle = (TextView)findViewById(r.id.txtSubTitle);
txtSubTitle.setText(Html.fromHtml(getResources().getString(R.string.sample_string)));

这是我的字符串:<string name="sample_string">some test line 1 \n some test line 2</string>

应该显示如下:

some test line 1
some test line 2

但它的显示效果是这样的:some test line 1 some test line 2

我有什么遗漏吗?


你是否将android:lines设置为至少2行? - Robby Pond
我的副标题已经有6-9行了,它会自动换到下一行,但如果我想强制换行,它就不会换行。 - dropsOfJupiter
你应该将你的解决方案发布为答案并接受它,这样人们就可以点赞了! - bigstones
1
我创建了一个小的示例项目,以说明编码换行符及其副作用的各种方式。提示:\n确实是最好的方法。https://github.com/paour/StringResourceTest - Pierre-Luc Paour
解决方案非常简单,只需删除 Html.fromHtml() 函数并直接使用 txtSubTitle.setText(getResources().getString(R.string.sample_string)) 即可。 - Bugs Happen
25个回答

245

\n 对我来说有效,就像这样:

<TextView android:text="First line\nNext line"

6
Windows使用\r\n作为换行符,而Linux使用\n作为换行符。 - Guilherme Torres Castro
这对我没用。 <TextView android:layout_width="50dp" android:layout_height="70dp" android:layout_weight="1" android:background="@drawable/keypad1" android:gravity="center" android:text="2 ABC" /> - AndroidRaji
1
没有提到你所做的另一个更改,即在字符串周围添加引号,这是误导性的。 - Patrick
回复:缩进 - 看起来这是我的问题 https://dev59.com/KFjUa4cB1Zd3GeqPOR-0#11098201 - stephen_liu
2
"\r" 实际上在文本中显示为 "r"。因此,正如其他人建议的那样,使用 "\n" 就可以了。 - Miha Markic
显示剩余3条评论

108

好的,我弄明白了:

<string name="sample_string"><![CDATA[some test line 1 <br />some test line 2]]></string>

因此,在CDATA中包装是必要的,而在其中添加断点作为HTML标记。


4
在字符串资源中使用以下内容: 像这样:"你好!第一行! 这是第二行" - RexSplode
6
这需要使用Html.fromHtml()来实现换行,对于一个简单的换行来说这有点复杂,并且翻译提供程序不太支持。 - Pierre-Luc Paour
你认真的吗?你找不到他问题中的错误吗? - Bugs Happen
我的文本中有一个字面上的<br />。但是这个可以工作:<string name="label">Line\nAnother Line</string> - vesperto

78

安卓1.6版本不能识别 \r\n。 可以使用:System.getProperty("line.separator")

String s = "Line 1"
           + System.getProperty("line.separator")
           + "Line 2"
           + System.getProperty("line.separator");

3
点赞!这个方法对我有效!如果你只是想在表单中添加换行符:textView.setText(string1+System.getProperty ("line.separator")+string2); 那么它非常好用,谢谢! - Twice Circled
啥?有没有运行Windows的Android版本? - maaartinus
4
如果您正在使用Xamarin,这是等效的代码:Java.Lang.JavaSystem.LineSeparator()。 - Steve
3
为什么不直接使用System.lineSeparator()? - George Z.

69

如果您像这样将字符串资源值放在引号中,则换行符(\n)起作用:

<string name="sample_string">"some test line 1 \n some test line 2"</string>

如果像这样不加引号地输入,它将不会换行:
<string name="sample_string">some test line 1 \n some test line 2</string>

没错,就这么简单。


3
我想补充一下,这种引用方法在字符串资源中使用特殊字符或者希腊语、俄语等语言也同样适用(如果您遇到任何问题)。 - dy_
1
谢谢,我认为使用引号是保持长多行文本易读性的更好解决方案。`"一些测试行1 一些测试行2 行3" ` - xinthink
1
使用引号还有其他副作用,例如使空格始终具有重要意义(如果没有引号,则连续多个空格,例如缩进中的空格会被折叠)。 - Pierre-Luc Paour

37

尝试了以上所有方法,自己进行了一些研究,得出如下解决方案以渲染换行符转义字符:

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. 使用 replace 方法过滤转义的换行符(例如 '\\n')

  2. 仅然后将每个换行符 '\n' 转义字符的实例呈现为实际的换行符

对于此示例,我使用了格式为 JSON 的 Google Apps Scripting noSQL 数据库(ScriptDb)。

干杯 :D


text.replace("\n", System.getProperty("line.separator")) 请将文本中的 "\n" 替换为系统属性 "line.separator" - Mussa

28

有两种方法可以解决这个问题。 如果您将字符串作为原始字符串使用,则需要使用换行符。 如果您将其用作html,例如通过使用 Html.fromString 解析它, 那么第二种变体更好。

1)换行符 \n

<string name="sample">This\nis a sample</string>

2) Html 换行标签 <br><br />

<string name="sample">This<br>is a sample</string>

6
我没有给它踩反对票,但我认为你的代码是错误的。你需要使用"<br>"代替"<br>",因为"<"是一个保留符号。否则它不会起作用。 - JPM
<br><u><b><i>标签可以在字符串资源中直接使用,无需转义,并且可以通过TextView.setText(resId)正确应用。如果使用Context.getString(resId),则这些标签会被剥离,除非它们被包含在CDATA部分中。 - Pierre-Luc Paour

17

这对我起作用了

android:text="First \n Second"

2
你的示例看起来包含了布局资源中的文本,这是一个大忌(无法本地化)。 - Pierre-Luc Paour

16

这个方法对我有效,或许有人会发现它很有帮助:

TextView textField = (TextView) findViewById(R.id.textview1);
textField.setText("First line of text" + System.getProperty("line.separator") + "Linija 2");

13

如果您使用XML声明TextView,请使用android:singleLine="false",或者在Java中使用txtSubTitle.setSingleLine(false);


不,那行不通。这与Html.fromHtml()和字符串资源有关吗? - dropsOfJupiter
@dropsOfJupiter:你看过Html.fromHtml()方法返回的内容吗?我很想把它赋值给一个字符串,在调试器中查看。 - slund

11

我使用的是Android Studio 0.8.9。 对我有效的唯一方法是使用\n。 不论是用CDATA包装,还是使用<br><br />都没有起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接