我尝试实现可扩展的通知,并且为此使用了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标签)。

作为大多数在通知中设置文本的方法(addLinesetTickersetContentInfo等),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。

10-06 00:05