Android custom notification layout

Полный список

Android предоставляет нам возможность самим создать layout для уведомлений.

Рассмотрим простой пример:

Высота 64dp — стандартная высота уведомления.

Будем показывать только TextView. Рекомендуется использовать @style/TextAppearance.Compat.Notification.* стили, чтобы ваш текст корректно отображался на любой версии Android.

Код билдера уведомления выглядит так:

Создаем RemoteViews из layout файла.

Методом setTextViewText помещаем текст в View c >

А методом setOnClickPendingIntent указываем PendingIntent, который будет вызван при нажатии на View с В нашем примере root — это корневой LinearLayout. Соответственно при нажатии на уведомление, будет использован этот PendingIntent, чтобы запустить Activity/Service/BroadcastReceiver.

В билдере остается необходимость указать иконку, которая будет видна в области уведомлений. А вот методы setContentTitle и setContentText не нужны. Вместо них используем setContent и передаем туда созданный RemoteViews.

В результате увидим свое уведомление

Для сравнения рядом отображено стандартное уведомление.

Есть еще один, более новый, способ создания кастомного уведомления — использование стиля DecoratedCustomViewStyle.

Отличие от старого способа в том, что мы вызываем метод setCustomContentView, а не setContent, и используем стиль DecoratedCustomViewStyle.

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

Использование DecoratedCustomViewStyle дает нам возможность кастомизировать и расширенное уведомление.

Здесь мы кастомизируем и обычный вид уведомления (setCustomContentView) и расширенный (setCustomBigContentView).

Высота layout расширенного уведомления должна быть не больше 256dp.

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Android: Notifications with Custom Layout

In the previous entries, I have managed to display a notification and make it sticky. Now, since the app I’m developing is supposed to be visible mainly through this notification, I wanted to see if I can customise the actual content. Yes, I know there are options by default, like:

  • Small and large notifications
  • Add some buttons to perform actions

However, I wanted to see if I can, for example, add some icons and buttons like Sonos notification does:

It turns out that, with a bit of work and an OS Jelly Bean or better, anything is possible!

Most for the NotificationBuilder code for custom notification is the same as the other ones:

Now, the builder is prepared to receive the custom layout. To make it compatible with devices pre-JellyBean, you need to do something like this:

Читайте также:  День рождения системы андроид

The custom content is set (as seen above) with builder.setContent(RemoteViews views). Now all we have to do is to build the remote view.

For the purpose of this exercise, custom layout is designed to have an image, a larger and a smaller text underneath, just like the default notification:

The RemoteViews creation code is:

Once the view object is created, we can set the various components programmatically (e.g. content from an Intent):

Voila! the builder is now complete and we can show the notification as in the previous posts.

Источник

Notifications на основе билдера с кастомным лейаутом и картинкой

Балуюсь разработками приложений под Android, но до сих пор не использовал Builder для создания уведомлений, а делал это старым добрым методом, как описано, например, в данной статье. Однако данный метод не только уже устарел, но даже больше — он является deprecated. Кроме того, передо мной еще стояла задача выводить в каждом Notification-е свою картинку, которой при том нет в составе проекта и я не могу на нее сослаться через R.drawable, как, например, аватарка пользователя, которого я добавляю в процессе использования приложения и т.п. Если интересно — добро пожаловать под кат.

Builder для создания Notifications введен с АОС 3.0 и если минимальный уровень SDK для приложения ниже, как в моем случае, то необходимо использовать библиотеку совместимости v4, т.к. я использую для разработки AndroidStudio, то включение библиотеки в состав проекта состоит в добавлении ее в build.gradle в раздел зависимостей:

Тот, кто использует для разработки старый добрый Eclipse может найти соответствующую jar-ку в папке, где установлен Android SDK в папке /extras/android/support/v4/ и копирнуть ее в папку libs своего проекта.

Собственно для создания уведомлений я написал небольшой класс-хелпер — NotificationHelper. Обычно такого рода классы я наполняю public static методами, а если внутри требуется ссылка на Context, то инициализирую такой хелпер из класса Application, используя Context самого приложения, т.е. Application Context. Хранить данный контекст абсолютно безопасно даже в статик-поле, в отличии от того, который Activity — этот хранить в статиках нельзя, во избежание утечек, короче говоря, Activity Context (он же — Base Context) предпочитаю вообще нигде никогда не хранить. Итого NotificationHelper выглядит так:

Т.к. в методе инициализации я прописал appContext = context.getApplicationContext(), то инициализировать этот хелпер можно откуда угодно, главное чтобы был доступ к контексту, можно даже в активити передав саму активити в качестве параметра.

Метод, используемый для создания обычного, стандартного уведомления я создал такой:

Вызывается этот метод, например, из активити, так:

Это обычное стандартное уведомление. В принципе так как у меня во всех приложениях иконка приложения всегда называется именно ic_launcher, а не как-то еще, то данный хелпер универсален для меня. Т.е. его без изменений можно включать в состав любого приложения, где это требуется.

Читайте также:  Глаз да винчи для андроид

А вот вариант с картинкой, которой нет в составе проекта, как я уже отмечал выше, уже не получится сделать столь же универсальным, т.к. к нему требуется layout в придачу. Именно этот layout и дает возможность вывести что угодно, с него и начну, пожалуй (notification_layout.xml):

Думаю тут все ясно из самих наименований id-шек:
notification_image — место под аватарку
notification_message — место для отображения текста уведомления.

