Как передать пользовательский объект через намерение в 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()
Убедитесь, что все члены содержатся в этих методах, и при его изменении убедитесь, что чтение и запись происходят в том же порядке.