На этой странице приведены сведения о дополнительных улучшениях виджетов, доступных начиная с Android 12 (уровень API 31). Эти функции необязательны, но их легко реализовать, и они улучшают работу пользователей с виджетами.
Дополнительные способы улучшения виджета описаны в руководстве по Compose Enhance your Widget (Улучшение виджета).
Использовать динамические цвета
Начиная с Android 12, виджет может использовать цвета темы устройства для кнопок, фона и других компонентов. Это обеспечивает более плавные переходы и согласованность между различными виджетами.
Есть два способа получить динамические цвета:
Используйте тему по умолчанию (
@android:style/Theme.DeviceDefault.DayNight) в корневом макете.Используйте тему Material 3 (
Theme.Material3.DynamicColors.DayNight) из библиотеки Material Components for Android, доступной начиная с версии Material Components for Android v1.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 android:layout_width="wrap_content" android:layout_height="wrap_content" app:tint="?attr/colorPrimaryContainer" android:src="@drawable/ic_cloud" /> <!-- 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
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="?android:attr/colorBackground" android:theme="@style/MyWidgetTheme" />
Включить голосовую поддержку
Действия в приложениях позволяют Google Ассистенту показывать виджеты в ответ на голосовые команды пользователей. Если вы настроите виджет так, чтобы он реагировал на встроенные намерения, ваше приложение сможет показывать виджеты на платформах с Ассистентом, например на Android и Android Auto. Пользователи могут закреплять виджеты, которые показывает Ассистент, на панели запуска, чтобы в дальнейшем взаимодействовать с ними.
Например, вы можете настроить виджет со сводкой тренировок для фитнес-приложения, чтобы выполнять голосовые команды пользователя, которые активируют встроенное намерение GET_EXERCISE_OBSERVATION. Ассистент будет показывать ваш виджет, когда пользователи активируют это встроенное намерение, например говорят "Окей, Google, сколько километров я пробежал на этой неделе в ExampleApp?".
Существуют десятки встроенных намерений, охватывающих несколько категорий взаимодействия с пользователем, что позволяет практически любому приложению Android улучшить свои виджеты для голосового управления. Чтобы начать, ознакомьтесь с инструкциями по интеграции действий в приложении с виджетами Android.
Включить плавные переходы
Начиная с Android 12, лаунчеры обеспечивают более плавный переход, когда пользователь запускает приложение из виджета.
Чтобы включить улучшенный переход, используйте @android:id/background или android.R.id.background для идентификации фонового элемента:
<!-- Top-level layout of the widget. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/background" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> </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_DIP )