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对象,而不再是子类对象