如何在Android TextView中添加换行符?


157

我正在尝试在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?
罗比·庞德

我的字幕已经达到6-9行,并且确实将文本包装到了下一行,但是如果我想中断它则不会中断。
dropOfJupiter 2011年

您应该将解决方案作为答案发布并接受,这样人们才能投票赞成!
bigstones 2011年

1
我创建了一个小样本项目,以说明编码换行符的各种方法及其副作用。剧透:\n确实是最好的方法。github.com/paour/StringResourceTest
Pierre-Luc Paour

为什么这个问题投票赞成?你有没有看过?解决方案非常简单,只需删除该Html.fromHtml()功能并简单使用即可txtSubTitle.setText(getResources().getString(R.string.sample_string))
错误发生

Answers:


222

\n 为我工作,像这样:

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

87
只是\n单纯将工作......不觉得\r做任何事情。
彼得·阿杰泰

5
\ r \ n是Windows的换行符,\ n是Linux的换行符
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,2012年

1
没有提到您所做的另一项更改(在字符串周围添加引号)而产生误导。
Patrick

2
“ \ r”实际上在文本中显示为“ r”。因此,正如其他人所建议的那样,'\ n'可以解决问题。
Miha Markic '17

92

好想通了:

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

因此需要在CDATA中进行换行,并在其中添加中断作为html标签


3
在字符串资源&#xa;中使用此符号 就像“嗨!第一行!&#xa;这是第二行”
RexSplode

3
这需要使用Html.fromHtml(),对于简单的换行符来说有点用,并且翻译提供商没有很好地支持它。
皮埃尔·卢克(Paul-Luc Paour)

来吧,男人,认真吗?您在他的问题中找不到问题吗?
错误发生

68

Android 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); 那就可以了,谢谢!
两次盘旋

WAT?是否有运行Windows的Android版本?
maaartinus 2014年

3
对于使用Xamarin的用户来说,这是等效的:Java.Lang.JavaSystem.LineSeparator()
Steve

1
为什么不简单地使用System.lineSeparator()?
乔治·

60

当将字符串资源值放在这样的引号中时,换行符(\ 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
我只是想补充一下,这个引号还可以与字符串资源中的特殊字符或希腊语或俄语之类的语言配合使用……(如果遇到任何问题)
datayeah 2012年

1
谢谢,我认为使用引号是保持较长的多行文本可读性的更好解决方案 <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
xinthink 2015年

1
使用引号还有其他副作用,例如使空格始终有效(不带引号的话,一行中的多个空格(如缩进)将被折叠)。
皮埃尔·卢克(Paul-Luc Paour)

33

经过以上所有尝试,我做了一些自己的研究,得出以下用于呈现换行符转义字符的解决方案:

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”))
Mussa


17

有两种解决方法。如果将字符串用作原始字符串,则需要使用换行符。如果您将其用作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
我没有拒绝投票,但我认为您的代码是错误的,您需要使用“&lt; br>”而不是“ <br>”,因为<是保留符号,所以它将不起作用。
JPM 2014年

<br><u><b><i>标签被允许在字符串资源没有逃逸,并正确应用TextView.setText(resId)。如果使用Context.getString(resId),则将它们剥离,除非将其包装在一CDATA节中。
皮埃尔·卢克(Paul-Luc Paour)

16

这对我有用,也许有人会发现这个帮助:

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

11

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


不,那没有用。它与Html.fromHtml()和字符串资源有关系吗?
dropOfJupiter 2011年

@dropsOfJupiter:您是否看过Html.fromHtml()调用返回的内容?我很好奇将其分配给String并在调试器中查看它。
slund 2011年



8

非常简单:使用“ \ n”

    String aString1 = "abcd";
    String aString2 = "1234";
    mSomeTextView.setText(aString1 + "\n" + aString2);

\ n对应于ASCII字符0xA,即'LF'或换行符

\ r对应于ASCII char 0xD,即'CR'或回车

这可以追溯到最早的打字机,在这里您可以选择仅换行(仅在行下方键入),或者换行+回车符(也移至行的开头)

在Android / java上,\ n对应于回车+换行符,否则您将“覆盖”同一行


6

尝试仔细检查您的本地化。可能,您尝试编辑一个文件(本地化),但实际上使用另一个文件进行编程,就像在我的案例中一样。当我尝试编辑英语本地化时,默认的系统语言是俄语。

就我而言,可行的解决方案是使用“ \ n”作为行分隔符:

    <string name="string_one">line one.
    \nline two;
    \nline three.</string>

