Уведомление о стилизации InboxStyle

Я пытаюсь реализовать расширяемое уведомление, и я использовал для этого InboxStyle .

На основе следующего изображения из документации :

Уведомление inboxstyle

Должно быть возможно стилизовать текст. В этом случае сделайте «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()); } } 

Есть идеи об этом?

Solutions Collecting From Web of "Уведомление о стилизации InboxStyle"

Вам не нужно использовать fromHtml . У меня были проблемы с fromHtml в прошлом (когда то, что вы показываете, поступает от пользователя, инъекция кода может привести к уродливым вещам). Кроме того, мне не нравится вставлять элементы форматирования в strings.xml (если вы используете службы для перевода, они могут испортить ваши HTML-теги).

Метод addLine , поскольку большинство методов для установки текста в уведомлениях ( setTicker , setContentInfo , setContentTitle и т. Д.) CharSequence параметр CharSequence .

Таким образом, вы можете пройти Spannable . Предположим, вы хотите, чтобы « Bold this and italic that.», Вы можете отформатировать его таким образом (конечно, не занимать жесткие позиции):

 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.

Ваш код работал как прелесть на моем 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()); } } 

Я сделал для этого вспомогательный метод:

 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?")); 

Вот самое простое решение

Он не использует 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(); 

результат

Введите описание изображения здесь

Для жирного текста вы должны использовать <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()); } }