web-dev-qa-db-ja.com

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
}

Kotlinを使用してインテントを介してPeopleタイプのPeopleオブジェクトを渡すために上記のコードを試しましたが、エラーが発生しました。これを解決してください。

21
Ankit Kumar

まず、Serializable- sクラスに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 = getIntent().getExtras().getSerializableExtra(EXTRA_PEOPLE) as? People
30
A. Shevchuk

オブジェクトに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
15
fireb86

これを行うより良い方法を見つけました:

あなたのgradleで:

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

Android {
    androidExtensions {
        experimental = true
    }
}

データクラスで:

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

ソースアクティビティ:

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

宛先アクティビティ:

student = intent.getParcelableExtra("student_id")
7
Ankit Kumar

この投稿は、あなたが何をしようとしているかに役立つかもしれません:

KotlinでAndroidにParcelableデータクラスを作成する便利な方法はありますか?

基本的に、kotlinはいくつかの小さな追加機能を提供します。

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

詳細については、投稿を参照してください。

2
Javatar

Parcelableを使用して1つのアクティビティを別のアクティビティに渡すより良い方法を見つけました。シリアル化よりも高速です Android:ParcelableとSerializableの違い?

最初にbuild.gradle(app)内にこのコード行を追加します

Android{
    androidExtensions {
            experimental = true
        }
}

here から回答を得ています

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

インテントで渡す--->

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

インテントから取得--->

val model: Model = intent.getParcelableExtra(EXTRA)
2
Ashik Azeez

kotlinでアクティビティを開始してデータを渡すには、次のようなものを試してみてください。

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

楽しい

0
Rafael Filipake

Peopleクラスは、次のようにParcelableを実装する必要があります。

class People(): Parcelable{
// stuff


}

Androidスタジオにエラーが表示されます。カーソルを「People」に移動し、Alt + Enterキーを押します。これで、Parcelable実装を生成するオプションが表示されます。

この生成されたコードには次のようなものが含まれます

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

そしてどこか他の

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

すべてのメンバーがこれらのメソッドに含まれていることを確認し、それを変更するときは、読み取りと書き込みがまったく同じ順序で行われていることを確認してください。

0
A. Kuchinke