2012-09-02 11 views
49

को Parcelable की एक उप वर्ग लिखें मैं एक वर्ग कि Parcelable इंटरफ़ेस लागू करता है। writeToPacel अंदर वर्ग B में, मैं Parcel करने के लिए वस्तु B लिखना चाहते हैं:एक और पार्सल

class B implements Parcelable{ 

    public void writeToParcel(Parcel dest, int flags) { 
     dest.write ??? 
    } 
} 

मैं लिख सकते हैं और यह पढ़ सकते हैं कैसे?

+0

'बी के अंदर एक object' कहां है? – iTurki

उत्तर

143
class B implements Parcelable{ 
//lets assume you have A as a data member 

A obj; 
public void writeToParcel(Parcel dest, int flags) { 

     dest.writeParcelable(obj , flags); 

    } 
} 

आप इसे इस

obj = in.readParcelable(A.class.getClassLoader()); 
+0

मैं इस कोड को सहायक करता हूं .... !!!!!!!!!!!!! –

+5

कास्टिंग करने की कोई आवश्यकता नहीं :) – pablisco

+4

आप और भी सटीक हो सकते हैं: 'obj = (ए) में पढ़ा गया पार्ससेलबल (A.class.getClassLoader());' – caw

2

पंक्ति का उपयोग पढ़ना चाहते हैं:

obj = (A)in.readParcelable(B.class.getClassLoader()); 

मैं एक ही समस्या हुई है और क्या किया:

obj = (A)in.readParcelable(A.class.getClassLoader()); 

में बदल जानी चाहिए कई Google खोज, कई वेबपृष्ठ या ट्यूटोरियल सुझाव देते हैं हम A.class.getClassLoader() का उपयोग करते हैं क्योंकि हम ए को कास्टिंग कर रहे हैं, लेकिन असल में यह गलत है क्योंकि आपको शून्य मान मिलेगा, हमें B.class.getClassLoader() का उपयोग करना चाहिए क्योंकि codes are INSIDE class B। मुझे अभी नहीं पता था कि क्यों यह सही एक वस्तु को इस तरह से प्राप्त कर सकता है।

टिप्पणी और सत्यापन में आपका स्वागत है !!

10

एक बेहतर तरीका यह है कि परछाई से बचा जाता है हो सकता है संभाल करने के लिए बस इस तरह लक्ष्य प्रकार में स्थिर निर्माता कॉल करने के लिए:

this.amazingObject = AmazingObject.CREATOR.createFromParcel(in); 

और this.amazingObject.writeToParcel(Parcel, int)

आंतरिक रूप से, का उपयोग करते समय Parcelable को यह लिखना readParcelable(ClassLoader) बुला होता है:

public final <T extends Parcelable> T readParcelable(ClassLoader loader) { 
    Parcelable.Creator<T> creator = readParcelableCreator(loader); 
    if (creator == null) { 
     return null; 
    } 
    if (creator instanceof Parcelable.ClassLoaderCreator<?>) { 
     return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader); 
    } 
    return creator.createFromParcel(this); 
} 

आपको लगता है कि विधि का आखिरी कॉल देख सकते हैं j है ust सही Creator पर कॉल कर रहा है लेकिन readParcelableCreator के अंदर एक बहुत सारे प्रतिबिंब है कि हम इसे सीधे कॉल करके बच सकते हैं।

यह उपयोगिता कॉल उपयोगी हो सकता है:

import android.os.Parcel; 
import android.os.Parcelable; 

public class Parcels { 

    public static void writeBoolean(Parcel dest, Boolean value) { 
     dest.writeByte((byte) (value != null && value ? 1 : 0)); 
    } 

    public static Boolean readBoolean(Parcel in){ 
     return in.readByte() != 0; 
    } 

    public static void writeParcelable(Parcel dest, int flags, Parcelable parcelable) { 
     writeBoolean(dest, parcelable == null); 
     if (parcelable != null) { 
      parcelable.writeToParcel(dest, flags); 
     } 
    } 

    public static <T extends Parcelable> T readParcelable(Parcel in, Parcelable.Creator<T> creator) { 
     boolean isNull = readBoolean(in); 
     return isNull ? null : creator.createFromParcel(in); 
    } 

} 
+1

ऑब्जेक्ट शून्य होने पर यह एक अपवाद फेंकता है, जबकि 'readParcelable' 'इस स्थिति को सही तरीके से संभालता है – dragoon

+0

@dragoon आपको क्या अपवाद मिलता है? – pablisco

+0

मैं अपना खुद का पार्सल यूटिल का उपयोग कर समाप्त करता हूं लेकिन प्रेरणा के लिए धन्यवाद! – Juancho

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