从 API 级别 33 开始,Bundle 类的
getSerializable(String)
方法已弃用。文档建议使用 getSerializable(String, Class)
代替。但该功能仅适用于 API 级别 33。
我当前的代码:
val model = args.getSerializable("key") as? Model
现在应该是这样吗?
val model = args.customGetSerializable<Model>("key")
@Suppress("DEPRECATION")
inline fun <reified T : Serializable> Bundle.customGetSerializable(key: String): T? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
getSerializable(key, T::class.java)
} else {
getSerializable(key) as? T
}
}
现在应该是这样吗?
是的。
理想情况下,Google 会在
BundleCompat
中添加内容以应对这些更改,也许他们现在会这样做,因为 Android 13 已开始向用户交付。
为 Kotlin 提供了很多示例和解决方案,但 java 似乎没有得到任何帮助。这里有一个有效的 java 解决方案:-
List<ClassName> variable;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
//noinspection unchecked
Class<? extends ArrayList<ClassName>> type = (Class<? extends ArrayList<ClassName>>) new ArrayList<>().getClass();
variable = bundle.getSerializable("reference", type);
} else {
//noinspection unchecked,deprecation
variable = (List<ClassName>) bundle.getSerializable("reference");
}
您可以做的是将您的枚举设置为Parcelable。使用@Parcelize可以轻松完成。
之后,您可以用 BundleCompat.getParcelable() 替换已弃用的 getSerialized()。
但是当你调用 putExtra() 时需要小心,因为你的 Enum 现在实现了 Serialized 和 Parcelable,所以,你需要像这样 putExtra(enum as Parcelable) 那样强制你的 Enum 作为 Parceable
如果您觉得 BundleCompapt 和 IntentCompat 版本更长,您可以创建这样的扩展并使用
inline fun <reified T: Parcelable> Bundle.getParcel(key: String): T? =
BundleCompat.getParcelable(this, key, T::class.java)
inline fun <reified T: Parcelable> Intent.getParcel(key: String): T? =
IntentCompat.getParcelableExtra(this, key, T::class.java)