Widgetを試してみた - タップするとアプリが立ち上がるだけ

実装したモノ

エミュレータ画像

ソースコード

github.com

やったこと

WidgetSampleWidgetProvider.kt (「AppWidgetProvider クラスの実装」に該当)

前回の記事で、空クラスだったもの。

class WidgetSampleWidgetProvider : AppWidgetProvider() {

private val text = "Hello Widget World!"
override fun onUpdate(
context: Context?,
appWidgetManager: AppWidgetManager?,
appWidgetIds: IntArray?
) {
val pendingIntent: PendingIntent = Intent(context, MainActivity::class.java)
.let { intent ->
PendingIntent.getActivity(context, 0, intent, 0)
}

appWidgetIds?.forEach {id ->
val views: RemoteViews = RemoteViews(
context?.packageName,
R.layout.widget_sample_widget
).apply {
setOnClickPendingIntent(R.id.textView, pendingIntent)
}

appWidgetManager?.updateAppWidget(id, views)
}
}
}
変数pendingIntent

アプリを立ち上げるためのintent。

appWidgetIds

ウィジェットのID。

同じアプリで複数のウィジェットを生成する事が出来るため、その複数のウィジェットを識別するためのID。

ここでは、forEachを使ってID毎に処理している。

views: RemoveViews

ウィジェットのレイアウトを操作するための変数。

RemoteViews自体は、公式によると以下のようなモノ。

developer.android.com

別のプロセスで表示できるビュー階層を記述するクラス。階層はレイアウト リソース ファイルから拡張されます。このクラスは、拡張された階層のコンテンツを変更するための基本的な操作を提供します。

RemoteViews次のレイアウトのサポートに制限されています。

そして、次のウィジェット:

API 31 の時点で、次のウィジェットとレイアウトも使用できます。

コレを使って、TextViewがタップされた場合に先程のpendingIntenを使ってアプリを起動するよう指定。

appWidgetManager?.updateAppWidget(id, views)

最後に、updateAppWidgetをコールしてウィジェットを更新する。

参考サイト

developer.android.com