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

Как создать письмо
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, доступной начиная с версии 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
        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, сколько километров я пробежал на этой неделе в приложении"Пример приложения"?

Существуют десятки встроенных намерений, охватывающих несколько категорий взаимодействия с пользователем. Благодаря этому практически любое приложение для 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
)