coppersmith
coppersmith

Reputation: 27

Passing An Object In Api level 30 android 11 version

i am trying to pass data object from one activity to another activity using parcelable. it doesn't work in api 30 and android 11 version. i would like to know how can i pass a large size object in android 11. i tried below code. it throws error like

FATAL EXCEPTION: main Process: com.example.exoone, PID: 3989 java.lang.NoSuchMethodError: No virtual method getParcelableExtra(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; in class Landroid/content/Intent; or its super classes (declaration of 'android.content.Intent' appears in /system/framework/framework.jar) at com.example.exoone.PlayerActivity.onCreate(PlayerActivity.kt:20) at android.app.Activity.performCreate(Activity.java:7994) at android.app.Activity.performCreate(Activity.java:7978) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

in my main activity file

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)
        }

    }
}

in my receiver activity

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())
    }
}

in my data class

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)
        }
    }
}

could anybody help me passing an object from activity to another activity in android 11?

Upvotes: -1

Views: 738

Answers (1)

Kamal Nayan
Kamal Nayan

Reputation: 1718

Add this extension function in your project:

    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
}

Upvotes: 0

Related Questions