В уведомлениях можно отображать степень завершения (прогресс) той или иной операции.
Самый простой способ это реализовать использовать метод setProgress объекта NotificationBuilder. Это метод принимает три параметра: максимальное значение «прогресса» (при значении 0 ProgressBar в уведомлении не отображается (это используется для того, чтобы его скрыть)), текущее значение «прогресса» и отображение ProgressBar в режиме Indeterminate (когда «прогресс» отображается без указания степени завершения).
Ниже приведён пример, в котором эмулируется выполнение некоторой операции с отображением степени её завершения. Изначально уведомление инициализируется с ProgressBar в режиме Indeterminate.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// Инициализируем уведомление с ProgressBar в режиме Indeterminate builder .setSmallIcon(R.drawable.ic_launcher_foreground) .setContentTitle("Test progress bar notification") .setContentText("Test") .setProgress(100, 0, true) var notification: Notification = builder.build(); notificationManager.notify(NOTIFY_ID, notification) Thread(Runnable { try { TimeUnit.SECONDS.sleep(3) } catch (e: InterruptedException) { e.printStackTrace() } var progress = 0 // Эмулируем "прогресс" некоторой операции while (progress < max) { try { TimeUnit.MILLISECONDS.sleep(300) } catch (e: InterruptedException) { e.printStackTrace() } progress += 10 // Показ уведомления с текущим прогрессом builder.setProgress(max, progress, false) .setContentText("$progress of $max") notificationManager.notify(NOTIFY_ID, builder.build()) } // Показ уведомления о завершении операции уже без ProgressBar builder.setProgress(0, 10, false) .setContentText("Completed") notificationManager.notify(NOTIFY_ID, builder.build()) }).start() |
Работа данного кода наглядно показана на видео:
К сожалению, данный приём не работает, если для уведомления используется собственный макет. В этом случае необходимо самостоятельно добавить ProgressBar в вёрстку и самостоятельно управлять его отображением.
Ниже приведён пример макета уведомления с ProgressBar. За его основу взят пример, рассмотренный нами ранее в [1].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=https://schemas.android.com/apk/res/android xmlns:app=https://schemas.android.com/apk/res-auto xmlns:tools=https://schemas.android.com/tools android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> <TextView android:id="@+id/textViewNotification" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:text="@string/custom_notify_test" app:layout_constraintTop_toTopOf="parent" /> <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" /> <Button android:id="@+id/notify_btn" android:layout_width="128dp" android:layout_height="38dp" android:layout_gravity="right" android:layout_marginTop="16dp" android:layout_marginEnd="8dp" android:text="@string/ok" /> </LinearLayout> |
Далее приведён уже показанный выше пример, после его доработки для использования с нестандартным макетом уведомления.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
val max: Int = 100; val notificationLayout = RemoteViews(packageName, R.layout.custom_notification_layout) notificationLayout.setTextViewText(R.id.textViewNotification, "TEST 2") notificationLayout.setOnClickPendingIntent(R.id.notify_btn, contentIntent) // Устанавливаем начальное состояние ProgressBar на стадии подключения макета. notificationLayout.setProgressBar(R.id.progressBar1,max,0,true) val builder = Notification.Builder(this, CHANEL_ID) builder .setContentIntent(contentIntent) .setSmallIcon(R.drawable.ic_launcher_foreground) .setStyle(Notification.DecoratedCustomViewStyle()) .setCustomContentView(notificationLayout) var notification: Notification = builder.build(); notificationManager.notify(NOTIFY_ID, notification) Thread(Runnable { try { TimeUnit.SECONDS.sleep(3) } catch (e: InterruptedException) { e.printStackTrace() } var progress = 0 // Эмулируем "прогресс" некоторой операции while (progress < max) { try { TimeUnit.MILLISECONDS.sleep(300) } catch (e: InterruptedException) { e.printStackTrace() } progress += 10 // Показ уведомления с текущим прогрессом notificationLayout.setTextViewText(R.id.textViewNotification, "$progress of $max") notificationLayout.setProgressBar(R.id.progressBar1,max,progress,false) notificationManager.notify(NOTIFY_ID, builder.build()) } // Показ уведомления о завершении операции уже без ProgressBar notificationLayout.setTextViewText(R.id.textViewNotification, "Completed") // Скрываем ProgressBar notificationLayout.setViewVisibility(R.id.progressBar1, View.GONE) notificationManager.notify(NOTIFY_ID, builder.build()) }).start() |
Наглядно работа данного примера также проиллюстрирована на видео:
В данной статье мы не рассматриваем общие вопросы работы с уведомлениями, так как они достаточно подробно описаны в предыдущих статьях (в частности, в [1]).
Данная статья завершает цикл, посвящённый уведомлениям в Android. Следующие статьи будут посвящены другой тематике.
Добавить комментарий