How to extend android class which implements Parcelable interface?

android, android-location, inheritance

Solution

Parcelable, the Speed King

According to google engineers, this code will run significantly faster. One of the reasons for this is that we are being explicit about the serialization process instead of using reflection to infer it. It also stands to reason that the code has been heavily optimized for this purpose.

public abstract class BaseClass implements Parcelable {

    public String FullName;
    public boolean IsValidUser;
    public String UserName;


    public BaseClass () {
    }


    protected BaseClass(Parcel in) {
        FullName = in.readString();
        IsValidUser = in.readByte() != 0;
        UserName = in.readString();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(FullName);
        dest.writeByte((byte) (IsValidUser ? 1 : 0));
        dest.writeString(UserName);
    }
}

Child class will be as follows with usage of list adding into parcelable object:

public class DerivedClass extends BaseClass {

    public boolean IsSuccess;
    public String Message;
    public List<AnotherClass> AnotherClassObj;


    public DerivedClass () {
        super();
    }

    protected DerivedClass(Parcel in) {
        super(in);
        AnotherClassObj = new ArrayList<AnotherClass>();
        IsSuccess = in.readByte() != 0;
        Message = in.readString();
        AnotherClassObj = in.readArrayList(AnotherClass.class.getClassLoader());
    }

    public static final Creator<DerivedClass> CREATOR = new Creator<DerivedClass>() {
        @Override
        public DerivedClass createFromParcel(Parcel in) {
            return new DerivedClass(in);
        }

        @Override
        public DerivedClass[] newArray(int size) {
            return new DerivedClass[size];
        }
    };

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeByte((byte) (IsSuccess ? 1 : 0));
        dest.writeString(Message);
        dest.writeList(AnotherClassObj);
    }

    public int describeContents() {
        return 0;
    }
}

Another child class :

public class AnotherClass extends BaseClass {
    public AnotherClass() {
        super();
    }

    protected AnotherClass(Parcel in) {
        super(in);
    }

    public int describeContents() {
        return 0;
    }

    public static final Creator<AnotherClass> CREATOR = new Creator<AnotherClass>() {
        @Override
        public AnotherClass createFromParcel(Parcel in) {
            return new AnotherClass(in);
        }

        @Override
        public AnotherClass[] newArray(int size) {
            return new AnotherClass[size];
        }
    };

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
    }
}

In Activity:

 Intent intent = new Intent(LoginActivity.this, MainActivity.class);
 intent.putExtra("UserObject", parcelableObject);
 startActivity(intent);
 finish();

In receiving activity:

Bundle extras = getIntent().getExtras();
 if (extras != null) {
      userObject = extras.getParcelable("UserObject");
 }

Problem

First of all i have check this answer. What i am trying to do is extending `Location` class calling it `LocationPlus` which has some member variables. functionality i am trying to achieve is pass the object of `LocationPlus` class from one activity to another. Here is my `CREATOR` ``` public static final Parcelable.Creator<LocationPlus> CREATOR = new Parcelable.Creator<LocationPlus>() { @Override public LocationPlus createFromParcel(Parcel source) { return new LocationPlus(source); } @Override public LocationPlus[] newArray(int size) { return new LocationPlus[size]; } }; ``` problem i am facing is this error ``` Implicit super constructor Location() is undefined. Must explicitly invoke another constructor ``` when trying to write constructor ``` public LocationPlus(Parcel in) { ``` Someone in comment ask me to post LocationPlus class so here it is ``` public class LocationPlus extends Location{ private int mBattery = -1; public LocationPlus(String locationName) { super(locationName); } public LocationPlus(Location location) { super(location); } public int getmBattery() { return mBattery; } public void setmBattery(int mBattery) { this.mBattery = mBattery; } @Override public int describeContents() { return 0; } public static final Parcelable.Creator<LocationPlus> CREATOR = new Parcelable.Creator<LocationPlus>() { @Override public LocationPlus createFromParcel(Parcel source) { return new LocationPlus(source); } @Override public LocationPlus[] newArray(int size) { return new LocationPlus[size]; } }; @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(mBattery); } public LocationPlus(Parcel in) { mBattery =in.readInt(); } } ```

Original source

Related problems