Java Android:可通过继承进行打包
现在,我有三个类,基类是Java Android:可通过继承进行打包,java,android,inheritance,parcelable,Java,Android,Inheritance,Parcelable,现在,我有三个类,基类是BaseWidget,它实现了Parcelable,两个子类是SelectWidget和TextWidget。然后,我使用名为WidgetInfo(还实现了Parcelable)的类来保存BaseWidget或SelectWidget或TextWidget对象的列表 当我将WidgetInfo对象放入Intent以启动TestActivity时,我在TestActivity中收到了WidgetInfo,但列表的所有元素(在WidgetInfo中)都转换为BaseWidge
BaseWidget
,它实现了Parcelable
,两个子类是SelectWidget
和TextWidget
。然后,我使用名为WidgetInfo
(还实现了Parcelable
)的类来保存BaseWidget
或SelectWidget
或TextWidget
对象的列表
当我将WidgetInfo
对象放入Intent
以启动TestActivity
时,我在TestActivity
中收到了WidgetInfo
,但列表的所有元素(在WidgetInfo
中)都转换为BaseWidget
对象。并且子类对象成员变量丢失。什么是问题
BaseWidget.java:
public class BaseWidget implements Parcelable{
private String name;
public BaseWidget() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected BaseWidget(Parcel in) {
this.name = in.readString();
}
public static final Creator<BaseWidget> CREATOR = new Creator<BaseWidget>() {
@Override
public BaseWidget createFromParcel(Parcel in) {
return new BaseWidget(in);
}
@Override
public BaseWidget[] newArray(int size) {
return new BaseWidget[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
}
}
public class TextWidget extends BaseWidget{
private String width = "100";
public TextWidget() {
}
public String getWidth() {
return width;
}
public void setWidth(String width) {
this.width = width;
}
protected TextWidget(Parcel in) {
super(in);
width = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(width);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<TextWidget> CREATOR = new Creator<TextWidget>() {
@Override
public TextWidget createFromParcel(Parcel in) {
return new TextWidget(in);
}
@Override
public TextWidget[] newArray(int size) {
return new TextWidget[size];
}
};
}
public class SelectWidget extends BaseWidget{
private int height = 200;
public SelectWidget() {
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
protected SelectWidget(Parcel in) {
super(in);
height = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(height);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<SelectWidget> CREATOR = new Creator<SelectWidget>() {
@Override
public SelectWidget createFromParcel(Parcel in) {
return new SelectWidget(in);
}
@Override
public SelectWidget[] newArray(int size) {
return new SelectWidget[size];
}
};
}
公共类BaseWidget实现可包裹{
私有字符串名称;
公共BaseWidget(){
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
受保护的BaseWidget(包裹中){
this.name=in.readString();
}
公共静态最终创建者=新创建者(){
@凌驾
public BaseWidget createFromParcel(地块中){
返回新的BaseWidget(在中);
}
@凌驾
公共BaseWidget[]新数组(整数大小){
返回新的BaseWidget[大小];
}
};
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地书面记录(名称);
}
}
TextWidget.java:
public class BaseWidget implements Parcelable{
private String name;
public BaseWidget() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected BaseWidget(Parcel in) {
this.name = in.readString();
}
public static final Creator<BaseWidget> CREATOR = new Creator<BaseWidget>() {
@Override
public BaseWidget createFromParcel(Parcel in) {
return new BaseWidget(in);
}
@Override
public BaseWidget[] newArray(int size) {
return new BaseWidget[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
}
}
public class TextWidget extends BaseWidget{
private String width = "100";
public TextWidget() {
}
public String getWidth() {
return width;
}
public void setWidth(String width) {
this.width = width;
}
protected TextWidget(Parcel in) {
super(in);
width = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(width);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<TextWidget> CREATOR = new Creator<TextWidget>() {
@Override
public TextWidget createFromParcel(Parcel in) {
return new TextWidget(in);
}
@Override
public TextWidget[] newArray(int size) {
return new TextWidget[size];
}
};
}
public class SelectWidget extends BaseWidget{
private int height = 200;
public SelectWidget() {
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
protected SelectWidget(Parcel in) {
super(in);
height = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(height);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<SelectWidget> CREATOR = new Creator<SelectWidget>() {
@Override
public SelectWidget createFromParcel(Parcel in) {
return new SelectWidget(in);
}
@Override
public SelectWidget[] newArray(int size) {
return new SelectWidget[size];
}
};
}
公共类TextWidget扩展BaseWidget{
专用字符串宽度=“100”;
公共TextWidget(){
}
公共字符串getWidth(){
返回宽度;
}
公共void setWidth(字符串宽度){
这个。宽度=宽度;
}
受保护的TextWidget(包裹中){
超级(in),;
宽度=in.readString();
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
超级可写包裹(目的地、旗帜);
目的写入限制(宽度);
}
@凌驾
公共int描述内容(){
返回0;
}
公共静态最终创建者=新创建者(){
@凌驾
公共文本小部件createFromParcel(包裹中){
返回新的TextWidget(在中);
}
@凌驾
公共TextWidget[]新数组(整数大小){
返回新的TextWidget[大小];
}
};
}
SelectWidget.java:
public class BaseWidget implements Parcelable{
private String name;
public BaseWidget() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected BaseWidget(Parcel in) {
this.name = in.readString();
}
public static final Creator<BaseWidget> CREATOR = new Creator<BaseWidget>() {
@Override
public BaseWidget createFromParcel(Parcel in) {
return new BaseWidget(in);
}
@Override
public BaseWidget[] newArray(int size) {
return new BaseWidget[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
}
}
public class TextWidget extends BaseWidget{
private String width = "100";
public TextWidget() {
}
public String getWidth() {
return width;
}
public void setWidth(String width) {
this.width = width;
}
protected TextWidget(Parcel in) {
super(in);
width = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(width);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<TextWidget> CREATOR = new Creator<TextWidget>() {
@Override
public TextWidget createFromParcel(Parcel in) {
return new TextWidget(in);
}
@Override
public TextWidget[] newArray(int size) {
return new TextWidget[size];
}
};
}
public class SelectWidget extends BaseWidget{
private int height = 200;
public SelectWidget() {
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
protected SelectWidget(Parcel in) {
super(in);
height = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(height);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<SelectWidget> CREATOR = new Creator<SelectWidget>() {
@Override
public SelectWidget createFromParcel(Parcel in) {
return new SelectWidget(in);
}
@Override
public SelectWidget[] newArray(int size) {
return new SelectWidget[size];
}
};
}
公共类SelectWidget扩展BaseWidget{
私人内部高度=200;
公共选择小部件(){
}
公共整数getHeight(){
返回高度;
}
公共空间设置高度(内部高度){
高度=高度;
}
受保护的SelectWidget(包裹输入){
超级(in),;
高度=in.readInt();
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
超级可写包裹(目的地、旗帜);
目的写入(高度);
}
@凌驾
公共int描述内容(){
返回0;
}
公共静态最终创建者=新创建者(){
@凌驾
public SelectWidget createFromParcel(包裹中){
返回新的SelectWidget(在中);
}
@凌驾
public SelectWidget[]新数组(整数大小){
返回新的SelectWidget[大小];
}
};
}
WidgetInfo.java:
public class WidgetInfo implements Parcelable{
private List<BaseWidget> widgetList;
public WidgetInfo() {
}
public List<BaseWidget> getWidgetList() {
return widgetList;
}
public void setWidgetList(List<BaseWidget> widgetList) {
this.widgetList = widgetList;
}
protected WidgetInfo(Parcel in) {
widgetList = in.createTypedArrayList(BaseWidget.CREATOR);
}
public static final Creator<WidgetInfo> CREATOR = new Creator<WidgetInfo>() {
@Override
public WidgetInfo createFromParcel(Parcel in) {
return new WidgetInfo(in);
}
@Override
public WidgetInfo[] newArray(int size) {
return new WidgetInfo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedList(widgetList);
}
}
public类WidgetInfo实现可包裹{
私有列表widgetList;
公共WidgetInfo(){
}
公共列表getWidgetList(){
返回widgetList;
}
公共无效setWidgetList(列表widgetList){
this.widgetList=widgetList;
}
受保护的WidgetInfo(包裹中){
widgetList=in.createTypedArrayList(BaseWidget.CREATOR);
}
公共静态最终创建者=新创建者(){
@凌驾
公共WidgetInfo createFromParcel(地块中){
返回新的WidgetInfo(在中);
}
@凌驾
公共WidgetInfo[]新数组(整数大小){
返回新的WidgetInfo[size];
}
};
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地writeTypedList(widgetList);
}
}
启动意图:
WidgetInfo info = new WidgetInfo();
BaseWidget widget1 = new BaseWidget();
BaseWidget widget2 = new TextWidget();
BaseWidget widget3 = new SelectWidget();
List<BaseWidget> list = new ArrayList<>();
list.add(widget1);
list.add(widget2);
list.add(widget3);
info.setWidgetList(list);
Intent intent = new Intent(this, TestActivity.class);
intent.putExtra("widgetInfo", info);
startActivity(intent);
WidgetInfo=new-WidgetInfo();
BaseWidget widget1=新的BaseWidget();
BaseWidget widget2=新的TextWidget();
BaseWidget widget3=新建SelectWidget();
列表=新的ArrayList();
列表。添加(widget1);
列表。添加(widget2);
列表。添加(widget3);
info.setWidgetList(列表);
意向意向=新意向(此为TestActivity.class);
intent.putExtra(“widgetInfo”,info);
星触觉(意向);
尝试并检查TextView.SavedState
类,它是处理Parcelable
和继承的一个很好的例子。也许它可以帮助您解决问题,为什么您认为和子类对象成员变量丢失了?@Blackbelt,因为经过intent之后,widget1、widget2、widget3将转换为BaseWidget对象,不再是子类对象请尝试检查TextView.SavedState
类,这是处理Parcelable
和继承的一个很好的例子。也许它可以帮助您解决您的问题,为什么您认为和子类对象成员变量丢失?@Blackbelt,因为经过意图传递后,widget1、widget2、widget3将转换为BaseWidget对象,而不再是子类对象