我有一个 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
?
你需要的是
String message = serverResponse.getMessage().replaceAll("\\\\n", "\n");
为什么需要四个反斜杠?
因为在Java中反斜杠
\
是转义字符。如果你想在 Java 字符串中使用单个反斜杠文字,你必须将其转义并使用 \\
但是,
replaceAll
方法需要正则表达式,其中反斜杠又是转义字符,因此您也需要对其进行转义。
基本上,在上面的代码中,Java 字符串解析器将首先将这四个反斜杠转换为两个
\\\\ -> \\
,然后正则表达式解析器会将剩余的两个反斜杠解释为单个反斜杠文字。
我相信您应该能够通过执行以下操作来完成。
// 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 字符(项目符号、星号等)、着色和/或粗体/斜体!我经常使用它来格式化我向用户显示的 TextView 中的文本。不明白为什么它不能与 SnackBars 一起使用!
支持设计库将强制
Snackbar
仅使用 2 条线。 这与最大尺寸约为 80dp 相关。
您的解决方案应该有效,并且是正确的。在 Toast 中尝试一下以进行快速测试。它将按您的预期工作。您可以做的另一个测试是去掉其中一个
\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
行数的属性。 完全不推荐。此名称可能会更改,恕不另行通知,并会破坏您的 UI<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
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();
strings.xml:
<string name="br">\n</string>
小吃店:
"Your request has been sent.." + getResources().getString(R.string.br)
StringBuilder strAppend = new StringBuilder();
strAppend.append("\n");
String newString = oldString.replace("\\n", strAppend);
Log.d(TAG, "new: " + newString );