如何将字符“\ n”替换为android中的新行

时间:2015-12-22 14:00:25

标签: android string escaping replaceall

我有一个API请求的服务器响应,如下所示。

Success! Your request has been sent.\n\nWe’ll inform you once it is done.

我需要在Snackbar中显示此消息。我需要在此响应中的\n位置添加新行。我尝试使用replaceAll之类的

String message = (serverResponse.getMessage()).replaceAll("\\n", System.getProperty("line.separator"));

但它显示如下

enter image description here

如果我添加string.xml资源文件并使用getString(R.string.message),则\n正常工作,同样的消息。如何从此响应字符串中获取新行?

我尝试将\n与服务器响应中的<new_line>等其他字符进行更改,但replaceAll工作正常。问题仅出在响应消息中\n。有没有办法解析\n

6 个答案:

答案 0 :(得分:6)

您需要的是

String message = serverResponse.getMessage().replaceAll("\\\\n", "\n");

为什么需要四个反斜杠?

因为在Java中反斜杠\是转义字符。如果你想在Java字符串中有单个反斜杠文字,你必须将其转义并使用\\

但是,replaceAll方法需要regex表达式,其中反斜杠是转义字符,所以你也需要转义它。

基本上,在上面的代码中,Java字符串解析器将首先将这四个反斜杠转换为两个\\\\ -> \\,然后正则表达式解析器将剩余的两个反斜杠解释为单个反斜杠文字。

答案 1 :(得分:3)

我相信你应该通过以下方式来完成。

// Replace "\n" with "<br>"
String message = (serverResponse.getMessage()).replaceAll("\\n", "<br>");

// Now set SnackBar text using HTML
mSnackBar.setText(HTML.fromHTML(message)) 

使用HTML.fromtHTML(String),您应该能够保留任何格式,例如中断,ASCII HTML字符(项目符号,星形等),着色和/或粗体/斜体!我经常使用它来格式化我向用户显示的TextViews中的文本。不明白为什么它不能与SnackBars一起使用!

答案 2 :(得分:2)

支持设计库只会为Snackbar强制使用2行。这相当于最大80dp的大小。

您的解决方案应该有效,并且是正确的。在吐司中试一试,以便进行快速测试。它会像你期望的那样工作。您可以做的另一个测试是摆脱\n中的一个,然后它可能会正确显示;但是,您还可以选择其他一些选项。同样,这些只是测试。请查看下面的一些真实解决方案!

解决方案

  • \n文字中删除所有Snackbar。这可能是最好的解决方案,因为它可以使您的设计保持尽可能接近材料。 强烈推荐

  • 您可以从TextView获取实际Snackbar,并修改其最大行数

  

View sbv = snackbar.getView(); TextView tv = (TextView) sbv.findViewById(android.support.design.R.id.snackbar_text); tv.setMaxLines(5);

  • 在XML中,您可以修改影响设计库Snackbar行数的属性。 根本不推荐。此名称如有更改,恕不另行通知,并且会破坏您的用户界面
  

<integer name="design_snackbar_text_max_lines">5</integer>

修改

如果您有权修改服务器响应的内容,那么我强烈建议您修改返回的服务器响应,以使用户更简洁。您当前的消息并不简洁,用户使用时间超过了阅读时间。

将其改为此..

  

Request sent! You will be informed shortly.

如果可以,我会为Request找到更好的作品。例如,如果他们订购披萨并发送了请求,那么您应该说Order sent! ...。此外,您可能需要修改shortly以更准确地了解用户可以期望的内容。不久,对我来说,意味着我最迟应该在一小时内得到一些东西。

无论如何,请查看此文档。强烈建议在Android上编写样式。 https://www.google.com/design/spec/style/writing.html#writing-language 资料来源:Android Multiline Snackbar

答案 3 :(得分:0)

 Snackbar snackbar =  Snackbar.make(ref_id, "Success! Your request has been sent.\n\nWe’ll inform you once it is done.",
                Snackbar.LENGTH_LONG).setDuration(Snackbar.LENGTH_LONG);
        View snackbarView = snackbar.getView();

        TextView tv= (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);

        tv.setMaxLines(3);

        snackbar.show();

答案 4 :(得分:0)

这个怎么样,Jrd。

strings.xml:

<string name="br">\n</string>

snackbar:

"Your request has been sent.." + getResources().getString(R.string.br)

答案 5 :(得分:0)

StringBuilder strAppend = new StringBuilder(); strAppend.append(“ \ n”);

String newString = oldString.replace(“ \ n”,strAppend);

Log.d(TAG,“ new:” + newString);