提问人:coppersmith 提问时间:11/7/2023 最后编辑:Marcin Orlowskicoppersmith 更新时间:11/7/2023 访问量:89
在 Api 级别 30 Android 11 版本中传递对象
Passing An Object In Api level 30 android 11 version
问:
我正在尝试使用 Parcelable 将数据对象从一个活动传递到另一个活动。它不适用于 API 30 和 Android 11 版本。我想知道如何在 Android 11 中传递大尺寸对象。我尝试了以下代码。它抛出错误,如
致命异常:main 进程:com.example.exoone,PID:3989 java.lang.NoSuchMethodError:无虚拟方法 getParcelableExtra(Ljava/lang/String;Ljava/lang/类;Ljava/lang/对象; 在类 Landroid/content/Intent 中;或其超类(声明 “android.content.Intent”显示在 /system/framework/framework.jar 中) 在 com.example.exoone.PlayerActivity.onCreate(PlayerActivity.kt:20) 在 android.app.Activity.performCreate(Activity.java:7994) 在 android.app.Activity.performCreate(Activity.java:7978) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
在我的主活动文件中
class MainActivity : AppCompatActivity() {
val TAG = "MyTag"
lateinit var binding: ActivityMainBinding
var myArray:ArrayList<MyTestDatas> = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
for (i in 1..20){
myArray.add(MyTestDatas("title $i","Some Description $i"))
}
Log.i(TAG,myArray.toString())
binding.btnSend.setOnClickListener {
val intent = Intent(this,PlayerActivity::class.java)
intent.putExtra("myData",myArray)
startActivity(intent)
}
}
}
在我的接收器活动中
class PlayerActivity : AppCompatActivity(){
val TAG = "secondTag"
private val viewBinding by lazy(LazyThreadSafetyMode.NONE) {
ActivityPlayerBinding.inflate(layoutInflater)
}
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(viewBinding.root)
val getValue = intent.getParcelableExtra("myData",MyTestDatas::class.java)
Log.i(TAG,getValue.toString())
}
}
在我的数据类中
import android.os.Parcel
import android.os.Parcelable
data class MyTestDatas(
val title:String,
val description:String
):Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString().toString(),
parcel.readString().toString()
) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(title)
parcel.writeString(description)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<MyTestDatas> {
override fun createFromParcel(parcel: Parcel): MyTestDatas {
return MyTestDatas(parcel)
}
override fun newArray(size: Int): Array<MyTestDatas?> {
return arrayOfNulls(size)
}
}
}
谁能帮我在 Android 11 中将对象从 Activity 传递到另一个 Activity?
答:
在项目中添加此扩展函数:
inline fun <reified T : Parcelable> Intent.parcelable(key: String): T? = when {
SDK_INT >= 33 -> getParcelableExtra(key, T::class.java)
else -> @Suppress("DEPRECATION") getParcelableExtra(key) as? T
}
inline fun <reified T : Parcelable> Bundle.parcelable(key: String): T? = when {
SDK_INT >= 33 -> getParcelable(key, T::class.java)
else -> @Suppress("DEPRECATION") getParcelable(key) as? T
}
评论
kotlin-parcelize
@parcelize
评论
getParcelableExtra
String name
intent.putExtra("myData",myArray)
myArray
Serializable
putParcelableArrayListExtra
myArray
getParcelableArrayListExtra(String name)
Intent