在 Api 级别 30 android 11 版本中传递对象

问题描述 投票:0回答:1

我正在尝试使用 parcelable 将数据对象从一个活动传递到另一个活动。它不适用于 api 30 和 android 11 版本。我想知道如何在 android 11 中传递大尺寸对象。我尝试了下面的代码。它会抛出类似的错误

致命异常:主要 进程:com.example.exoone,PID:3989 java.lang.NoSuchMethodError:没有虚拟方法 getParcelableExtra(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; 在类 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 吗?

android parcelable kotlin-multiplatform
1个回答
0
投票

在您的项目中添加此扩展功能:

@Suppress("DEPRECATION")
inline fun <reified T : Parcelable> Bundle.getParcelableCompat(key: String): T? {
    return if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
        this.getParcelable(key, T::class.java)
    } else {
        this.getParcelable<T>(key)
    }
}

在活动中你可以这样使用:

intent.extras.getParcelableCompat<MyTestDatas>("myData")
© www.soinside.com 2019 - 2024. All rights reserved.