このページでは、Android 12(API レベル 31)以降で利用できるウィジェットのオプションの拡張機能について説明します。これらの機能はオプションですが、簡単に実装でき、ユーザーのウィジェット エクスペリエンスを向上させることができます。
動的な色を使用する
Android 12 以降のウィジェットでは、ボタンや背景などのコンポーネントにデバイスモードの色を使用できます。これにより、ウィジェット間の遷移がスムーズになり、一貫性が保持されます。
動的な色を実現する方法は 2 つあります。
ルート レイアウトでシステムのデフォルト テーマ(
@android:style/Theme.DeviceDefault.DayNight)を使用します。Android 用マテリアル コンポーネント ライブラリのマテリアル 3 テーマ(
Theme.Material3.DynamicColors.DayNight)を使用します。これは、 Android 用 マテリアル コンポーネント v1.6.0 以降で利用できます。
ルート レイアウトでテーマを設定したら、ルートまたはその子で共通の色属性を使用して、動的な色を選択できます。
使用できる色属性の例を次に示します。
?attr/primary?attr/primaryContainer?attr/onPrimary?attr/onPrimaryContainer
マテリアル 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)を使用して、デフォルトのテーマ属性でデフォルトのテーマを作成します。
マテリアル 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ユーザーが「OK Google, 今週は ExampleApp で何マイル走った?」などのリクエストを行ってこの BII をトリガーすると、アシスタントはウィジェットをプロアクティブに表示します。
ユーザー インタラクションのいくつかのカテゴリをカバーする数十の BII があり、ほとんどすべての Android アプリで音声用にウィジェットを拡張できます。まず、 App Actions を Android ウィジェットと統合するをご覧ください。
ウィジェットに名前を追加する
ウィジェット選択ツールに表示されるウィジェットには、一意の名前が必要です。
ウィジェットの名前は、AndroidManifest.xml ファイルのウィジェットの receiver 要素の label 属性から読み込まれます。
<receiver
….
android:label="Memories">
….
</receiver>
ウィジェットの説明を追加する
Android 12 以降では、ウィジェットに表示するウィジェット選択ツールの説明を指定します。
ウィジェットの説明を指定するには、
<appwidget-provider> 要素の description 属性を使用します。
<appwidget-provider
android:description="@string/my_widget_description">
</appwidget-provider>
以前のバージョンの Android では
descriptionRes
属性を使用できますが、ウィジェット
選択ツールでは無視されます。
スムーズな遷移を有効にする
Android 12 以降では、ユーザーがウィジェットからアプリを起動すると、ランチャーにより遷移がスムーズに行われます。
この改善されたトランジションを有効にするには、@android:id/background または android.R.id.background を使用して背景要素を指定します。
// Top-level layout of the widget.
<LinearLayout
android:id="@android:id/background">
</LinearLayout>
PendingIntentから開始された場合、アプリはブロードキャスト レシーバまたはサービスからアクティビティを起動できます。ただし、新しいアプリのアニメーションはブロードキャスト レシーバやサービスから起動されたアプリには使用されないため、ユーザー エクスペリエンスが低下します。
以前のバージョンの Android では、アプリで @android:id/background を使用しても破損しませんが、無視されます。
RemoteViews のランタイム変更を使用する
Android 12 以降では、RemoteViews 属性のランタイム変更を可能にするいくつかの RemoteViews メソッドを利用できます。追加されたメソッドの完全なリストについては、RemoteViews API
リファレンスをご覧ください。
次のコード例は、これらのメソッドの一部を使用する方法を示しています。
Kotlin
// 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);