Виджеты приложений могут быть настраиваемыми. Например, виджет часов позволяет пользователям выбирать, какой часовой пояс отображать.
Если вы хотите, чтобы пользователи могли настраивать параметры вашего виджета, создайте Activity для конфигурации виджета. Эта Activity автоматически запускается хостом виджета приложения либо при создании виджета, либо позже, в зависимости от указанных вами параметров конфигурации .
Объявите действие по настройке.
Объявите активность конфигурации как обычную активность в файле манифеста Android. Хост виджета приложения запускает её с помощью действия ACTION_APPWIDGET_CONFIGURE , поэтому активность должна принимать этот интент. Например:
<activity android:name=".ExampleAppWidgetConfigurationActi>vity&<quot;
int>ent-filte<r
action android:name="android.appwidget.action.APPWID>GET_C<ONFIGURE">/<
/int>ent-filter
/activity
Объявите активность в файле AppWidgetProviderInfo.xml с помощью атрибута android:configure . Дополнительную информацию об объявлении этого файла см. здесь. Вот пример объявления активности конфигурации:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
...
android:configure="com.example.android.ExampleAppWidgetConfigurationAct>i<vity"
... >
/appwidget-provider
Активность объявляется с полным указанием пространства имен, поскольку средство запуска ссылается на нее извне области видимости вашего пакета.
Это всё, что вам нужно для начала процесса настройки. Далее вам необходимо выполнить сам процесс.
Выполните действия по настройке.
При проведении этого мероприятия следует помнить о двух важных моментах:
- Хост виджета приложения вызывает действие конфигурации, и это действие всегда должно возвращать результат. Результат должен включать идентификатор виджета приложения, переданный интентом, запустившим действие, — он сохраняется в параметрах интента как
EXTRA_APPWIDGET_ID. - Система не отправляет широковещательное сообщение
ACTION_APPWIDGET_UPDATEпри запуске действия конфигурации, а это значит, что она не вызывает методonUpdate()при создании виджета. Запрос обновления уAppWidgetManagerпри первом создании виджета — это задача самого действия конфигурации. ОднакоonUpdate()вызывается для последующих обновлений — он пропускается только при первом создании.
В следующем разделе приведены фрагменты кода, демонстрирующие, как получить результат из конфигурации и обновить виджет.
Обновите виджет через окно конфигурации.
Когда виджет использует действие конфигурации, именно это действие отвечает за обновление виджета после завершения конфигурации. Это можно сделать, запросив обновление непосредственно у AppWidgetManager .
Ниже приведено краткое описание процедуры корректного обновления виджета и закрытия окна настройки:
Получите идентификатор виджета приложения из интента, запустившего активность:
Котлин
val appWidgetId = intent?.extras?.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID ) ?: AppWidgetManager.INVALID_APPWIDGET_ID
Java
Intent intent = getIntent(); Bundle extras = intent.getExtras(); int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; if (extras != null) { appWidgetId = extras.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); }
Установите результат действия в значение
RESULT_CANCELED.Таким образом, если пользователь выходит из процесса до его завершения, система уведомляет хост виджета приложения о том, что конфигурация отменена, и хост не добавляет виджет:
Котлин
val resultValue = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) setResult(Activity.RESULT_CANCELED, resultValue)
Java
int resultValue = new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult(Activity.RESULT_CANCELED, resultValue);
Настройте виджет в соответствии с предпочтениями пользователя.
После завершения настройки получите экземпляр
AppWidgetManager, вызвавgetInstance(Context):Котлин
val appWidgetManager = AppWidgetManager.getInstance(context)
Java
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
Обновите виджет, добавив в него макет
RemoteViews, вызвавupdateAppWidget(int,RemoteViews):Котлин
val views = RemoteViews(context.packageName, R.layout.example_appwidget) appWidgetManager.updateAppWidget(appWidgetId, views)
Java
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget); appWidgetManager.updateAppWidget(appWidgetId, views);
Создайте Intent возврата, задайте в нем результат действия и завершите действие:
Котлин
val resultValue = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) setResult(Activity.RESULT_OK, resultValue) finish()
Java
Intent resultValue = new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult(RESULT_OK, resultValue); finish();
Пример можно посмотреть в файле ListWidgetConfigureActivity.kt на GitHub.
Параметры конфигурации виджета
По умолчанию хост виджета приложения запускает процесс настройки только один раз, сразу после того, как пользователь добавит виджет на главный экран. Однако вы можете указать параметры, позволяющие пользователям перенастраивать существующие виджеты или пропускать начальную настройку виджета, предоставив конфигурацию виджета по умолчанию.
Предоставьте пользователям возможность изменять конфигурацию размещенных виджетов.
Чтобы пользователи могли перенастраивать существующие виджеты, укажите флаг reconfigurable в атрибуте widgetFeatures объекта appwidget-provider . Дополнительную информацию см. в руководстве по объявлению файла AppWidgetProviderInfo.xml . Например:
<appwidget-provider
android:configure="com.myapp.ExampleAppWidgetConfigurationActivity"
android:widgetFeatures=">r<econfigurable">
/appwidget-provider
Пользователи могут изменить настройки своего виджета, коснувшись и удерживая виджет, а затем нажав кнопку « Изменить настройки» , обозначенную цифрой 1 на рисунке 1.

Используйте конфигурацию виджета по умолчанию.
Вы можете обеспечить более удобную работу с виджетом, позволив пользователям пропустить этап первоначальной настройки. Для этого укажите флаги configuration_optional и reconfigurable в поле widgetFeatures . Это позволит избежать запуска процесса настройки после добавления виджета пользователем. Как упоминалось ранее, пользователь все равно сможет перенастроить виджет позже. Например, виджет часов может пропустить первоначальную настройку и по умолчанию отображать часовой пояс устройства.
Вот пример того, как можно пометить действия по настройке как перенастраиваемые и необязательные:
<appwidget-provider
android:configure="com.myapp.ExampleAppWidgetConfigurationActivity"
android:widgetFeatures="reconfigurable|configur>a<tion_optional">
/appwidget-provider