69

インターフェイスを実装するクラスがありParcelableます:

class A implements Parcelable {

}

オブジェクトをインスタンス変数としてB含む別のクラスがあります。内部クラスでA、オブジェクトを次のように書き込みたい:writeToPacelBBParcel

class B implements Parcelable{

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

どのように書き、読むことができますか?

4

3 に答える 3

173
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());
于 2012-09-02T20:37:48.077 に答える
11

リフレクションを回避するためにこれを処理するより良い方法は、次のようにターゲット型で静的クリエーターを単純に呼び出すことです。

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

Parcelableそれをusingに書き込みますthis.amazingObject.writeToParcel(Parcel, int)

内部的に、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);
}

ご覧のとおり、そのメソッドの最後の呼び出しは単に右を呼び出しているだけです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);
    }

}
于 2014-09-15T15:47:31.887 に答える
2

この線:

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

次のように変更する必要があります。

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

私は同じ問題に遭遇し、いくつかの Google 検索を行いました。多くの Web ページまたはチュートリアルA.class.getClassLoader()では、A にキャストしているため使用することが提案されていますが、実際には null 値を取得するため間違っていB.class.getClassLoader()ますcodes are INSIDE class B。. 理由はわかりませんでしたが、この方法で正しい A オブジェクトを取得できます。

コメントと検証へようこそ!!

于 2014-02-07T06:01:41.070 に答える