我尝试实现可扩展的通知,并且为此使用了InboxStyle。
基于documentation的以下图片:
应该可以为文本设置样式。在这种情况下,请将“Google Play”设为粗体。
InboxStyle只有addLine()
,可以在其中传递CharSequence。我尝试使用Html.fromHtml()
并使用了一些html格式,但无法成功。
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.setBigContentTitle("title");
inboxStyle.setSummaryText("summarytext");
// fetch push messages
synchronized (mPushMessages) {
HashMap<String, PushMessage> messages = mPushMessages.get(key);
if (messages != null) {
for (Entry<String, PushMessage> msg : messages.entrySet()) {
inboxStyle.addLine(Html.fromHtml("at least <b>one word</b> should be bold!");
}
builder.setStyle(inboxStyle);
builder.setNumber(messages.size());
}
}
关于这个有什么想法吗?
最佳答案
您不需要使用fromHtml
。过去,我在使用fromHtml
时遇到过问题(当您显示的内容来自用户时,代码注入(inject)可能会导致难看的事情)。另外,我不喜欢将格式设置元素放在strings.xml
中(如果您使用服务进行翻译,则它们可能会破坏您的HTML标签)。
作为大多数在通知中设置文本的方法(addLine
,setTicker
,setContentInfo
等),setContentTitle
方法将CharSequence
作为参数。
因此,您可以传递Spannable
。假设您要“粗体此并以斜体表示。”,则可以通过以下方式设置其格式(当然不要对位置进行硬编码):
Spannable sb = new SpannableString("Bold this and italic that.");
sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 14, 20, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
inboxStyle.addLine(sb);
现在,如果您需要使用本地化字符串动态构建字符串,例如“今天是 [DAY] ,早上好!”,请将带有占位符的字符串放入
strings.xml
中:<string name="notification_line_format">Today is %1$s, good morning!</string>
然后以这种方式格式化:
String today = "Sunday";
String lineFormat = context.getString(R.string.notification_line_format);
int lineParamStartPos = lineFormat.indexOf("%1$s");
if (lineParamStartPos < 0) {
throw new InvalidParameterException("Something's wrong with your string! LINT could have caught that.");
}
String lineFormatted = context.getString(R.string.notification_line_format, today);
Spannable sb = new SpannableString(lineFormatted);
sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), lineParamStartPos, lineParamStartPos + today.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
inboxStyle.addLine(sb);
您将得到“今天是,星期天,早上好!”,据我所知,它适用于所有版本的Android。