Как передать пользовательский объект через намерение в kotlin

  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
}

Пробовал выше код, чтобы передать людям объект People типа через намерение, используя kotlin, но получая ошибку. Пожалуйста, помогите решить это для меня.

Ответ 1

Во-первых, убедитесь, что вы реализовали Serializable в классе People:

class People : Serializable {
//your stuff
}

Убедитесь, что ваши внутренние поля класса People также реализуют интерфейс Serializable, иначе вы получите ошибку во время выполнения.

Тогда это должно работать:

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

Чтобы вернуть людей из Intent, вам нужно позвонить:

val people = intent.getSerializableExtra(EXTRA_PEOPLE) as? People

Ответ 2

Внедрить Serializable в объекте:

data class Object (
        var param1: Int? = null,
        var param2: String? = null
) : Serializable

или же

class Object : Serializable {
        var param1: Int? = null,
        var param2: String? = null
}

Затем вы можете передать объект с помощью Intent:

val object = Object()
...
val intent = Intent(this, Activity2::class.java)
intent.putExtra("extra_object", object as Serializable)
startActivity(intent)

Наконец, в Activity2 вы получаете объект с:

val object = intent.extras.get("extra_object") as Object

Ответ 3

Нашли лучший способ сделать это:

В вашем gradle:

apply plugin: 'org.jetbrains.kotlin.android.extensions'

android {
    androidExtensions {
        experimental = true
    }
}

Ответ 4

Я нашел лучший способ передать объект одно действие другому с помощью Parcelable, это быстрее, чем сериализация Android: разница между Parcelable и Serializable?

сначала добавьте эти строки кода в build.gradle(app)

android{
    androidExtensions {
            experimental = true
        }
}

я получаю ответ от здесь

@Parcelize 
class Model(val title: String, val amount: Int) : Parcelable

прохождение с Intent--->

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

Из намерения --->

val model: Model = intent.getParcelableExtra(EXTRA)

Ответ 5

Этот пост может быть полезен для того, что вы намереваетесь сделать:

Есть ли удобный способ создания Parcelable классов данных в Android с Kotlin?

В принципе, kotlin предоставляет некоторые небольшие дополнения:

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

См. Сообщение для получения дополнительной информации.

Ответ 6

в kotlin, чтобы начать активность и передать некоторые данные, вы можете попробовать что-то вроде этого:

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

Повеселись

Ответ 7

Класс "Ваш человек" должен реализовать Parcelable следующим образом:

class People(): Parcelable{
// stuff


}

Android-студия покажет вам ошибку. Просто переместите курсор на "Люди" и нажмите alt + enter. Теперь он должен показать возможность генерации реализации Parcelable.

Этот сгенерированный код будет содержать что-то вроде

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

и где-то еще

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

Убедитесь, что все члены содержатся в этих методах, и при его изменении убедитесь, что чтение и запись происходят в том же порядке.