Как улучшить виджет

Попробуйте Compose
Jetpack Compose – это рекомендуемый набор инструментов для создания пользовательского интерфейса в Android. Узнайте, как создавать виджеты с помощью API в стиле Compose.

На этой странице приведены сведения о дополнительных улучшениях виджетов, доступных начиная с 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>

Виджет в светлой теме
Рисунок 1. Виджет в светлой теме.
Виджеты в тёмной теме
Рисунок 2. Виджет в тёмной теме.

Обратная совместимость для динамических цветов

Динамические цвета доступны только на устройствах с 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
)