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 如果我将它硬编码到我的视图中,它就可以工作。IE:

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。可能是因为我正在从一个对象转换为字符串吗?

4

7 回答 7

55

在完全相同的情况下,我一直遇到完全相同的问题。解决方案相当简单。

当您考虑它时,由于 textview 小部件正在显示带有文字“\n”值的文本,因此给出的字符串必须存储每个“\n”,如“\\n”。因此,当您的 XML 字符串被读取和存储时,所有出现的“\n”都会被转义以将该文本保留为文字文本。

无论如何,您需要做的就是:

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

为我工作!

于 2012-09-14T10:47:30.803 回答
5

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

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

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

2) 只有这样每个换行符 '\n' 转义字符的实例才会被渲染到实际的换行符中

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

干杯:D

于 2013-04-29T20:12:51.433 回答
4

对于换行符,您可以通过这种方式在 xml 布局中使用设置文本视图。

现在是\r\n所有好人伸出援手的时候\r\n\r\n

于 2012-07-08T04:46:31.387 回答
3

我也遇到了这个问题,如果从 XML 资源中设置文本,我发现了一个非常简单的解决方案(我知道这与 OP 不同,但值得了解)

无需手动添加换行符,只需添加已引用的文本即可。

<string name="test_string">"1. First
2. Second Line
3. Third Line"</string>
于 2014-06-27T07:27:15.310 回答
0

试试这个

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

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

于 2012-07-08T05:27:48.440 回答
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("First line \nSecond line \nThird line");

于 2012-07-08T05:55:41.737 回答
-1

我只是使用它,现在它对我来说很好

 message =message.replace("\n","\r\\n");
于 2020-10-20T13:35:15.537 回答