Extending a class that implements Parcelable

后端 未结 3 1863
太阳男子
太阳男子 2021-01-11 09:54

I have a class, we\'ll call it class A, that implements Parcelable.

I have a second class, we\'ll call it class B, that extends class A.

My question is:

相关标签:
3条回答
  • 2021-01-11 10:35

    It is a little complex, but the trick is to use Reflection to get the types of subclass's members and to sort the members so that you can read and write the data back in the same exact order using the proper types.

    I have implemented the solution for class A here: https://github.com/awadalaa/Android-Global-Parcelable

    so now you can make any class parcelable by simply extending this class.

    0 讨论(0)
  • 2021-01-11 10:44

    How do I write class B's member variables to the Parcel and then write it's parent class's (ie: class A's) member variables to the Parcel

    Class B overrides writeToParcel() from Class A, chaining to the superclass and also adding its own objects to the Parcel.

    (and, subsequently, read them in)?

    Class B implements public static final Parcelable.Creator<MyParcelable> CREATOR in such a way that it can let both classes read their stuff in. If you take the approach of creating a constructor on Class B that takes a Parcel as a constructor parameter, just chain to the superclass constructor (to let Class A do its work), then read Class B's data.

    The key will be to do them both in the same order. If you intend to let Class A read its data first, Class A must write its data first.

    Is there some nifty trick to not needing to rewrite class A's Parcel code?

    Inheritance and chaining to the superclass.

    0 讨论(0)
  • 2021-01-11 10:53

    Adding an example, the marked answer is indeed correct, but something more visual seems more suitable for this situation:

    This would be the supper class:

    public class BasePojo implements Parcelable {
    
        private String something;
    
        //what ever other constructor
    
        //getters and setters
    
        protected BasePojo(Parcel in) {
            something = in.readString();
        }
    
        public static final Creator<BasePojo> CREATOR = new Creator<BasePojo>() {
            @Override
            public BasePojo createFromParcel(Parcel in) {
                return new BasePojo(in);
            }
    
            @Override
            public BasePojo[] newArray(int size) {
                return new BasePojo[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel parcel, int i) {
            parcel.writeString(something);
        }
    
    }
    

    And then this would be the child class:

    public class ChildPojo extends BasePojo implements Parcelable {
    
        private int somethingElse;
    
        //what ever other constructor
    
        //getters and setters
    
        protected ChildPojo(Parcel in) {
            super(in);
            somethingElse = in.readInt();
        }
    
        public static final Creator<ChildPojo> CREATOR = new Creator<ChildPojo>() {
            @Override
            public ChildPojo createFromParcel(Parcel in) {
                return new ChildPojo(in);
            }
    
            @Override
            public ChildPojo[] newArray(int size) {
                return new ChildPojo[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel parcel, int i) {
            super.writeToParcel(parcel, i);
            parcel.writeInt(somethingElse);
        }
    
    }
    

    The marked answer provides a very good explanation, calling super is the key.

    0 讨论(0)
提交回复
热议问题