Rum*_*tel 53 android android-intent kotlin deprecation-warning android-tiramisu
我已经升级到targetSdkVersion和。compileSdkVersion33
我现在收到警告,告诉我getSerializedExtra(name:)和getParcelableExtra(name:)方法已被弃用。
我从Intent类中的文档检查并确认这两种方法确实已被弃用。
该文档建议我改用新的getSerializedExtra(name:clazz:)和getParcelableExtra(name:clazz:)方法。
谁能帮助我使用新方法?
Object:Listor时发出警告ArrayList:Nik*_*las 68
这就是我使用的:
inline fun <reified T : Serializable> Bundle.serializable(key: String): T? = when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getSerializable(key, T::class.java)
else -> @Suppress("DEPRECATION") getSerializable(key) as? T
}
inline fun <reified T : Serializable> Intent.serializable(key: String): T? = when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getSerializableExtra(key, T::class.java)
else -> @Suppress("DEPRECATION") getSerializableExtra(key) as? T
}
Run Code Online (Sandbox Code Playgroud)
我还在这里为getParcelable编写了相同的内容,并请求将其直接添加到支持库中
Moh*_*edi 21
该方法T getSerializableExtra(String, Class<T>)是从 android 33 开始引入的。因此,对于使用 android 33 以下的设备,您应该使用 if 块。
fun <T : Serializable?> getSerializable(activity: Activity, name: String, clazz: Class<T>): T
{
return if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
activity.intent.getSerializableExtra(name, clazz)!!
else
activity.intent.getSerializableExtra(name) as T
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在你的活动中使用它,如下所示:
val myPOJOClass = getSerializable(this, "my_intent_key", MyPOJOClass::class.java)
Run Code Online (Sandbox Code Playgroud)
然而,穆罕默德·赛耶迪的回答起到了作用。但在从 获取意图数据的情况下它会失败onActivityResult()。
我们无法使用 Activity 内部的 Intent 来获取数据onActivityResult()。以下是我得到的解决方案。
解决方案1:使用扩展功能:
fun <T : Serializable?> Intent.getSerializable(key: String, m_class: Class<T>): T {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
this.getSerializableExtra(key, m_class)!!
else
this.getSerializableExtra(key) as T
}
Run Code Online (Sandbox Code Playgroud)
用法:
val myPOJOClass = intent.getSerializable("my_intent_key", MyPOJOClass::class.java)
Run Code Online (Sandbox Code Playgroud)
解决方案2:使用常规函数:
fun <T : Serializable?> getSerializable(intent: Intent, key: String, m_class: Class<T>): T {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
intent.getSerializableExtra(key, m_class)!!
else
intent.getSerializableExtra(key) as T
}
Run Code Online (Sandbox Code Playgroud)
用法:
val myPOJOClass = getSerializable(intent, "my_intent_key", MyPOJOClass::class.java)
Run Code Online (Sandbox Code Playgroud)
对于我们这些仍然使用 Java 的人来说,这个函数可以解决问题:
@SuppressWarnings({"unchecked", "deprecation"})
@Nullable
public static <T extends Serializable> T getSerializable(@Nullable Bundle bundle, @Nullable String key, @NonNull Class<T> clazz) {
if (bundle != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
return bundle.getSerializable(key, clazz);
} else {
try {
return (T) bundle.getSerializable(key);
} catch (Throwable ignored) {
}
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43050 次 |
| 最近记录: |