2016-02-07 5 views
9

कोटलिन आरसी की रिहाई के साथ, मैंने इसे सीखने के लिए एक ऐप लिखना शुरू किया, हालांकि मैं यह समझ नहीं सकता कि Parcelable को काम करने के लिए कैसे प्राप्त किया जाए।कोटलिन में एंड्रॉइड पार्ससेलबल: CREATOR पार्ससेल योग्य डेटा क्लास पर नहीं मिला

डेटा वर्ग:

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 संस्करण: 1.0.0-RC-1036

Kotlin प्लगइन संस्करण: 1.0.0-rc-1036-IJ143-4

कोड देखा जा सकता है @https://github.com/eggman87/circle-kotlin

उत्तर

17

Kotlin आर सी पहले से गिरा सभी साथी ऑब्जेक्ट गुणों के लिए स्थिर फ़ील्ड की बहिष्कृत पीढ़ी (this answer में और जानें)।

अब केवल const, lateinit या @JvmField द्वारा चिह्नित किए गए एक स्थिर फ़ील्ड उत्पन्न होंगे।

आपको val CREATOR@JvmField एनोटेशन द्वारा एनोटेट करने की आवश्यकता है क्योंकि एंड्रॉइड फ्रेमवर्क आपकी कक्षा में स्थिर क्षेत्र CREATOR की अपेक्षा करता है।

+0

इस मामले में समस्या जिस तरह से आप हो रही है में हो रहा है * EXTRA_PROJECT *, बस intent.extras.get (EXTRA_PROJECT) पर कॉल करें लेकिन समस्या पार्सेलियल परिभाषा में नहीं है, आपको इसे जोड़ने की आवश्यकता नहीं है। – Juancho

+0

@juancho, मैं मानता हूं कि, संभवतः, 'पार्सेलबल' के साथ काम करने का कोई अन्य तरीका ओपी में समस्या का कारण नहीं बनता है (और मैं इसे पुन: पेश नहीं कर सका)। लेकिन अनुपस्थित स्थिर क्षेत्र की वजह से अपवाद निश्चित रूप से फेंक दिया गया है, और उत्तर इसे हल करता है। यही कारण है कि मैंने इसे रद्द करने का फैसला किया। क्या आप समस्या को पुन: पेश कर सकते हैं और जांच सकते हैं कि क्या यह हल करता है? अगर ऐसा होता है, तो मुझे लगता है कि यह एक बेहतर जवाब होगा। – hotkey

+0

मैं क्लोन और प्रोजेक्ट का परीक्षण करता हूं और हां यह इस जेवीएमफ़ील्ड के बारे में है। मैं थोड़ा उलझन में हूं कि मुझे अपने प्रोजेक्ट में एक ही समस्या का सामना क्यों नहीं आ रहा है। इसके अलावा मैंने अपनी परियोजना में एक ही त्रुटि प्राप्त करने की कोशिश की लेकिन कुछ भी नहीं। भ्रम से बचने के लिए मैं अपनी टिप्पणियों को हटा दूंगा। धन्यवाद :) ! – Juancho

1

यहाँ आप कुछ उपयोगी Kotlin विस्तार कार्यों आप अपने CREATOR रों बनाने के लिए मदद मिलेगी और भी कुछ उदाहरण (डेटा वर्गों और सूची का उपयोग कर डेटा वर्ग के अंदर)

Gist: Data Class & Parcelables example

मैं इस का उपयोग कर रहा है किसी Android ऐप्लिकेशन में कोड: (link)

एक ही कोड आप इसे यहाँ पा सकते हैं: (link)

+0

यह कोड संभवतः उसी कारण से असफल हो जाएगा यदि कोटलिन आरसी के साथ संकलित किया गया है ('वैल क्रिएटर' की वजह से अब स्थिर नहीं है)। क्या आपने इसे देखा? – hotkey

+0

मैं इसे अपने ऐप में आरसी के साथ उपयोग कर रहा हूं। क्या आपने कोशिश की? – Juancho

+0

ठीक है, मैं इसे जल्द ही देखूंगा। – hotkey

संबंधित मुद्दे