2013-08-31 5 views
18

मैं एक इरादे से दूसरे Parcelable डेटा पास करने के कोशिश कर रहा हूँ और इस त्रुटि मैं हो रही है:Parcelable प्रोटोकॉल निर्माता कहा जाता है एक Parcelable.Creator वस्तु की आवश्यकता है (मैं निर्माता की क्या ज़रूरत है)

08-31 14:12:22.709: E/AndroidRuntime(9931): FATAL EXCEPTION: main 
08-31 14:12:22.709: E/AndroidRuntime(9931): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.matejsoftware.cardscoretracker/com.matejsoftware.cardscoretracker.Igra}: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.matejsoftware.cardscoretracker.Novaigra$Player 

बात है : मेरे पास पार्ससेल योग्य है। निर्माता वस्तु।

public class Player implements Parcelable{ 
    String name; 
    int score; 
    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(name); 
     dest.writeInt(score); 
    } 

    public Player(Parcel source){ 
     score = source.readInt(); 
     name = source.readString(); 
    } 

    public Player(int score, String name){ 
     this.score = score; 
     this.name = name; 
    } 
} 

public class MyCreator implements Parcelable.Creator<Player> { 

    @Override 
    public Player createFromParcel(Parcel source) { 
     return new Player(source); 
    } 

    @Override 
    public Player[] newArray(int size) { 
     return new Player[size]; 
    } 

} 

वहाँ किसी चीज़ निर्माता के साथ गलत है: मैं नीचे पूरे Parcelable कोड पोस्ट करेंगे? जैसे ही मैं अगली गतिविधि शुरू करने के लिए बटन क्लिक करता हूं, ऐप क्रैश हो जाता है।

इस तरह मैं "प्राप्त करें" दूसरी गतिविधि में Parcelable डेटा:

Player newPlayer = new Player(0, text); 
playersParceledData.add(newPlayer); 
zacniIgro.putParcelableArrayListExtra("parceledData", playersParceledData); 
+0

मैं ArrayList > उपयोग करने के लिए यह नहीं आप आसानी से उपयोग कर रहा गतिविधियों के बीच स्थानांतरित कर सकते हैं परिवर्तित करने के लिए की आवश्यकता है क्योंकि सिफारिश की:

static final Parcelable.Creator<Station> CREATOR = new Parcelable.Creator<Station>() { 
इस के लिए

:

मैं इस बदल getSeriasableExtra()। जैसा कि मैं आपका कोड देखता हूं, आपके पास स्टोर करने के लिए कोई जटिल डेटा नहीं है, इसलिए स्टोर करने के लिए एक विशेष POJO को क्रेट करने का कोई अर्थ नहीं है। –

+0

@ बिराजजलावाडिया क्या आप कृपया मुझे एक त्वरित उदाहरण दे सकते हैं कि मेरा कोड हैश मैप के साथ कैसा दिखता है? मैंने पहले कभी इसका उपयोग नहीं किया है और मैं वास्तव में आधिकारिक दस्तावेज़ों से इसका उपयोग कैसे नहीं कर सकता। – Guy

+0

आपकी 'प्लेयर' कक्षा स्थिर 'CREATOR' सदस्य घोषित नहीं करती है। यह केवल निर्माता वर्ग ('MyCreator') के कार्यान्वयन की घोषणा करता है। अनुक्रम को सही करने के अलावा, आपको 'CREATOR' सदस्य को 'प्लेयर' में जोड़ना होगा। – Les

उत्तर

27

आप अलग अलग अनुक्रम जब कर रहे हैं:

//global variable 
ArrayList<Player> playersParceledData; 

//This is in onCreate 
playersData = getIntent(); 
playersParceledData = playersData.getParcelableArrayListExtra("parceledData"); 

इसके अलावा, इस तरह मैं ParcelableArrayListExtra के लिए कक्षा वस्तुओं डाल है पार्सल से पढ़ने वाले व्यक्ति की तुलना में पढ़ना।

writeToParcel() में आप पहले स्ट्रिंग डाल रहे हैं लेकिन HeatFriendDetail(Parcel in) में, आप फाई आरएसटी पूर्णांक पढ़ें। यह सही तरीका नहीं है क्योंकि ऑर्डर या पढ़ना/लिखना मायने रखता है।

के बाद कोड है जो सही क्रम में आता है/जब लेखन पार्सल से/डाटा पढ़ने है (यह भी this link देखें):

public class FriendDetail implements Parcelable { 

    private String full_name; 
    private int privacy; 

    public HeatFriendDetail(Parcel in) { 
     this.full_name = in.readString(); 
     this.privacy = in.readInt(); 
    } 

    public HeatFriendDetail() { 

    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 

     dest.writeString(this.full_name); 
     dest.writeInt(this.privacy); 
    } 

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
     public HeatFriendDetail createFromParcel(Parcel in) { 
      return new HeatFriendDetail(in); 
     } 

     public HeatFriendDetail[] newArray(int size) { 
      return new HeatFriendDetail[size]; 
     } 
    }; 

    // GETTER SETTER// 
} 
+0

