Уведомление о стилизации InboxStyle
Я пытаюсь реализовать расширяемое уведомление, и я использовал InboxStyle для этого.
На основе следующего изображения из документации:
![inboxstyle notification]()
должно быть возможно стилизовать текст. В этом случае сделайте "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());
}
}
Есть ли идеи об этом?
Ответы
Ответ 1
Вам не нужно использовать fromHtml
. У меня были проблемы с fromHtml
в прошлом (когда то, что вы показываете, поступает от пользователя, инъекция кода может привести к уродливым вещам). Кроме того, мне не нравится размещать элементы форматирования в 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);
Теперь, если вам нужно динамически строить строки с локализованными строками, например "Сегодня [ДЕНЬ], доброе утро!", поместите строку с заполнителем в 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 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.
Ответ 2
Ваш код работал как шарм на моем Samsung S3 с Android 4.1.1 на нем. Какую версию Android вы используете?
import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.text.Html;
import android.view.Menu;
public class MainActivity extends Activity {
private final int ID = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
this).setSmallIcon(R.drawable.ic_launcher);
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.addLine(Html
.fromHtml("<i>italic</i> <b>bold</b> text works"));
mBuilder.setStyle(inboxStyle);
mBuilder.setNumber(1);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(ID, mBuilder.build());
}
}
Ответ 3
Я сделал для этого вспомогательный метод:
private final StyleSpan mBoldSpan = new StyleSpan(Typeface.BOLD);
private SpannableString makeNotificationLine(String title, String text) {
final SpannableString spannableString;
if (title != null && title.length() > 0) {
spannableString = new SpannableString(String.format("%s %s", title, text));
spannableString.setSpan(mBoldSpan, 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
spannableString = new SpannableString(text);
}
return spannableString;
}
Используйте это:
inboxStyle.addLine(makeNotificationLine("UserXYZ", "How are you?"));
Ответ 4
Вот самое простое решение
Он не использует InboxStyle
, потому что мне это не нужно в моем случае
CharSequence boldUsernameMessage = Html.fromHtml("<b>@" + username +"</b> " + message);
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext())
.setContentText(boldUsernameMessage)
.setStyle(new NotificationCompat.BigTextStyle().bigText(boldUsernameMessage)) // Makes it expandable to show the message
.build();
Результат
![введите описание изображения здесь]()
Ответ 5
Для жирного текста вы должны использовать тег <strong>
. В коде нет ничего плохого. Просто измените <b>
на <strong>
.
Изменить:
Вы должны изменить свой код на это:
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 <strong>one word</strong> should be bold!");
}
builder.setStyle(inboxStyle);
builder.setNumber(messages.size());
}
}