4

您也可以添加"&lt;br&#47;&gt;"而不是\ n。

它是<br/>的HTML转义代码

然后可以将文本添加到TexView:

articleTextView.setText(Html.fromHtml(textForTextView));

nea,别这样。Android实际上会打印出无意义的内容。我试过了。它在HTML中效果很好,但在这里效果不佳,特别是当您在做Html.fromHTML(“我的xml文件中的字符串”)时
dropOfJupiter 2011年

@drops-别忘了toString ==> Html.fromHtml(textForTextView).toString()---然后您可以做:articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());--------换句话说,<br/>直接在内部使用fromHtml()
Peter Ajtai

&lt;br/>应该足以确保不删除样式信息。(基于官方文档)
jpmcosta 2013年

3

您还可以使用Android Studio的String-Editor,它会自动生成线路制动和类似的内容...


2

由于Html.fromHtml弃用我只是我用这个代码下一行获得String2的。

textView.setText(fromHtml("String1 <br/> String2"));

@SuppressWarnings("deprecation")
    public static Spanned fromHtml(String html){
        Spanned result;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);
        } else {
            result = Html.fromHtml(html);
        }
        return result;
    }

2

最简单的方法是转到值/字符串(在您的资源文件夹中)

在此处声明一个字符串:

    <string name="example_string">Line 1\Line2\Line n</string>

在您的特定xml文件中,只需调用类似

    <TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/example_string" />

1

我找到了另一种方法:必须添加“ android:maxWidth =“ 40dp” “属性。当然,它可能无法完美运行,但会导致换行。


1

\ n不是为我工作。我可以通过将xml更改为text并构建如下的textview text属性来解决此问题。

android:text="Line 1
Line 2
Line 3

DoubleSpace"

希望这对那些说\ n不适用于他们的人有所帮助。


我不认为这是一个好的解决方案。那里只有隐藏的\n字符。
Almo's

1

我正在从文件中读取文本,因此我采取了略有不同的方法,因为在文件中添加\ n会导致\ n出现在文本中。

    final TextView textView = (TextView) findViewById(R.id.warm_up_view);
    StringBuilder sb = new StringBuilder();
    Scanner scanner = new Scanner(getResources().openRawResource(R.raw.warm_up_file));
    while (scanner.hasNextLine()) {
      sb.append(scanner.nextLine());
      sb.append("\n");
    }

    textView.setText(sb.toString());

0

也许您可以将lf放入文本中,但它不会显示?确保控件有足够的高度。例如:

正确:

android:layout_height="wrap_content"

可能是错误的:

android:layout_height="10dp"


0

试试这个:

         TextView calloutContent = new TextView(getApplicationContext());
         calloutContent.setTextColor(Color.BLACK);
         calloutContent.setSingleLine(false);
         calloutContent.setLines(2);
         calloutContent.setText(" line 1" + System.getProperty ("line.separator")+"  line2" );

0

使用这样的文本分隔符(\ n):

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

0

我觉得需要一个更完整的答案来描述它如何更彻底地工作。

首先,如果您需要高级格式设置,请查看有关如何在字符串资源中使用HTML的手册。
然后,您可以使用<br/>,等等。但是,这需要使用代码设置文本。

如果只是纯文本,则有许多方法可以在静态字符串资源中转义换行符(LF)。

将字符串用双引号引起来

最干净的方法是用双引号将字符串引起来。
这将使空白完全按照其显示方式进行解释,而不是折叠。
然后,您可以在此方法中正常使用换行符(不使用缩进)。

<string name="str1">"Line 1.
Line 2.
Line 3."</string>

请注意,在此模式下,某些字符需要特殊转义(例如\")。

下面的转义序列也可以在引用模式下工作。

在XML中使用单行表示多行字符串时

逃脱XML中换行符的最优雅方法是使用其XML / HTML实体&#xA;或来使用其代码点(十六进制为10或0xA)&#10;。这是转义任何字符的XML方法
但是,这似乎仅在引用模式下有效。

\n在我看来,另一种方法是简单地使用,尽管它会对可读性产生负面影响(因为它不是XML中的特殊转义序列,所以Android Studio不会突出显示它)。

<string name="str1">"Line 1.&#xA;Line 2.&#10;Line 3."</string>
<string name="str1">"Line 1.\nLine 2.\nLine 3."</string>
<string name="str1">Line 1.\nLine 2.\nLine 3.</string>

在这些转义序列中的任何一个之后,请勿包含换行符或任何空格,因为这将被解释为多余的空格。

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.