添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams
fun launchNextScreen(context: Context, people: People): Intent {
    val intent = Intent(context, NextScreenActivity::class.java)
    intent.putExtra(EXTRA_PEOPLE, (Parcelable) people)
    //intent.putExtra(EXTRA_PEOPLE, people as Parcelable)
    //intent.putExtra(EXTRA_PEOPLE, people)
    // tried above all three ways
    return intent

I tried the above code to pass an instance of the People class via intent using kotlin, but I am getting an error. What am I doing wrong?

First, make sure the People class implements the Serializable interface:

class People : Serializable {
    // your stuff

Inner fields of People class must also implement the Serializable interface, otherwise you'll get runtime error.

Then it should work:

fun launchNextScreen(context: Context, people: People): Intent {
    val intent = Intent(context, NextScreenActivity::class.java)
    intent.putExtra(EXTRA_PEOPLE, people)
    return intent

To receive people back from Intent you'll need to call:

val people = intent.getSerializableExtra(EXTRA_PEOPLE) as? People
                @VikashParajuli in the context of this example you'll need to call val people = getIntent().getExtras().getSerializableExtra(EXTRA_PEOPLE) as? People
– A. Shevchuk
                Mar 31, 2018 at 22:05
                @a2en that's something that everybody is saying, but nobody knows for sure) on small objects you would not see any difference.  However, there is a way to make Serializable faster than Parcelable, for more information see Farhana answer in this thread: stackoverflow.com/questions/3323074/…
– A. Shevchuk
                Apr 1, 2020 at 13:38
val intent = Intent(this, Activity2::class.java)
intent.putExtra("extra_object", object as Serializable)
startActivity(intent)

Finally, in Activity2 you get the object with:

val object = intent.extras.get("extra_object") as Object
@Parcelize
data class Student(val id: String, val name: String, val grade: String) : Parcelable

In source activity:

val intent = Intent(context, Destination::class.java)
        intent.putExtra("student_id", student)
        context.startActivity(intent)

In destination activity:

student = intent.getParcelableExtra("student_id")
                This works but you have to set this in your build.gradle: apply plugin: 'org.jetbrains.kotlin.android.extensions'  android {     androidExtensions {         experimental = true     } }
– Nicola Gallazzi
                Nov 1, 2018 at 18:54

Parcelize is no longer experimental, as of Kotlin 1.3.60+!

Define a data class, adding @Parcelize annotation and extending Parcelable:

@Parcelize
data class People(val id: String, val name: String) : Parcelable
val intent = Intent(context, MyTargetActivity::class.java)
intent.putExtra("people_data", student)
context.startActivity(intent)

If you haven't yet, enable extensions in your app's build.gradle. This also enables data binding and other great advanced features

apply plugin: 'kotlin-android-extensions'
                kotlin-android-extensions is now deprecated, you should use kotlin-parcelize plugin for Parcelable implementation generator.
– Micer
                Mar 30, 2021 at 23:50

I found a better way to pass an object from one activity to another using Parcelable, it is faster than Serialization Android: Difference between Parcelable and Serializable?

first, add these lines of code inside build.gradle(app)

apply plugin: 'kotlin-android-extensions' in app.grable 
@Parcelize 
class Model(val title: String, val amount: Int) : Parcelable

passing with Intent--->

val intent = Intent(this, DetailActivity::class.java)
intent.putExtra(DetailActivity.EXTRA, model)
startActivity(intent)

Getting from intent --->

val model: Model = intent.getParcelableExtra(EXTRA)
                that's something that everybody is saying, but nobody knows for sure) on small objects you would not see any difference. Also, nice to have this Kotlin sugar, but what about good old java?  However, there is a way to make Serializable faster than Parcelable, for more information see Farhana answer in this thread: stackoverflow.com/questions/3323074/…
– A. Shevchuk
                Apr 9, 2020 at 7:51

This post might be useful for what you intend to do:

Is there a convenient way to create Parcelable data classes in Android with Kotlin?

Basically, kotlin provides some little extras:

@Parcelize
class User(val firstName: String, val lastName: String) : Parcelable

See the post for more info.

in kotlin to start activity and pass some data you could try something like this:

startActivity(intentFor<NameOfActivity>(STRING to data))

Have Fun

you have to add the type inside <>...its working for me

val people = intent.getParcelableExtra<People>(EXTRA_PEOPLE) as People

In your PeopleDetailActivity activity, initialize viewModel in onCreate

viewModel = this@PeopleDetailActivity.viewModel.apply { postPeopleId(getPeopleFromIntent().id) }

And also initialize this method :

private fun getPeopleFromIntent() = intent.getParcelableExtra<People>(peopleId) as People

Write below code for passing the intent extras :

companion object {
        private const val objectId = "people"
        fun startActivityModel(context: Context?, people: People) {
            if (context != null) {
                val intent = Intent(context, PeopleDetailActivity::class.java).apply {
                    putExtra(
                        objectId,
                        people
                context.startActivity(intent)

Call the above method in your PeopleListViewHolder onClick

override fun onClick(v: View?) = PeopleDetailActivity.startActivityModel(context(), people)
                This will just work if the custom object is parcable. Would be great if you provide some sample Code.
– Marcel Hofgesang
                May 10, 2021 at 14:13

android studio will show you an error. Simple move your cursor to "People" and hit alt+enter. It should now show the option to generate a Parcelable implementation.

This generated code will contain something like

parcel.writeString(member1)
parcel.writeInt(member2)

and somewhere else

member1=parcel.readString()
member2=parcel.readInt()

Make sure that all members are contained in these methods and when modifying it, make sure that read and write is happening in the exact same order.

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.