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

公開 2021-12-28 23:52 / 最終更新 2021-12-28 23:52 プレビューモード
カテゴリー Androidアプリ

問題発生

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))
コメントする

※コメントシステムの詳細はこちらを御覧ください。

コメント本文

確認

コメントを削除しますか?

確認

ログアウトしますか?

arrow_upward