Widgetを試してみた - タップするとアプリが立ち上がるだけ
実装したモノ
エミュレータ画像
ソースコード
やったこと
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自体は、公式によると以下のようなモノ。
別のプロセスで表示できるビュー階層を記述するクラス。階層はレイアウト リソース ファイルから拡張されます。このクラスは、拡張された階層のコンテンツを変更するための基本的な操作を提供します。
RemoteViews
次のレイアウトのサポートに制限されています。
AdapterViewFlipper
FrameLayout
GridLayout
GridView
LinearLayout
ListView
RelativeLayout
StackView
ViewFlipper
そして、次のウィジェット:
コレを使って、TextViewがタップされた場合に先程のpendingIntenを使ってアプリを起動するよう指定。
appWidgetManager?.updateAppWidget(id, views)
最後に、updateAppWidgetをコールしてウィジェットを更新する。