はじめに
getParcelableが非推奨になったのは1年以上前だと思いますが、Navigationを使わない画面遷移で実装していると、比較的頻繁に使いたくなる機能ではありますよね。
今回は非推奨になったgetParcelableに変わる便利なBundleCompatをご紹介したいと思います。
非推奨解消方法
まず、こんな感じで呼んでいたものが非推奨になっています。
requireArguments().getParcelable("key")
上記の関数定義を確認してみると、下記のように記載されています。
Deprecated
Use the type-safer getParcelable(String, Class) starting from Android Build.VERSION_CODES.TIRAMISU.
つまりgetParcelableを呼ぶのであれば、クラスを指定しろということなのですが、問題はTIRAMISU以上だということです。
上記説明をそのまま鵜呑みにすると以下のような実装になるかと思います。
val data = if (VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requireArguments().getParcelable("key", Data::class.java)
} else {
requireArguments().getParcelable("key")
}
確かに上記実装で解決できますが、使用頻度の多いgetParcelableで上記のような分岐は考えたくありません。
そこで便利なのがBundleCompatになります。
BundleCompatを使用すると、以下のように実装が可能です。
BundleCompat.getParcelable(requireArguments(), "key", Data::class.java)
以上です、非常にシンプルに実装できて良いですね。
BundleCompatには上記以外にも以下のように定義されているので、Arrayなどのケースにも対応可能です。
BundleCompat.getParcelableArray(Bundle, String, Class<? extends Parcelable>): Parcelable[]
BundleCompat.getParcelableArrayList(Bundle, String, Class<? extends T> clazz): ArrayList<T>
BundleCompat.getSparseParcelableArray(Bundle, String, Class<? extends T>): SparseArray<T>
また、Intentに対応したIntentCompatというのもあります。
IntentCompat.getParcelableExtra(Intent, String, Class<T>)
IntentCompat.getParcelableArrayExtra(Intent, String, Class<? extends Parcelable>): Parcelable[]
IntentCompat.getParcelableArrayListExtra(Intent, String, Class<? extends T>): ArrayList<T>
対象画面がActivityの場合にも同様に実装が可能なので、非常に便利ですね。
ご説明した上記機能はcore-ktxの1.10.0に含まれているので、お困りの方は是非導入を検討してもらえればと思います。
androidx.core:core-ktx:1.10.0
さいごに
Webを進めていますが、フッとkotlinで実装したらどうなるかという疑問を持ってしまいました、、、
方向転換してkotlinをベースに対応できる方法を模索してみようと思います。