Найти в Дзене
Потребитель

Минимальный виджет в B4A, дополнение

Небольшая корректировка и дополнение к предыдущей статье на этом же канале «Минимальный виджет в Basic4Android». Ниже — обновлённый текст модуля ресивера. Основная корректировка сводится к тому, что виджет теперь создаётся (вызовом ConfigureHomeWidget) в процедуре Receiver_Receive. Без этого у меня почему-то не получалось корректно обработать события тапов по виджету, и даже вообще программно управлять содержимым виджета. Sub Process_Globals ' Вызывается при инициализации модуля, предназначена для объявления общих переменных модуля. Dim rv As RemoteViews End Sub Private Sub Receiver_Receive (FirstTime As Boolean, StartingIntent As Intent) ' Вызывается каждый раз, когда система посылает широковещательное сообщение (Broadcast) которое зарегистрировано для данного ресивера. Создаем виджет, связываем с layout, обрабатываем события, устанавливаем интервал обновления (0 - не обновлять) и имя виджета. If FirstTime Then rv = ConfigureHomeWidget("Layout", "rv", 0, "Мой Виджет") End If r
Оглавление

Небольшая корректировка и дополнение к предыдущей статье на этом же канале «Минимальный виджет в Basic4Android».

Обработка событий виджета

Ниже — обновлённый текст модуля ресивера. Основная корректировка сводится к тому, что виджет теперь создаётся (вызовом ConfigureHomeWidget) в процедуре Receiver_Receive. Без этого у меня почему-то не получалось корректно обработать события тапов по виджету, и даже вообще программно управлять содержимым виджета.

Sub Process_Globals
' Вызывается при инициализации модуля, предназначена для объявления общих переменных модуля.
Dim rv As RemoteViews
End Sub
Private Sub Receiver_Receive (FirstTime As Boolean, StartingIntent As Intent)
' Вызывается каждый раз, когда система посылает широковещательное сообщение (Broadcast) которое зарегистрировано для данного ресивера. Создаем виджет, связываем с layout, обрабатываем события, устанавливаем интервал обновления (0 - не обновлять) и имя виджета.
If FirstTime Then
rv = ConfigureHomeWidget("Layout", "rv", 0, "Мой Виджет")
End If
rv.HandleWidgetEvents(StartingIntent)
End Sub
Sub rv_RequestUpdate
' Обработка запроса на обновление виджета: после добавления виджета на экран, после перезагрузки устройства, в соответствии с заданным интервалом обновления (если он задан) или после обновления приложения.
rv.UpdateWidget
End Sub
Sub rv_Disabled
' Обработка отключения виджета, когда последний экземпляр нашего виджета удаляется с экрана.
StopService("")
End Sub
Private Sub Label1_Click
rv.SetText("Label1", DateTime.Time(DateTime.Now))
rv.UpdateWidget
End Sub

Добавлен «функционал»: при нажатии на надпись «Привет, widget!» вместо неё появляется текущее время — так работает вызов rv.SetText("Label1", DateTime.Time(DateTime.Now)) в процедуре Label1_Click.

К слову, процедуру Label1_Click (обработчик тапа по надписи виджета) нельзя добавить в код модуля ресивера автоматически из Конструктора макета, так как IDE выдаёт странное сообщение «текущий модуль не поддерживает события макета». Несмотря на это, события вполне нормально обрабатываются, если процедуры обработчиков просто добавлять в модуль вручную.

Чтобы сделать виджет прозрачным, в Конструкторе макета можно задать визуальным элементам (как панели, так и самой надписи) свойство «Drawable» - «Color» значение «Transparent» (R - 255, G - 255, B - 255, Alpha - 0).

Размер виджета (конкретно — панели, на которой находятся остальные визуальные элементы) следует подобрать так, чтобы он не был слишком большим. Например, на моём телефоне размеры 50х50 (свойства «Width» и «Hight» в Конструкторе макета) дают размер, похожий на размер обычных значков приложений на Рабочем столе телефона.

Как в B4A получить процент заряда батареи телефона

Dim phoneEvents As PhoneEvents
Dim batteryLevel As Int
phoneEvents.Initialize("phoneEvents")
Sub phoneEvents_BatteryChanged (Level As Int, Scale As Int, Plugged As Boolean, Intent As Intent)
batteryLevel = Level * 100 / Scale
End Sub

Вышеприведённый код может быть «разбросан», например, по модулю ресивера в вашем проекте: объявления переменных в одной процедуре, инициализация объекта «PhoneEvents» — в другой и т.п.

Суть в том, что мы объявляем объект «PhoneEvents», инициализируем его, а затем обрабатываем его события. В данном случае обрабатывается единственное системное событие — изменение состояния заряда аккумулятора нашего устройства (BatteryChanged).

Для работы в проекте должна быть подключена библиотека «Phone», которая поставляется вместе с B4A.