2012-09-02 11 views
49

にParcelableのサブクラスを書きます。 writeToPacel内部クラスBでは、私はParcelにオブジェクトBを書きたい:私は<code>Parcelable</code>インタフェースを実装するクラスを有する別のパーセル

class B implements Parcelable{ 

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

がどのように書いて、それを読むことができますか?

+0

はどこBの内側 '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)in readParcelable(A.class.getClassLoader());' – caw

2

ラインを使用読みたい場合:私は同じ問題に遭遇していた

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

:に

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

を変更する必要がありますいくつかのGoogleの検索、多くのWebページやチュートリアルの示唆私たちはAにキャストしているのでA.class.getClassLoader()を使用しますが、実際にはヌル値を取得するので誤っています。があるため、B.class.getClassLoader()を使用する必要があります。私はちょうど理由を知らなかったが、この方法で正しいAオブジェクトを得ることができる。

ようこそ!

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であります右を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

オブジェクトがnullのときに例外をスローしますが、 '' readParcelable''はこの状況を正しく処理します。 – dragoon

+0

@dragoon例外はありますか? – pablisco

+0

私は自分のParcel Utilを使用しますが、インスピレーションに感謝します! – Juancho

関連する問題