MacでAndroidウィジェットにトグルボタンを追加する方法

※本ページにはプロモーション(広告)が含まれています。
MacでAndroidウィジェットにトグルボタンを追加する方法

MacでAndroidウィジェットにトグルボタンを追加しようとして戸惑っていませんか。

この記事を読むと従来のAppWidgetProviderを使ってMac環境からでもトグルを実装するための具体的な手順と現場で役立つコツがわかります。

項目内容
実体験の手順Macでの開発環境構築から動作確認まで実際に使った順序を細かく紹介します。
具体的なコード例AppWidgetProviderでのトグル実装の実コードとよくある落とし穴を解説します。
配布とデバッグの工夫署名やログの見方など現場で役立つ小技を紹介します。

これから順を追って手を動かしながら進めるので環境準備が苦手でも安心して読み進めてください。

Android博士

最初は戸惑うのが当たり前ですから気負わずゆっくり進めてください。小さな確認を積み重ねれば必ず動くようになりますから安心してください。

目次

Macで従来のAppWidgetProviderを使ってトグルボタンを作る手順

Macで従来のAppWidgetProviderを使ってトグルボタンを作る手順

MacでAndroidウィジェットにトグルボタンを追加するなら、まずは従来のAppWidgetProviderを使う方法が手堅いです。流れはレイアウト作成、appwidget-providerの宣言、AppWidgetProviderクラスの作成、クリック受け取りと状態保存の順になります。

ポイントはRemoteViewsの制約を意識することと、クリックはPendingIntent経由で受け取ることです。小さく動作確認を繰り返すことで、Mac上のAndroidStudioでも確実に動かせます。

Android博士

最初は動作確認を何回かやってみてください。一つずつ動くのを確認すると自信がつきますし、気軽に変更しながら作れるようになります。

Macでレイアウトとappwidget-provider XMLを作成する方法

Macでレイアウトとappwidget-provider XMLを作成する方法

ウィジェットのレイアウトはres/layout/widget_layout.xmlに作ります。Toggleの見た目はToggleButtonやImageButtonで作り、idを振って後からRemoteViewsで操作できるようにします。

appwidget-providerのメタ情報はres/xml/widget_info.xmlに記述してinitialLayoutやupdatePeriodMillisを設定します。エミュレータやプレビューで見た目を確認しながら進めると安心です。

AndroidStudioのProjectウィンドウでres/layout/widget_layout.xmlとappwidget-provider XMLを作成してToggleButtonを配置する

手順
レイアウトファイルを作る

res/layout/widget_layout.xmlを作成してToggle用のビューを配置します。idは例として@+id/toggleを付けておくと後で扱いやすいです。

手順
appwidget-provider XMLを作る

res/xml/widget_info.xmlでinitialLayoutとupdatePeriodMillis、minWidth/minHeightを指定します。初期レイアウトには先ほどのlayoutを設定します。

手順
プレビューで確認する

AndroidStudioのレイアウトプレビューやエミュレータで見た目を確認します。ビューがRemoteViewsで使えるか注意してください。

AndroidStudioでapp/src/main/javaにAppWidgetProviderクラスを作成してonUpdateとonReceiveを実装する

手順
クラスを作成する

app/src/main/javaにAppWidgetProviderを継承したクラスを作ります。パッケージは既存のアプリ構成に合わせてください。

手順
onUpdateでRemoteViewsを組み立てる

onUpdateでRemoteViewsを作成し、トグルのPendingIntentをセットしてウィジェットを更新します。

手順
onReceiveでクリックを処理する

onReceiveでIntentのアクションをチェックしてトグル状態を切り替え、SharedPreferencesに保存してRemoteViewsを更新します。

AppWidgetProvider内でPendingIntentを作ってクリックを受け取りSharedPreferencesにトグル状態を保存する実装場所とコード例

項目内容
実装場所AppWidgetProviderクラスのonReceiveまたはonUpdate内にクリック処理を置きます。
PendingIntentの作り方Intentにカスタムアクションを設定しPendingIntent.getBroadcastでブロードキャスト用を作成します。
状態保存SharedPreferencesにBooleanで保存し、ウィジェット更新時に読み出して表示を切り替えます。

MacでJetpack Glanceを使ってトグルを作る方法

MacでJetpack Glanceを使ってトグルを作る方法

Jetpack Glanceを使うとCompose風のAPIでウィジェットを作れます。Glanceは状態管理やアクションの扱いが分かりやすく、トグルの実装も直感的になります。

主にGlanceAppWidgetクラスとGlanceStateを使い、GlanceActionでクリックを処理して状態を保存します。依存追加やAndroidの要件を満たしているか確認してください。

AndroidStudioのbuild.gradleにGlance依存を追加して同期する手順(どのファイルを編集するか)

  1. モジュールのbuild.gradleまたはbuild.gradle.ktsを開く。通常はappモジュールのファイルを編集します。
  2. dependenciesブロックにimplementation “androidx.glance:glance-appwidget:“を追加して同期する。
  3. Kotlin DSLを使っている場合は記法を合わせて追加し、プロジェクトを再同期してビルドできることを確認する。

