Android-实现内部可包裹类 [英] Android - Implementing Parcelable Inner Class
问题描述
我知道如何使用公共变量实现一个简单的Parcelable类,但是下面的类要复杂一些.在此类具有内部类和ListEntity的情况下,如何实现Parcelable接口?我什至不知道如何开始.任何有关如何执行此操作的详细信息将不胜感激.
import android.os.Parcel;
import android.os.Parcelable;
import java.util.List;
public class ResponsePlaceSearch implements Parcelable {
// *** Parcelable methods are shown below (Begin) ***
protected ResponsePlaceSearch(Parcel in) {
}
public static final Creator<ResponsePlaceSearch> CREATOR = new Creator<ResponsePlaceSearch>() {
@Override
public ResponsePlaceSearch createFromParcel(Parcel in) {
return new ResponsePlaceSearch(in);
}
@Override
public ResponsePlaceSearch[] newArray(int size) {
return new ResponsePlaceSearch[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
// *** (End) ***
private List<ListEntity> list;
public void setList(List<ListEntity> list) {
this.list = list;
}
public List<ListEntity> getList() {
return list;
}
public static class ListEntity {
private int id;
private String name;
private CoordEntity coord;
private int dt;
private WindEntity wind;
private SysEntity sys;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setCoord(CoordEntity coord) {
this.coord = coord;
}
public void setDt(int dt) {
this.dt = dt;
}
public void setWind(WindEntity wind) {
this.wind = wind;
}
public void setSys(SysEntity sys) {
this.sys = sys;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public CoordEntity getCoord() {
return coord;
}
public int getDt() {
return dt;
}
public WindEntity getWind() {
return wind;
}
public SysEntity getSys() {
return sys;
}
public static class CoordEntity {
private double lon;
private double lat;
public void setLon(double lon) {
this.lon = lon;
}
public void setLat(double lat) {
this.lat = lat;
}
public double getLon() {
return lon;
}
public double getLat() {
return lat;
}
}
public static class WindEntity {
private double speed;
private double deg;
public void setSpeed(double speed) {
this.speed = speed;
}
public void setDeg(double deg) {
this.deg = deg;
}
public double getSpeed() {
return speed;
}
public double getDeg() {
return deg;
}
}
public static class SysEntity {
private String country;
public void setCountry(String country) {
this.country = country;
}
public String getCountry() {
return country;
}
}
}
}
您只需要为每个内部类(ListEntity,SysEntity等)实现Parcelable接口,因此所有包含它们的类和它们的类都实现了Parcelable. /p>
然后使用
将类添加到包裹中public final void writeParcelable (Parcelable p, int parcelableFlags)
其中p是内部类的实例.
这是一个如何包裹内部类的例子:
public class SampleParcelable implements Parcelable {
public static class InnerClass implements Parcelable {
private String mInnerString;
private long mInnerLong;
// parcelable interface
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mInnerString);
dest.writeLong(mInnerLong);
}
public static final Creator<InnerClass> CREATOR = new Creator<InnerClass>() {
public InnerClass createFromParcel(Parcel in) {
return new InnerClass(in);
}
public InnerClass[] newArray(int size) {
return new InnerClass[size];
}
};
private InnerClass(Parcel in) {
mInnerString = in.readString();
mInnerLong = in.readLong();
}
}
private String mString;
private long mLong;
private InnerClass mInnerClass;
// parcelable interface
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mString);
dest.writeLong(mLong);
dest.writeParcelable(mInnerClass, flags);
}
public static final Creator<SampleParcelable> CREATOR = new Creator<SampleParcelable>() {
public SampleParcelable createFromParcel(Parcel in) {
return new SampleParcelable(in);
}
public SampleParcelable[] newArray(int size) {
return new SampleParcelable[size];
}
};
private SampleParcelable(Parcel in) {
mString = in.readString();
mLong = in.readLong();
mInnerClass = in.readParcelable(InnerClass.class.getClassLoader());
}
}
I know how to implement a simple Parcelable class with public variables but the class below is somewhat more complex. How can I implement the Parcelable interface given that this class has an inner class and ListEntity? I'm not even sure how to begin. Any detailed information on how to do this would be greatly appreciated.
import android.os.Parcel;
import android.os.Parcelable;
import java.util.List;
public class ResponsePlaceSearch implements Parcelable {
// *** Parcelable methods are shown below (Begin) ***
protected ResponsePlaceSearch(Parcel in) {
}
public static final Creator<ResponsePlaceSearch> CREATOR = new Creator<ResponsePlaceSearch>() {
@Override
public ResponsePlaceSearch createFromParcel(Parcel in) {
return new ResponsePlaceSearch(in);
}
@Override
public ResponsePlaceSearch[] newArray(int size) {
return new ResponsePlaceSearch[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
// *** (End) ***
private List<ListEntity> list;
public void setList(List<ListEntity> list) {
this.list = list;
}
public List<ListEntity> getList() {
return list;
}
public static class ListEntity {
private int id;
private String name;
private CoordEntity coord;
private int dt;
private WindEntity wind;
private SysEntity sys;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setCoord(CoordEntity coord) {
this.coord = coord;
}
public void setDt(int dt) {
this.dt = dt;
}
public void setWind(WindEntity wind) {
this.wind = wind;
}
public void setSys(SysEntity sys) {
this.sys = sys;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public CoordEntity getCoord() {
return coord;
}
public int getDt() {
return dt;
}
public WindEntity getWind() {
return wind;
}
public SysEntity getSys() {
return sys;
}
public static class CoordEntity {
private double lon;
private double lat;
public void setLon(double lon) {
this.lon = lon;
}
public void setLat(double lat) {
this.lat = lat;
}
public double getLon() {
return lon;
}
public double getLat() {
return lat;
}
}
public static class WindEntity {
private double speed;
private double deg;
public void setSpeed(double speed) {
this.speed = speed;
}
public void setDeg(double deg) {
this.deg = deg;
}
public double getSpeed() {
return speed;
}
public double getDeg() {
return deg;
}
}
public static class SysEntity {
private String country;
public void setCountry(String country) {
this.country = country;
}
public String getCountry() {
return country;
}
}
}
}
You simply need to implement the Parcelable interface for each inner class (ListEntity, SysEntity, ...), so all classes and classes they contain implement Parcelable.
Then you add the class to the parcel using
public final void writeParcelable (Parcelable p, int parcelableFlags)
where p is the instance of your inner class.
Edit: here's an example of how to parcel an inner class:
public class SampleParcelable implements Parcelable {
public static class InnerClass implements Parcelable {
private String mInnerString;
private long mInnerLong;
// parcelable interface
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mInnerString);
dest.writeLong(mInnerLong);
}
public static final Creator<InnerClass> CREATOR = new Creator<InnerClass>() {
public InnerClass createFromParcel(Parcel in) {
return new InnerClass(in);
}
public InnerClass[] newArray(int size) {
return new InnerClass[size];
}
};
private InnerClass(Parcel in) {
mInnerString = in.readString();
mInnerLong = in.readLong();
}
}
private String mString;
private long mLong;
private InnerClass mInnerClass;
// parcelable interface
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mString);
dest.writeLong(mLong);
dest.writeParcelable(mInnerClass, flags);
}
public static final Creator<SampleParcelable> CREATOR = new Creator<SampleParcelable>() {
public SampleParcelable createFromParcel(Parcel in) {
return new SampleParcelable(in);
}
public SampleParcelable[] newArray(int size) {
return new SampleParcelable[size];
}
};
private SampleParcelable(Parcel in) {
mString = in.readString();
mLong = in.readLong();
mInnerClass = in.readParcelable(InnerClass.class.getClassLoader());
}
}
这篇关于Android-实现内部可包裹类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!