Android文本视图不支持换行

22

我正在通过编程方式创建一个自定义视图,用于显示从XML文件解析出的文本。这段文本很长,并且包含“/n”字符以强制换行。但是,某种原因导致文本视图将/n显示出来,而没有任何换行符。以下是我的代码:

                    // get the first section body
                    Object body1 = tempDict.get("FIRE");
                    String fireText = body1.toString();

                    // create the section body
                    TextView fireBody = new TextView(getActivity());
                    fireBody.setTextColor(getResources().getColor(R.color.black));
                    fireBody.setText(fireText);
                    fireBody.setTextSize(14);
                    fireBody.setSingleLine(false);
                    fireBody.setMaxLines(20);
                    fireBody.setBackgroundColor(getResources().getColor(R.color.white));

                    // set the margins and add to view
                    layoutParams.setMargins(10, 0, 10, 0);
                    childView.addView(fireBody,layoutParams);

XML文件中的文本如下:

Now is the time /n for all good men to /n come to the aid of their /n party
它应该显示如下;
Now is the time
for all good men to
come to the aid of their
party

我是否遗漏了某些设置?

更新

\r\n 如果我将其硬编码到视图中,它可以正常工作。例如:

String fireText = "Now is the time \r\n for all good men \r\n to come to the aid";

如果我硬编码,实际上 "\n" 也可以工作:

String fireText = "Line one\nLine two\nLine three";

顺便提一下

System.getProperty("line.separator");

这将返回一个字符串"/n",因此无需转换为"/r/n"。

不幸的是,我的数据源来自解析并存储在哈希映射表中的XML文件。我尝试了以下方法:

String fireText = body1.toString().replaceAll("\n", "\r\n");

\n未被替换为\r\n。这可能是因为我正在将对象转换为字符串吗?


8
换行符应该是 \n 而不是 /n。 - azgolfer
抱歉,这是我的笔误。我的 XML 文件中原始文本为 \n。 - wyoskibum
7个回答

56

我遇到了完全相同的问题,解决方案很简单。

你可以思考一下,由于TextView小部件使用文字表示为"\n"值,则给定的字符串必须像"\\n"这样存储每个"\n"。因此,当读取和存储XML字符串时,所有"\n"的出现都被转义以保留该文本作为字面文本。

总之,你只需要:

fireBody.setText(fireText.replace("\\n", "\n"));

对我有效!


谢谢回复。那正是我最终想出的解决方案。 - wyoskibum
2
replaceAll() 的第一个参数使用正则表达式,而 replace() 使用普通字符串。 - Tano
我使用了replaceAll(),卡在那里大约两天。你真的节省了我的时间。 - klaudiusnaban

5

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

string = string.replace("\\\n", System.getProperty("line.separator"));

1) 使用replace方法需要过滤转义的换行符(例如 '\\n')

2) 只有这样,每个换行符 '\n' 转义字符的实例才会被呈现为实际的换行符

对于这个示例,我使用了一个带有JSON格式数据的Google应用脚本noSQL数据库(ScriptDb)。

干杯:D


完美,正是我所需要的。我使用了string = string.replaceAll("\n", "<br />");但不起作用,而你的解决方案完美地运行。 - Muklas
奇怪...其他解决方案都不起作用,但这个对我们有效。 - Manan Shah

4

要换行,您可以在xml布局中使用set text view来实现。

现在是所有好人都应该支援他们党派的时候了 \r\n


感谢您的回复。如果我硬编码文本,\r\n可以工作。即:fireBody="现在是时候\r\n所有好人来援助他们的党\r\n"但是,我的文本源自我解析为哈希映射的XML文件,只有\n。我尝试过:String fireText = body1.toString().replaceAll("\n", "\r\n");但是我的文本视图仍然显示带有\r\n的文本,并且没有换行符。 - wyoskibum
1
另外,您可以使用 <br> 代替 \n。然后,您可以将文本添加到 TexView:articleTextView.setText(Html.fromHtml(textForTextView)); - Md Abdul Gafur

3
我也遇到了这个问题,但我找到了一个非常简单的解决方案。如果从XML资源设置文本(我知道这与OP不同,但值得知道),就无需手动添加换行符,只需按原样添加文本,但要用引号括起来。
<string name="test_string">"1. First
2. Second Line
3. Third Line"</string>

对于那个踩了这个答案的人...我建议你先尝试一下这个答案...很明显你还没有尝试过,因为它完美地运行! - Corbella
确实有效!尝试了<br>、\n、\r\n、 ,但都没有成功。这是唯一的方法让它工作!那个踩了这个答案的人应该感到羞耻! - Borzh
哇...仅仅这个最简单的解决方案就对我起作用了。 - ask-dev
但是当我将这种带有换行的文本添加到数据库中时,它不起作用。你能帮我吗?@Corbella - Chirag Patel
这并不保证在所有设备上都能正常工作。在某些设备上,换行符仍然会呈现为一些混乱的字符。但在布局编辑器中看起来似乎是可以工作的。 - Yuri Brigance

0

试一下这个

fireBody.setText(Html.fromHtml("testing<br>line<\br>") 

你的服务器需要发送FirstLine<br>lineAfterLineBreak<\br>


谢谢回复。我的数据来自一个XML文件,我需要解析它,如果要转换成HTML格式会比较困难。 - wyoskibum

0

如果你想在TextView的XML中强制换行,你需要使用\r\n而不是仅仅使用\n

因此,现在你的XML代码变成了:

android:text="Now is the time \r\n for all good men to \r\n come to the aid of their \r\n party"

或者如果你想以编程的方式实现,那么在你的Java代码中:

fireBody.setText("Now is the time \r\n for all good men to \r\n come to the aid of their \r\n party");

你也可以将文本声明为字符串资源值,像这样:

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

另一种简单的方法是更改xml文件中TextView的默认属性。
<TextView
    android:id="@+id/tvContent"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:singleLine="false"

/>

然后使用,textView.setText("第一行 \n第二行 \n第三行");


那么,这个怎么样?将要显示的文本作为字符串资源值放入。 - Swayam
<string name="sample_string"><![CDATA[一些测试行1 <br />一些测试行2]]></string> - Swayam
如果您不想使用HTML格式,请查看我编辑后的答案中的代码。 - Swayam
再次感谢您的帮助。我需要显示的文本存储在XML文件中,我将其解析为哈希映射并使用<k,v>检索。我大约有80个记录,每个记录都有9-12个字段的子集要显示。由于数据因记录而异,我正在以编程方式创建textview。如果您查看我的原始帖子,我将singleLine设置为false。我猜测问题与我从XML文件解析和存储在哈希映射中的方式有关。 - wyoskibum
请原谅我的无知,但我好像完全忽略了你代码中的singleLine属性。如果它仍然不起作用,那么我认为可能存在其他问题,也许在解析过程中出现了错误,正如你已经提到的那样。我建议你在SO上发布与解析相关的代码,看看它是否正确。 - Swayam
显示剩余3条评论

-1

我刚刚使用了这个,现在它对我来说很好用。

 message =message.replace("\n","\r\\n");

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