GlanceWidgetクラスでトグルのComposableを定義しGlanceActionでクリック処理と状態保存を実装する場所とサンプルコード

手順
GlanceWidgetを作る

GlanceAppWidgetを継承したクラスを作り、ContentでToggleのUIを定義します。GlanceのCompose風関数を使って見た目を組みます。

手順
クリック処理をGlanceActionで書く

ToggleにGlanceActionを割り当て、actionCallbackやupdateAppWidgetStateで状態を読み書きして反映します。

手順
状態の保存と更新

GlanceStateを使ってトグル状態を保存し、変更時にupdateを呼んでウィジェットを再描画します。

Macでトグル状態を永続化して複数ウィジェットで同期する方法

Macでトグル状態を永続化して複数ウィジェットで同期する方法

トグル状態を複数のウィジェットで同じように見せたい場面はよくあります。ひとつのトグル操作で全ウィジェットがすぐ反映されると使い心地がぐっと良くなりますので、ここでは手早く確実に同期させる方法をやさしく紹介します。

結論からいうとSharedPreferencesを真ん中に置いておき、トグル押下で状態を書き込みつつAppWidgetManager経由で登録されている全てのappWidgetIdに対してRemoteViewsを更新します。書き込みはapplyで非同期保存し、即時反映が必要ならcommitを使うという選択肢もありますので状況に合わせて使い分けてください。

MacでSharedPreferencesを使ってウィジェット全体の状態を管理するパターン

MacでSharedPreferencesを使ってウィジェット全体の状態を管理するパターン

ウィジェット全体の状態管理はSharedPreferencesを共通の真実として使うのがシンプルで堅実です。グローバルなトグル状態をひとつのキーで持つか、ウィジェットごとにキーを分けるかは用途次第で選びます。

実装パターンとしてはPreferencesヘルパーを作り読み書きをカプセル化します。トグルボタンのPendingIntentでSharedPreferencesを書き換えたら、AppWidgetManager.getAppWidgetIdsで全IDを取得して更新処理を投げるだけで同期が取れます。

WidgetProvider内でのSharedPreferencesキー設計と読み書きの実装箇所を具体的に示す

項目内容
キー命名ルールグローバルならKEY_TOGGLE_STATE。ウィジェット毎ならKEY_TOGGLE_STATE_{appWidgetId}のようにIDを付けると分かりやすい。
読み取り実装場所onUpdateまたはupdateAppWidget呼び出し直前にPreferencesヘルパーから値を読み取りRemoteViewsに反映する。
書き込み実装場所PendingIntent受信時のonReceiveでSharedPreferencesに書き込みを行い、その後全ウィジェットを更新する。

AndroidStudioでAppWidgetManager.updateAppWidgetを使い全ウィジェットをループしてUIを更新する手順と配置ファイル

手順
appWidgetIdsを取得する

AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context,YourWidgetProvider.class))で全IDを取得する。

手順
各IDについてRemoteViewsを作る

各appWidgetIdでRemoteViewsを生成しSharedPreferencesの値を反映してからsetOnClickPendingIntentを設定する。

手順
更新を通知する

ループ内でAppWidgetManager.updateAppWidget(appWidgetId,remoteViews)を呼び、最後に必要ならnotifyAppWidgetViewDataChangedを使う。リソース配置はres/xml/widget_info.xmlにウィジェット設定を置き、AndroidManifestで受信を宣言する。

Macでトグルウィジェットをアプリや通知と連携する応用方法

Macでトグルウィジェットをアプリや通知と連携する応用方法

Macでトグルウィジェットをアプリや通知と連携すると日常の操作がぐっと楽になります。ここでは現場で役立つ実践的な手法をやさしく紹介します。ウィジェットからアプリを開いて状態を渡す方法と、通知アクションで直接トグルする方法を中心に説明します。

ポイントは状態の受け渡しとWidgetの更新を確実に行うことです。SharedPreferencesやAppWidgetManagerで状態を共有し、PendingIntentのフラグを正しく設定することで意図した挙動になります。

  • アプリの詳細画面をPendingIntent.getActivityで起動して状態を表示する方法。
  • 通知のアクションでBroadcast PendingIntentを飛ばしてトグルする方法。
  • SharedPreferencesで状態を共有してAppWidgetManagerでWidgetを更新する方法。
Android博士

気軽に試してほしいので手順は短くまとめています。まずは動くプロトタイプを作ってから細部を磨くと楽しく進められますよ。

Macでウィジェットからアプリの詳細画面を起動して状態を表示するやり方

Macでウィジェットからアプリの詳細画面を起動して状態を表示するやり方

