我有一个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"));
但它显示如下
如果我添加string.xml
资源文件并使用getString(R.string.message)
,则\n
正常工作,同样的消息。如何从此响应字符串中获取新行?
我尝试将\n
与服务器响应中的<new_line>
等其他字符进行更改,但replaceAll
工作正常。问题仅出在响应消息中\n
。有没有办法解析\n
?
答案 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);
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);