Domanda

ho ottenuto un'implementazione di Parcelable di lavoro per una singola classe che coinvolge alcuna eredità. Ho problemi capire il modo migliore per implementare l'interfaccia quando è venuto a eredità. Diciamo che ho ottenuto questo:

public abstract class A {
    private int a;
    protected A(int a) { this.a = a; }
}

public class B extends A {
    private int b;
    public B(int a, int b) { super(a); this.b = b; }
}

La domanda è, che è il metodo consigliato per implementare l'interfaccia Parcelable per la B (in A? In ciascuno di essi? Come?)

È stato utile?

Soluzione

Ecco la mia soluzione migliore, sarei felice di sentire da qualcuno che ha avuto un pensiero su di esso.

public abstract class A implements Parcelable {
    private int a;

    protected A(int a) {
        this.a = a;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(a);
    }

    protected A(Parcel in) {
        a = in.readInt();
    }
}

public class B extends A {
    private int b;

    public B(int a, int b) {
        super(a);
        this.b = b;
    }

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

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

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel out, int flags) {
        super.writeToParcel(out, flags);
        out.writeInt(b);
    }

    private B(Parcel in) {
        super(in);
        b = in.readInt();
    }
}

Altri suggerimenti

Questa è la mia variante. Penso che sia bello perché mostra la simmetria tra i metodi di lettura che rivalutazioni virtuali in modo molto chiaro.

Nota a margine:. Penso che Google ha fatto un lavoro davvero poveri a progettare l'interfaccia Parcelable

public abstract class A implements Parcelable {
    private int a;

    protected A(int a) {
        this.a = a;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(a);
    }

    public void readFromParcel(Parcel in) {
        a = in.readInt();
    }
}

public class B extends A {
    private int b;

    public B(int a, int b) {
        super(a);
        this.b = b;
    }

    public static final Parcelable.Creator<B> CREATOR = new Parcelable.Creator<B>() {
        public B createFromParcel(Parcel in) {
            B b = new B();
            b(in);
            return b;
        }

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

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel out, int flags) {
        super.writeToParcel(out, flags);
        out.writeInt(b);
    }

    public void readFromParcel(Parcel in) {
        super(in);
        b = in.readInt();
    }
}

Questa è l'implementazione per la classe A in un ambiente mondo reale dal momento che la classe B probabilmente avrà più di un oggetto con diversi tipi diversi int

Si utilizza la reflection per ottenere i tipi. quindi utilizza una funzione di ordinamento per ordinare i campi in modo che la lettura e la scrittura avvengono nello stesso ordine.

https://github.com/awadalaa/Android-Global-Parcelable

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top