मैंने यह किया लेकिन मुझे अभी भी एक ही त्रुटि – Guy

+0

त्रुटि मिली ..? –

+0

java.lang.RuntimeException: गतिविधि शुरू करने में असमर्थ ComponentInfo {com.matejsoftware.cardscoretracker/com.matejsoftware.cardscoretracker.Igra}: android.os.BadParcelableException: पार्ससेल करने योग्य प्रोटोकॉल को एक पार्ससेल योग्य की आवश्यकता होती है। निर्माता com.matejsoftware पर CREATOR नामक निर्माता ऑब्जेक्ट। cardcoretracker.Novaigra $ Player – Guy

-1

इस तरह

// create List of player 
     ArrayList<HashMap<String, String>> players = new ArrayList<HashMap<String, String>>(); 

     //create Player 

     HashMap<String, String> player = new HashMap<String, String>(); 
     player.put("score", "20");//replace 20 with your score variable 
     player.put("name", "Biraj");//replace Biraj with your name variable 

     // Add to arraylist 

     players.add(player); 

     // pass to intent 

     Intent i; 
     i.putExtra("PLAYERS", players); 

     // read From intent 

     ArrayList<HashMap<String, String>> playerFromintent = (ArrayList<HashMap<String, String>>) getIntent().getSerializableExtra("PLAYERS"); 

     // read from ArrayList 

     for (HashMap<String, String> hashMap : playerFromintent) { 
      System.out.println("Name : " + hashMap.get("name")); 
      System.out.println("Score : " + hashMap.get("score")); 
     } 
1

मैं इस किया था प्रयास करें त्रुटि संदेश जब CREATOR वर्ग स्थिर नहीं था

2

बस इसमें भाग गया।

मेरे पास एक झुकाव था, और मैंने अपनी प्रोगार्ड मैपिंग फ़ाइल में देखा।

आम तौर पर मैं इस तरह निर्माता की घोषणा:

public static final Parcelable.Creator<ClassA> CREATOR = 
      new Parcelable.Creator<ClassA>() { 

जो इस तरह मैपिंग फ़ाइल में दिखाई देता है:

android.os.Parcelable$Creator CREATOR -> CREATOR 

एक वर्ग, वर्ग कि त्रुटि के साथ सूचना मिली थी के लिए ..except । मैं इसे इस तरह की घोषणा की:

public static Creator<ClassB> CREATOR = 
      new Creator<ClassB>() { 

लो और निहारना:

android.os.Parcelable$Creator CREATOR -> a 

इसलिए यदि आप अपने उत्पादन विज्ञप्ति में यह अपवाद हो रही है, अपने मैपिंग फ़ाइल की जाँच करें। मुझे लगता है कि ProGuard वास्तव में संवेदनशील है कि इसे कैसे रोकना नहीं है जब CREATOR घोषित किया जाता है।

4

मुझे यह त्रुटि केवल रिलीज एपीके में मिली, क्योंकि CREATOR सार्वजनिक नहीं था।

public static final Parcelable.Creator<Station> CREATOR = new Parcelable.Creator<Station>() { 
संबंधित मुद्दे