So übergeben Sie ein benutzerdefiniertes Objekt über die Absicht in Kotlin

Lesezeit: 4 Minuten

Benutzer-Avatar
Ankit Kumar

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
}

Ich habe den obigen Code ausprobiert, um eine Instanz von zu übergeben People Klasse über die Absicht mit kotlin, aber ich erhalte eine Fehlermeldung. Was mache ich falsch?

  • Was genau ist der Fehler, den Sie erhalten?

    – Hotkey

    1. Dezember 2017 um 12:15 Uhr

Benutzer-Avatar
A. Schewtschuk

Stellen Sie zunächst sicher, dass People Klasse implementiert die Serializable Schnittstelle:

class People : Serializable {
    // your stuff
}

Innere Felder von People Klasse muss auch die implementieren Serializable Schnittstelle, andernfalls erhalten Sie einen Laufzeitfehler.

Dann sollte es funktionieren:

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

Um Personen von Intent zurückzurufen, müssen Sie anrufen:

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

  • Wie bekomme ich die serialisierbare Klasse in einer anderen Aktivität?

    – Vikash Parajuli

    30. März 2018 um 6:20 Uhr


  • @VikashParajuli im Kontext dieses Beispiels müssen Sie anrufen val people = getIntent().getExtras().getSerializableExtra(EXTRA_PEOPLE) as? People

    – A. Schewtschuk

    31. März 2018 um 22:05 Uhr

  • Da es langsamer ist, müssen Sie für eine bessere Leistung Parcelable verwenden

    – a0x2

    1. April 2020 um 11:22 Uhr

  • @a2en das sagt jeder, aber niemand weiß es genau) bei kleinen Objekten würden Sie keinen Unterschied sehen. Es gibt jedoch eine Möglichkeit, Serializable schneller als Parcelable zu machen. Weitere Informationen finden Sie in der Antwort von Farhana in diesem Thread: stackoverflow.com/questions/3323074/…

    – A. Schewtschuk

    1. April 2020 um 13:38 Uhr

Implementieren Sie Serializable im Objekt:

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

oder

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

Dann können Sie das Objekt mit Intent übergeben:

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

Schließlich erhalten Sie in Activity2 das Objekt mit:

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

Benutzer-Avatar
Ankit Kumar

Habe einen besseren Weg gefunden, dies zu tun:

In deiner Note:

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

android {
    androidExtensions {
        experimental = true
    }
}

In Ihrer Datenklasse:

@Parcelize
data class Student(val id: String, val name: String, val grade: String) : Parcelable

In-Source-Aktivität:

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

In der Zielaktivität:

student = intent.getParcelableExtra("student_id")

  • Dies funktioniert, aber Sie müssen dies in Ihrem build.gradle festlegen: apply plugin: ‘org.jetbrains.kotlin.android.extensions’ android { androidExtensions { experimental = true } }

    – Nicola Gallazzi

    1. November 2018 um 18:54 Uhr


Benutzer-Avatar
Gibolt

Parcelize ist nicht mehr experimentell, wie von Kotlin 1.3.60+!

Definieren Sie eine Datenklasse, indem Sie hinzufügen @Parcelize Anmerkung und Erweiterung Parcelable:

@Parcelize
data class People(val id: String, val name: String) : Parcelable

Zur Absicht hinzufügen:

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

Im MyTargetActivity:

val people: People = intent.getParcelableExtra("people_data")

Falls noch nicht geschehen, aktivieren Sie Erweiterungen in Ihren Apps build.gradle. Dies ermöglicht auch Datenbindung und andere großartige erweiterte Funktionen

apply plugin: 'kotlin-android-extensions'

Benutzer-Avatar
Ashik Azez

Ich habe einen besseren Weg gefunden, ein Objekt mit Parcelable von einer Aktivität an eine andere zu übergeben, es ist schneller als Serialization Android: Difference between Parcelable and Serializable?

Fügen Sie zuerst diese Codezeilen in build.gradle (app) hinzu

apply plugin: 'kotlin-android-extensions' in app.grable 

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

bestanden mit Absicht —>

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

Aus Vorsatz kommen —>

val model: Model = intent.getParcelableExtra(EXTRA)

  • Gute Nachrichten!! es ist nicht mehr experimentell

    – a0x2

    1. April 2020 um 11:21 Uhr

  • das sagt jeder, aber niemand weiß es genau) bei kleinen Objekten würden Sie keinen Unterschied feststellen. Außerdem ist es schön, diesen Kotlin-Zucker zu haben, aber was ist mit dem guten alten Java? Es gibt jedoch eine Möglichkeit, Serializable schneller als Parcelable zu machen. Weitere Informationen finden Sie in der Antwort von Farhana in diesem Thread: stackoverflow.com/questions/3323074/…

    – A. Schewtschuk

    9. April 2020 um 7:51 Uhr

Benutzer-Avatar
Javatar

Dieser Beitrag könnte für das, was Sie vorhaben, nützlich sein:

Gibt es eine bequeme Möglichkeit, Parcelable-Datenklassen in Android mit Kotlin zu erstellen?

Grundsätzlich bietet kotlin einige kleine Extras:

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

Weitere Informationen finden Sie im Beitrag.

  • Gute Nachrichten!! es ist nicht mehr experimentell

    – a0x2

    1. April 2020 um 11:21 Uhr

  • das sagt jeder, aber niemand weiß es genau) bei kleinen Objekten würden Sie keinen Unterschied feststellen. Außerdem ist es schön, diesen Kotlin-Zucker zu haben, aber was ist mit dem guten alten Java? Es gibt jedoch eine Möglichkeit, Serializable schneller als Parcelable zu machen. Weitere Informationen finden Sie in der Antwort von Farhana in diesem Thread: stackoverflow.com/questions/3323074/…

    – A. Schewtschuk

    9. April 2020 um 7:51 Uhr

Benutzer-Avatar
Raffael Filipake

in kotlin, um die aktivität zu starten und einige daten zu übergeben, könnten sie so etwas versuchen:

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

Habe Spaß

  • und wie kann man Daten in einer anderen Klasse empfangen?

    – Vikash Parajuli

    30. März 2018 um 6:18 Uhr

1225780cookie-checkSo übergeben Sie ein benutzerdefiniertes Objekt über die Absicht in Kotlin

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy