2016-02-07 21 views
9

コトルリンRCのリリースで、私はそれを学ぶためにアプリを書いて始めましたが、Parcelableを取得する方法を見つけることができません。アンドロイドパーセルケットリンで:作成者がパーセルブルデータクラスに見つかりません

データクラス:

それを読む
data class Project (val reponame:String, 
       val username:String, 
       val language:String, 
       val vcsUrl:String, 
       val branches:Map<String, Branch>) : Parcelable { 

    companion object { 
     val CREATOR = object : Parcelable.Creator<Project> { 
      override fun createFromParcel(`in`: Parcel): Project { 
       return Project(`in`) 
      } 

      override fun newArray(size: Int): Array<Project?> { 
       return arrayOfNulls(size) 
      } 
     } 
    } 

    protected constructor(parcelIn: Parcel) : this (
      parcelIn.readString(), 
      parcelIn.readString(), 
      parcelIn.readString(), 
      parcelIn.readString(), 
      mapOf<String, Branch>().apply { 
       parcelIn.readMap(this, Branch::class.java.classLoader) 
      } 
    ) 

    override fun describeContents(): Int { 
     throw UnsupportedOperationException() 
    } 

    override fun writeToParcel(dest: Parcel, flags: Int) { 
     dest.writeString(reponame) 
     dest.writeString(username) 
     dest.writeString(language) 
     dest.writeString(vcsUrl) 
     dest.writeMap(branches) 
    } 

} 

class ProjectDetailActivity : BaseActivity() { 

    lateinit var project: Project 

    companion object { 
     const val EXTRA_PROJECT = "extra_project" 
    } 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 

     project = intent.extras.getParcelable(EXTRA_PROJECT) 

     tvTitle.text = project.reponame 
    } 
} 

例外:

Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.eggman.circleciandroid.model.Project 
    at android.os.Parcel.readParcelableCreator(Parcel.java:2415) 
    at android.os.Parcel.readParcelable(Parcel.java:2337) 
    at android.os.Parcel.readValue(Parcel.java:2243) 
    at android.os.Parcel.readArrayMapInternal(Parcel.java:2592) 
    at android.os.BaseBundle.unparcel(BaseBundle.java:221) 
    at android.os.BaseBundle.get(BaseBundle.java:281) 
    at com.eggman.circleciandroid.ui.ProjectDetailActivity.onCreate(ProjectDetailActivity.kt:22) 

私はそれが私が行方不明です単純なものであると確信している、誰が持っていました最新のKotlinでParcelableの成功?

Kotlinバージョン:1.0.0-RC-1036

Kotlinプラグインのバージョン:1.0.0-RC-1036-IJ143-4

コードがKotlin RCは、以前に落としhttps://github.com/eggman87/circle-kotlin

答えて

17

@閲覧可能ですすべてのコンパニオンオブジェクトプロパティの非推奨の静的フィールドの生成(詳細はthis answerを参照)。

constlateinitまたは@JvmFieldでマークされたものだけが、静的フィールドを生成します。

val CREATOR@JvmFieldアノテーションにアノテーションを付ける必要があります。Android Frameworkはクラス内に静的フィールドCREATORを想定しているためです。ここで

+0

をこの場合の問題は、あなたが得ている方法であると思われます* EXTRA_PROJECT *は、intent.extras.get(EXTRA_PROJECT)を呼び出すだけで問題はParcelable定義にないので、これを追加する必要はありません。 – Juancho

+0

@juancho、私は、おそらく、Parcelableで作業するいくつかの他の方法がOPの問題を引き起こさないことに同意します(そして私はそれを再現できませんでした)。しかし、静的フィールドがないために例外がスローされ、その答えによって解決されます。だから私はそれを元に戻すことにしました。問題を再現し、これが解決するかどうか確認してください。そうすれば、より良い答えになると思います。 – hotkey

+0

私はプロジェクトをクローンしてテストしています。はい、このJvmFieldに関するものです。私は私のプロジェクトで同じ問題に直面していない理由を少し混乱させます。また、プロジェクトで同じエラーが発生しましたが、何もしませんでした。私はただの混乱を避けるために私のコメントを削除します。ありがとう:)! – Juancho

1

は、あなたがあなたのCREATOR Sを作成するのに役立ついくつかの有用なKotlin拡張機能もいくつかの例(データクラス内のデータクラスとリストを使用して)

Gist: Data Class & Parcelables example

私はこれを使用していますがありますAndroidのAppのコード:あなたはここでそれを見つけることができます(link)

同じコード:(link)

+0

このコードはKotlin RC( 'val CREATOR'がもう静的ではないため)でコンパイルした場合、同じ理由で失敗するでしょう。あなたはそれを確認しましたか? – hotkey

+0

私はRCで私のアプリでそれを使用しています。あなたはそれを試しましたか? – Juancho

+0

さて、すぐに確認します。 – hotkey

関連する問題