И собственно метод создания уведомления с картинкой, загруженной приложением во время работы:

Вызывается этот метод, например, из активити, так:

Собственно, вот и все. Ну почти…
Все же остаются ньюансы, например, если приложение состоит из нескольких активити, то тупо запускать определенную активити через уведомление — несовсем правильно. Ведь, во-первых, эта активити может как раз быть открыта в приложении, и таким образом через уведомление такая активити запустится еще раз. Это можно обойти, указав в манифесте для такой активити следующий флаг типа запуска:

Но это для исключения повторного запуска активной (topmost) активити, т.е. если активити запущена (в стеке), но «накрыта» какой-то еще, то способ не поможет. Можно попробовать подобрать еще какой-то из возможных параметров типа запуска.
А что делать, если приложение не запущено? Ведь нельзя же взять и запустить отдельную активити, которая обычно в приложении запускается по цепочке через другие активити, и ее нельзя запускать отдельно от других, да и выход из нее повлечет выход из приложения, вместо ожидаемого пользователем возврата на предыдущий «экран». А если в приложении стартовая активити — онлайн авторизация, что является обязательным условием для продолжения работы приложения, что тогда? Получится что запустим какую-то активити, минуя авторизацию, а это может привести к непредсказуемым последствиям. Можно ограничиться вызовом основной, стартовой активити из уведомления, но опять же, это хорошо, когда приложение не запущено, но когда пользователь уже в приложении, то к чему ему повторная авторизация? Здесь поможет разве что полезная нагрузка уведомления, т.е. передача в нем Bundle с некими параметрами.

Лично решил это следующим образом: создал активити-заглушку NotificationActivity, которая и вызывается из уведомления, при этом в бандл уведомления закидываю ту активити, что мне реально надо запустить, в NotificationActivity проверяю условия и выполняю соответствующие необходимые действия:

Здесь я комментировал вызовы метода isActivityRunning(), т.к. это требует еще одного разрешения в манифесте. Кому это некритично, тот спокойно может удалить вызов статического метода до комментария, и раскомментировать вызов этого метода. Я же решил, что лучше мансов с манифестом избежать и потому написал статические методы в обе активити:

Изменения, которые для этого потребовалось внести в хелпер уведомлений (в оба метода createNotification()):

Источник

Android Custom Notification Tutorial

Last Updated: May 19, 2013

In this tutorial, you will learn how to create Custom Notifications in your Android application. A notification is a message you can display to the user outside of your Android application. Notifications can be clicked to perform an action or to open a new activity. We will be creating a custom notification and a simple notification and on notification click will show results on a new activity. So lets begin…

Читайте также:  Android gadget cdc driver что это

Create a new project in Eclipse File > New > Android Application Project. Fill in the details and name your project NotificationTutorial.

Application Name : NotificationTutorial

Project Name : NotificationTutorial

Package Name : com.androidbegin.notificationtutorial

Open your MainActivity.java and paste the following code.

MainActivity.java

We have created two buttons in this application, the first button will show a simple notification and the other will show a custom notification. Both notifications are created using NotificationCompat.Builder. Using NotificationCompat.Builder allows you to build your application below Android Version 4.1. A PendingIntent allows notifications to be clicked or to open a new activity. We have prepared a sample custom notification image for this tutorial. Put your downloaded sample images into your res > drawable-hdpi.

Sample Image

[wpfilebase tag=file tpl=download-button /]

Next, create an XML file graphical layout for your MainActivity. Go to res > layout > Right Click on layout > New > Android XML File
Name your new XML file notificationmain.xml and paste the following code.

notificationmain.xml

Output:

Next, create an XML graphical layout for your Custom Notification. Go to res > layout > Right Click on layout > New > Android XML File
Name your new XML file customnotification.xml and paste the following code.

customnotification.xml

Next, create an activity to view notification click results. Go to File > New > Class and name it NotificationView.java. Select your package named com.androidbegin.notificationtutorial and click Finish.

Open your NotificationView.java and paste the following code.

NotificationView.java

Next, create an XML graphical layout for your NotificationView. Go to res > layout > Right Click on layout > New > Android XML File
Name your new XML file notificationview.xml and paste the following code.

notificationview.xml

Change the application name and texts in strings.xml. Open your strings.xml and paste the following code. Go to res > values > strings.xml

strings.xml

In your AndroidManifest.xml, we need to declare an activity. Open your AndroidManifest.xml and paste the following code.

AndroidManifest.xml

Output:

Source Code

[purchase_link text=”Purchase to Download Source Code” style=”button” color=”green”]

Latest comments

by adding action like this custom notification donot show title and text:Intent stopreciver = new Intent(); stopreciver.setAction(«STOP_ACTION»); PendingIntent pendingIntentYes2 = PendingIntent.getBroadcast(this, 12345, stopreciver, PendingIntent.FLAG_UPDATE_CURRENT); builder.addAction(R.drawable.androidhappy, getResources().getString(R.string.app_name), pendingIntentYes2);

Android Custom Notification Tutorial

I take the same code but add action dosen’t work i dont either see the button

Android Custom Notification Tutorial

i want to create custom notification like youtube video download. with progress bar. can you please help?

Android Custom Notification Tutorial

Why doesn’t the notification stay on the tray. on Android 5.1.1 and up? You have to make it .setOngoing(true) to stay but then it will not swipe dismiss. Any clue as to why this is happening?

Источник

Оцените статью