ウィジェットからアプリの詳細画面を起動して状態を見せるには、RemoteViewsにセットするPendingIntentをIntentにExtras付きで作成します。起動先のActivityではIntentからExtrasを読み取りUIに反映すると状態がユーザーに伝わりやすくなります。

バックスタックを自然に保ちたい場合はTaskStackBuilderを併用すると戻る挙動が違和感なくなります。またPendingIntentはFLAG_UPDATE_CURRENTなどを使って同一のPendingIntentを上書きする運用が現場では安心です。

AndroidStudioでPendingIntent.getActivityを作りIntentにExtrasを付けて起動先Activityに状態を渡すコードの置き場所

手順
AppWidgetProviderのupdateAppWidgetでRemoteViewsを準備する

ウィジェットを更新する処理の中心なのでここでクリック処理を設定します。

手順
IntentにExtrasを詰めてPendingIntent.getActivityを作る

Intentに状態フラグや識別子を入れてからPendingIntentを生成します。

手順
RemoteViews.setOnClickPendingIntentでビューに結び付ける

対象のビューIDに作成したPendingIntentをセットしてクリックで起動するようにします。

手順
AppWidgetManager.updateAppWidgetで反映する

最後にAppWidgetManagerでウィジェットを更新して変更を画面に反映します。

Macで通知アクションやショートカットからトグルを切り替えるやり方

Macで通知アクションやショートカットからトグルを切り替えるやり方

通知のアクションからトグルを切り替えるには、通知にBroadcast用のPendingIntentを設定します。受け取るBroadcastReceiverで状態をトグルしSharedPreferencesに保存した後にAppWidgetManagerでWidgetを更新すると確実に反映できます。

ショートカットから切り替える場合はショートカット起動で同じBroadcastを発行する設計がシンプルです。最新のAndroidではPendingIntentの可変か不変かの扱いやセキュリティ要件があるのでそれに合わせて実装してください。

通知のアクションでBroadcast PendingIntentを作成しWidgetにブロードキャストして状態を切り替える手順とサンプル

手順
通知アクション用のIntentを作る

トグル用のアクション文字列と必要なExtrasをIntentに入れます。

手順
PendingIntent.getBroadcastでPendingIntentを生成する

適切なフラグを指定してBroadcast用のPendingIntentを作成し通知のアクションに設定します。

手順
BroadcastReceiverで状態をトグルしてWidgetを更新する

受け取り側でSharedPreferencesの値を反転しAppWidgetManager.updateAppWidgetやnotifyAppWidgetViewDataChangedでウィジェットを更新します。

よくある質問

よくある質問
ウィジェットのトグルがタップしても反応しないときの原因は何。

多くはPendingIntentの設定ミスやRemoteViewsでのクリック登録忘れが原因です。PendingIntentは一意のリクエストコードとAndroid12以降でのFLAG_MUTABLE/FLAG_IMMUTABLEに注意して作成してください。最後に実機で更新を確かめると原因が見つけやすいです。

トグルの状態を永続化するにはどうすればよいか。

SharedPreferencesなどに状態を保存してonUpdateやonReceiveで読み出しRemoteViewsを更新してください。AppWidgetManager.updateAppWidgetで反映し、複数ウィジェットIDを扱うときはIDごとに状態を管理してください。端末再起動で復元されるか確認すると安心です。

Macで開発するときに注意する点は何。

AndroidStudioをMacに入れてplatform-toolsを整えてください。ウィジェットはエミュレータより実機での動作確認が確実なので、できれば実機でテストしてください。

ウィジェットのレイアウトで気をつける点は何。

RemoteViewsで使えるビューが限られているためカスタムビューは避け標準ビューを使ってください。レイアウトは軽めにして頻繁な更新を避け、タップ領域を十分に確保してください。

まとめ

まとめ

ここまででMac環境のAndroidStudioを使い、従来のAppWidgetProviderでトグルボタンを作る基本の流れをやさしく押さえられたはずです。プロジェクト作成、RemoteViewsでウィジェットの見た目を作る、クリックはPendingIntentで受け取りSharedPreferencesで状態を保持しAppWidgetManagerで更新するという順番を覚えておくと迷いません。

実際の実装で役に立つ小さなコツをいくつか紹介します。クリック処理にはsetOnClickPendingIntentを使いIntentのactionはアプリ内で固有の文字列にしておくとデバッグが楽になりますし、PendingIntentにはFLAG_IMMUTABLEを付けておくとAndroidのセキュリティ要件に安心です。状態変更後は必ずappWidgetManager.updateAppWidgetで該当ウィジェットIDを更新し、AppWidgetProviderのonReceiveやonUpdateの流れを意識してください。

Mac上ではエミュレータと実機の両方で確認すると失敗が減ります。adbやlogcatでクリックイベントや例外を追うと原因がすぐ分かりますし、ウィジェットを再追加すると初期化の確認がしやすいです。初めてでも順を追って試せば必ず動くので、気軽に挑戦してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次