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)
嗨,我对此进行了大量研究,但找不到任何有用的东西。我尝试下面的解决方案,它为我工作。
假设您的超类只有一个名为“ 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)
Location()根据 Android 文档, Location 类没有构造函数。初始化LocationPlus类时,您需要调用super(String provider)或super(Location l)。
编辑:更正语法
(请参阅位置 Android 文档)
| 归档时间: |
|
| 查看次数: |
14490 次 |
| 最近记录: |