Table of Contents
- 問題発生
- 解決方法
問題発生
Androidアプリ開発中。AppWidgetにListViewを実装しようと思い、クリック時に開くページをsetOnClickFillInIntent
で設定しようとしたが、何故か RemoteViews$setPendingIntentTemplate
で設定したPendingIntent
のテンプレートが setOnClickFillInIntent
の Intent
で上書きされない。
setPendingIntentTemplate(R.id.listView, PendingIntent.getActivity(context,
UUID.randomUUID().hashCode(), Intent(context, MainActivity::class.java), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT))
setOnClickFillInIntent(R.id.listItemLayout, Intent()
.putExtra(MainActivity.EXTRA, list[position]["id"] as Int))
Result
intent.extras
-> Bundle[{}]
解決方法
Android 12以降をターゲットにする際、PendingIntent
をImmutableにするかMutableにするかの指定が必須になった。何も考えず全部Immutableにするとこういうことになる。
setOnClickFillInIntent
は実質的にPendingIntentの書き換えをしているため、PendingIntent.FLAG_IMMUTABLE
が指定されていると追加のIntentが完全に無視される。そのため、Android 12以降ではPendingIntent.FLAG_MUTABLE
の指定、Android 11以前では無指定にする必要がある。地味にハマった。
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
else PendingIntent.FLAG_UPDATE_CURRENT
setPendingIntentTemplate(R.id.listView, PendingIntent.getActivity(context,
UUID.randomUUID().hashCode(), Intent(context, MainActivity::class.java), flags))