如何扩展实现Parcelable接口的android类?

Akr*_*ram 12 inheritance android android-location

首先,我检查了这个答案.

我想要做的是扩展Location类调用它LocationPlus有一些成员变量.我想要实现的功能是将LocationPlus类的对象从一个活动传递到另一个活动.

这是我的 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];
    }
};
Run Code Online (Sandbox Code Playgroud)

我面临的问题是这个错误

Implicit super constructor Location() is undefined. Must explicitly invoke another constructor
Run Code Online (Sandbox Code Playgroud)

在尝试编写构造函数时

public LocationPlus(Parcel in) {
Run Code Online (Sandbox Code Playgroud)

有评论的人要求我发布LocationPlus类,所以在这里

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Min*_*in2 34

Parcelable,Speed King

根据谷歌工程师的说法,这段代码的运行速度要快得多.其中一个原因是我们明确了序列化过程而不是使用反射来推断它.理所当然,代码已经为此目的进行了大量优化.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用list添加到parcelable对象中的子类如下:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个孩子班:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在活动中:

 Intent intent = new Intent(LoginActivity.this, MainActivity.class);
 intent.putExtra("UserObject", parcelableObject);
 startActivity(intent);
 finish();
Run Code Online (Sandbox Code Playgroud)

在接收活动中:

Bundle extras = getIntent().getExtras();
 if (extras != null) {
      userObject = extras.getParcelable("UserObject");
 }
Run Code Online (Sandbox Code Playgroud)

  • @MuhammadSaqib `CREATOR` 对象用于从 Parcel 生成 Parcelable 类的实例。由于“BaseClass”是抽象的,因此无法实例化。顺便说一句,当基类和子类都可以实例化为“Parcel”时要小心。当你在写作和阅读时将它们混合在一起时,就会发生不好的事情。请参阅此处了解更多信息:https://idlesun.blogspot.com/2012/12/android-parcelable-example-3-subclass.html (3认同)

far*_*aya 5

嗨,我对此进行了大量研究,但找不到任何有用的东西。我尝试下面的解决方案,它为我工作。

假设您的超类只有一个名为“ mData”的int变量。

public class Location implements Parcelable {
 protected int mData;

 public int describeContents() {
     return 0;
 }

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

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

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

 private Location(Parcel in) {
     mData = in.readInt();
 }
Run Code Online (Sandbox Code Playgroud)

}

然后,您的扩展类只有一个名为“ mBattery”的int变量。

public class LocationPlus extends Location {
 protected int mBattery;

 public int describeContents() {
     return 0;
 }

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

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

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

 private LocationPlus(Parcel in) {
     mBattery = in.readInt();
 }
Run Code Online (Sandbox Code Playgroud)

}

到目前为止,LocationPlus可以正常工作。但是我们不设置超类的变量。首先,我使用super(..)方法在扩展类上设置超类的变量。但这没有用。

private LocationPlus(Parcel in) {
     super(in);
     mBattery = in.readInt();
 }
Run Code Online (Sandbox Code Playgroud)

代替上面的代码,您应该显式设置所有超类的变量。超级类的变量应受到保护。最终的构造函数应如下所示:

private LocationPlus(Parcel in) {
     mData = in.readIn();
     mBattery = in.readInt();
 }
Run Code Online (Sandbox Code Playgroud)

和writeToParcel方法应如下所示:

public void writeToParcel(Parcel out, int flags) {
     out.writeIn(mData);
     out.writeInt(mBattery);
 }
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 0

Location()根据 Android 文档, Location 类没有构造函数。初始化LocationPlus类时,您需要调用super(String provider)super(Location l)

编辑:更正语法

(请参阅位置 Android 文档