Пользовательские макеты уведомлений и цвета текста

В моем приложении отображаются некоторые уведомления, и в зависимости от пользовательских настроек он может использовать пользовательский макет в уведомлении. Он работает хорошо, но есть небольшая проблема – текстовые цвета . Android Android и почти все шкуры производителя используют черный текст на светлом фоне для текста уведомлений, но Samsung не делает: их раскрывающееся меню имеет темный фон, а текст в макете уведомлений по умолчанию – белый.

Таким образом, это вызывает проблему: уведомления, которые не используют какие-либо причудливые макеты, выглядят отлично, но тот, который использует настраиваемый макет, трудно читать, потому что текст черный, а не белый по умолчанию. Даже официальная документация просто устанавливает цвет #000 для TextView , поэтому я не мог найти там никаких указателей.

Пользователь был достаточно любезен, чтобы снять скриншот проблемы:

Скриншот

Итак, как мне использовать цвет текста уведомления по умолчанию с устройства в моих макетах? Я бы предпочел не начинать динамически изменять цвет текста на основе модели телефона, так как для этого требуется много обновлений, и люди с пользовательскими ПЗУ могут все же получить проблему, в зависимости от используемого ими скина.

    10 Solutions collect form web for “Пользовательские макеты уведомлений и цвета текста”

    Решение Malcolm отлично работает с API> = 9. Вот решение для более старого API:

    Хитрость заключается в создании стандартного объекта уведомления, а затем перемещение по умолчанию contentView созданного Notification.setLatestEventInfo(...) . Когда вы найдете правильный TextView, просто получите tv.getTextColors().getDefaultColor() .

    Вот код, который извлекает цвет текста по умолчанию и размер текста (в пикселях плотности пикселей – sp).

     private Integer notification_text_color = null; private float notification_text_size = 11; private final String COLOR_SEARCH_RECURSE_TIP = "SOME_SAMPLE_TEXT"; private boolean recurseGroup(ViewGroup gp) { final int count = gp.getChildCount(); for (int i = 0; i < count; ++i) { if (gp.getChildAt(i) instanceof TextView) { final TextView text = (TextView) gp.getChildAt(i); final String szText = text.getText().toString(); if (COLOR_SEARCH_RECURSE_TIP.equals(szText)) { notification_text_color = text.getTextColors().getDefaultColor(); notification_text_size = text.getTextSize(); DisplayMetrics metrics = new DisplayMetrics(); WindowManager systemWM = (WindowManager)getSystemService(Context.WINDOW_SERVICE); systemWM.getDefaultDisplay().getMetrics(metrics); notification_text_size /= metrics.scaledDensity; return true; } } else if (gp.getChildAt(i) instanceof ViewGroup) return recurseGroup((ViewGroup) gp.getChildAt(i)); } return false; } private void extractColors() { if (notification_text_color != null) return; try { Notification ntf = new Notification(); ntf.setLatestEventInfo(this, COLOR_SEARCH_RECURSE_TIP, "Utest", null); LinearLayout group = new LinearLayout(this); ViewGroup event = (ViewGroup) ntf.contentView.apply(this, group); recurseGroup(event); group.removeAllViews(); } catch (Exception e) { notification_text_color = android.R.color.black; } } 

    Вызовите extractColors т.е. в onCreate () вашего сервиса. Затем, когда вы создаете настраиваемое уведомление, требуемый цвет и размер текста находятся в notification_text_color и notification_text_size :

     Notification notification = new Notification(); RemoteViews notification_view = new RemoteViews(getPackageName(), R.layout.notification); notification_view.setTextColor(R.id.label, notification_text_color); notification_view.setFloat(R.id.label, "setTextSize", notification_text_size); 

    Решение состоит в использовании встроенных стилей. TextAppearance.StatusBar.EventContent стиль называется TextAppearance.StatusBar.EventContent в Android 2.3 и Android 4.x. В уведомлениях о материалах Android 5.x используется несколько других стилей: TextAppearance.Material.Notification , TextAppearance.Material.Notification.Title и TextAppearance.Material.Notification.Line2 . Просто установите соответствующий текст для текстового вида, и вы получите необходимые цвета.

    Если вас интересует, как я пришел к этому решению, вот мой след сухарей. Выдержки из кода взяты из Android 2.3.

    1. Когда вы используете « Notification и устанавливаете текст с помощью встроенных средств, следующая строка создает макет:

       RemoteViews contentView = new RemoteViews(context.getPackageName(), com.android.internal.R.layout.status_bar_latest_event_content); 
    2. Указанный макет содержит следующий View который отвечает за просмотр текста уведомления:

        
    3. Таким образом, вывод заключается в том, что необходимый стиль – TextAppearance.StatusBar.EventContent , определение которого выглядит так:

        

      Здесь вы должны отметить, что этот стиль фактически не ссылается ни на один из встроенных цветов, поэтому самым безопасным способом является применение этого стиля вместо встроенного цвета.

    И еще: перед Android 2.3 (уровень API 9) не было ни стилей, ни цветов, были только жестко заданные значения. Если вам почему-то приходится поддерживать такие старые версии, см. Ответ Гакса .

    Вот решение для любой версии SDK, используя только ресурсы.

    RES / значения / styles.xml

     < ?xml version="1.0" encoding="utf-8"?>     

    RES / значения-V9 / styles.xml

     < ?xml version="1.0" encoding="utf-8"?>     

    разреш / макет / my_notification.xml

     ...   ... 

    PS: жестко закодированные значения используются для 2.2-. Таким образом, проблемы могут возникать с использованием некоторых редких старых прошивок.

    Для версии 2.3+ (из документации для Android ):

    Используйте стиль android:TextAppearance.StatusBar.EventContent.Title для основного текста.

    Используйте стиль android:TextAppearance.StatusBar.EventContent для вторичного текста.

    Для 2.2- сделайте то, что предложил Гакс в другом ответе на эту тему.

    Если вы хотите скомпилировать 2.2 и поддерживать 2.3+ и поддерживать все различные устройства, решение Gaks является единственным, что я знаю.

    Кстати, что Google предложил использовать значение ?android:attr/textColorPrimary для 2.2-, не работает. Просто попробуйте использовать эмулятор. Путь Гакса – единственный способ.

    Больше ресурсов: это и не работает.

    Вы должны использовать цвета, указанные в файле android.R.color

    Например: android.R.color.primary_text_light

    Разработчики пользовательских ПЗУ и разработчики скинов для Android должны обновлять их, чтобы цвета вашего приложения могли соответствовать остальной системе. Это включает в себя обеспечение правильного отображения текста во всей системе.

    Я нашел очень простое решение, напрямую изменяющее имя атрибута, предоставленного Android.

    Как вы можете видеть в этом уроке: http://www.framentos.com/android-tutorial/2012/02/20/how-to-create-a-custom-notification-on-android/

    Вам нужно использовать другой атрибут:

     ?android:attr/textColorPrimaryInverse 

    Надеюсь, это поможет вам!

    Посмотрите на следующие инструкции: http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView. Если вы настроили свой фоновый цвет для контейнера LinearLayout, вы можете получить свои цвета в уведомлении для текста и фон.

    Если цвет по умолчанию для текста уведомления определяется приложением запуска, вы не можете получить его из настроек по умолчанию для Android, если только пусковая установка не обменивает эту информацию.

    Однако попытаетесь ли вы удалить эту строку android: textColor = “# 000” из вашего макета, чтобы он мог автоматически получать цвет по умолчанию?

    Я использую это в TextView в вопросе:

     style="@style/TextAppearance.Compat.Notification.Title" 

    Это дает мне белый текст, если фон имеет черный и черный текст, если фон белый. И он работает, по крайней мере, еще в 19 API.

    Решение от @Malckom не помогло мне в Lolipop с темным фоном уведомлений из-за TextAppearance.Material.Notification.Title – системный жесткий код. Решение от @grzaks произошло, но с некоторыми изменениями в процессе создания уведомлений:

     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setContentTitle(NOTIFICATION_TITLE_TIP) .setContentText(NOTIFICATION_TEXT_TIP); Notification ntf = mBuilder.build(); // ... if (NOTIFICATION_TEXT_TIP.equals(szText)) { notification_text_color = text.getTextColors().getDefaultColor(); } else { if (NOTIFICATION_TITLE_TIP.equals(szText)) { notification_title_color = text.getTextColors().getDefaultColor(); } } // ... 

    Я знаю, что это старый вопрос, но он может помочь кому-то другому; ) Я делаю это в своем приложении и прекрасно работает в нескольких строках:

      RemoteViews notificationView = new RemoteViews(context.getPackageName(), R.layout.notification_layout); if (SDK >= LOLLIPOP) { TextView textView = new TextView(context); textView.setTextAppearance(context, android.R.style.TextAppearance_Material_Notification_Title); notificationView.setTextColor(R.id.title, textView.getCurrentTextColor()); notificationView.setFloat(R.id.title, "setTextSize", textView.getTextSize()); textView.setTextAppearance(context,android.R.style.TextAppearance_Material_Notification_Line2); notificationView.setTextColor(R.id.contentText,textView.getCurrentTextColor()); notificationView.setFloat(R.id.contentText,"setTextSize",textView.getTextSize()); textView = null; } 
    Interesting Posts

    Дисковод SSD не распознается при установке Windows

    Создание модели и связанных с ней моделей с помощью встроенных форм

    Что такое команда Linux, чтобы узнать информацию об оборудовании?

    Не удается запустить программу Java Android с помощью Valgrind

    Как отключить ссылку на номер телефона в Mobile Safari?

    VideoView getDrawingCache возвращается черным

    Является ли # прагма когда-то безопасным включать охрану?

    Возrotation сгенерированного pdf с использованием пружины MVC

    Получить значение кнопки с помощью jQuery

    Visual Studio 2013 MSVCR110d.dll отсутствует

    Как применить масштабирование, drag and drop и поворот к изображению в Android

    Изменение времени ответа всплывающего окна панели задач

    Excel: как удалить поисковые запросы из ячейки (ссылающийся URL)

    как я могу сделать свой продукт пробной версией в течение 30 дней?

    «Noshell» для пользователей прокси-сервера ssh

    Давайте будем гением компьютера.