На этой странице представлена информация о дополнительных улучшениях виджетов, доступных начиная с Android 12 (уровень API 31). Эти функции являются необязательными, но их легко реализовать, и они улучшат взаимодействие пользователей с виджетами.
Используйте динамические цвета
Начиная с Android 12, виджет может использовать цвета темы устройства для кнопок, фона и других компонентов. Это обеспечивает более плавные переходы и единообразие между различными виджетами.
Существует два способа добиться динамичных цветов:
Используйте тему оформления по умолчанию (
@android:style/Theme.DeviceDefault.DayNight) в корневом макете.Используйте тему Material 3 (
Theme.Material3.DynamicColors.DayNight) из библиотеки Material Components for Android , доступной начиная с версии Material Components for Android 1.6.0 .
После того как тема задана в корневом макете, вы можете использовать общие атрибуты цвета в корневом элементе или любом из его дочерних элементов, чтобы выбрать динамические цвета.
Вот несколько примеров цветовых атрибутов, которые вы можете использовать:
-
?attr/primary -
?attr/primaryContainer -
?attr/onPrimary -
?attr/onPrimaryContainer
В следующем примере, использующем тему Material 3, цвет темы устройства — «фиолетовый». Акцентный цвет и фон виджета адаптируются для светлого и темного режимов, как показано на рисунках 1 и 2.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorPrimaryContainer"
android:theme="@style/Theme.Material3.DynamicColors.DayNight">
<ImageView
...
app:tint="?attr/colorPrimaryContainer"
android:src="@drawable/ic_partly_cloudy" />
<!-- Other widget content. -->
</LinearLayout>


Обратная совместимость для динамических цветов
Динамические цвета доступны только на устройствах под управлением Android 12 и выше. Чтобы задать пользовательскую тему для более старых версий, создайте тему по умолчанию с вашими пользовательскими цветами и новым квалификатором ( values-v31 ), используя атрибуты темы по умолчанию.
Вот пример использования темы Material 3:
/values/styles.xml
<resources>
<style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight">
<!-- Override default colorBackground attribute with custom color. -->
<item name="android:colorBackground">@color/my_background_color</item>
<!-- Add other colors/attributes. -->
</style>
</resources>
/values-v31/styles.xml
<resources>
<!-- Do not override any color attribute. -->
<style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight" />
</resources>
/layout/my_widget_layout.xml
<resources>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:background="?android:attr/colorBackground"
android:theme="@style/MyWidgetTheme" />
</resources>
Включить поддержку голосового управления
Функция App Actions позволяет Google Ассистенту отображать виджеты в ответ на соответствующие голосовые команды пользователя. Настроив виджет на реагирование на встроенные интенты (BII) , ваше приложение может заблаговременно отображать виджеты на таких платформах Ассистента, как Android и Android Auto. Пользователи могут закреплять виджеты, отображаемые Ассистентом, на панели запуска, стимулируя дальнейшее взаимодействие.
Например, вы можете настроить виджет сводки тренировки для вашего приложения для тренировок таким образом, чтобы он выполнял голосовые команды пользователей, запускающие BII GET_EXERCISE_OBSERVATION . Ассистент будет заблаговременно отображать ваш виджет, когда пользователи запускают этот BII, отправляя запросы, например: «Привет, Google, сколько миль я пробежал на этой неделе в ExampleApp?»
Существует множество BII-элементов, охватывающих различные категории взаимодействия с пользователем, что позволяет практически любому приложению Android расширить функциональность виджетов для голосового управления. Для начала ознакомьтесь с разделом «Интеграция действий приложения с виджетами Android» .
Добавьте название к своему виджету
При отображении в окне выбора виджетов виджеты должны иметь уникальное имя.
Названия виджетов загружаются из атрибута label элемента- receiver виджета в файле AndroidManifest.xml.
<receiver
….
android:label="Memories">
….
</receiver>
Добавьте описание для вашего виджета
Начиная с Android 12, укажите описание для средства выбора виджета, которое будет отображаться для вашего виджета.

Укажите описание для вашего виджета, используя атрибут description элемента <appwidget-provider> :
<appwidget-provider
android:description="@string/my_widget_description">
</appwidget-provider>
Атрибут descriptionRes можно было использовать в более ранних версиях Android, но он игнорировался средством выбора виджетов.
Обеспечьте более плавные переходы
Начиная с Android 12, лаунчеры обеспечивают более плавный переход при запуске приложения пользователем из виджета.
Чтобы включить улучшенный переход, используйте @android:id/background или android.R.id.background для идентификации элемента фона:
// Top-level layout of the widget.
<LinearLayout
android:id="@android:id/background">
</LinearLayout>
В предыдущих версиях Android ваше приложение могло использовать @android:id/background без каких-либо проблем, но в этом случае оно игнорировалось.
Используйте модификацию RemoteViews во время выполнения.
Начиная с Android 12, вы можете использовать несколько методов RemoteViews , которые позволяют изменять атрибуты RemoteViews во время выполнения. Полный список добавленных методов см. в справочнике API RemoteViews .
В следующем примере кода показано, как использовать некоторые из этих методов.
Котлин
// Set the colors of a progress bar at runtime. remoteView.setColorStateList(R.id.progress, "setProgressTintList", createProgressColorStateList()) // Specify exact sizes for margins. remoteView.setViewLayoutMargin(R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DP)
Java
// Set the colors of a progress bar at runtime. remoteView.setColorStateList(R.id.progress, "setProgressTintList", createProgressColorStateList()); // Specify exact sizes for margins. remoteView.setViewLayoutMargin(R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DP);
