Reputation: 27
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
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