【Android】AppWidget の ListView で、setOnClickFillInIntent で指定した Intent が反映されないときは

2021/12/28 23:52公開
Table of Contents
  1. 問題発生
  2. 解決方法

問題発生

Androidアプリ開発中。AppWidgetにListViewを実装しようと思い、クリック時に開くページをsetOnClickFillInIntentで設定しようとしたが、何故か RemoteViews$setPendingIntentTemplate で設定したPendingIntentのテンプレートが setOnClickFillInIntentIntent で上書きされない。

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))