Java 在onSaveInstanceState(Bundle)的派生图形类中实现Parcelable

Java 在onSaveInstanceState(Bundle)的派生图形类中实现Parcelable,java,android,parcelable,onrestoreinstancestate,onsaveinstancestate,Java,Android,Parcelable,Onrestoreinstancestate,Onsaveinstancestate,我想保存和恢复一些屏幕方向更改(纵向/横向)的数据 为此,我在我的类中实现了onSaveInstanceState和onRestoreInstanceState,其中包含我要还原的列表。它似乎正在工作,在MyObject类中,我实现了Parcelable 问题是,我的对象扩展了GifImageButton并实现了Parcelable,因此我在对象构造函数中遇到了此错误:“pl.droidsonroids.gif.GifImageButton没有默认构造函数可用” 公共类MyDerivedClas

我想保存和恢复一些屏幕方向更改(纵向/横向)的数据

为此,我在我的类中实现了onSaveInstanceState和onRestoreInstanceState,其中包含我要还原的列表。它似乎正在工作,在MyObject类中,我实现了Parcelable

问题是,我的对象扩展了GifImageButton并实现了Parcelable,因此我在对象构造函数中遇到了此错误:“pl.droidsonroids.gif.GifImageButton没有默认构造函数可用”

公共类MyDerivedClass扩展MyBaseClass{//扩展AppCompatActivity
数组列表;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局,第五集);
如果(savedInstanceState==null | |!savedInstanceState.containsKey(“键”)){
字符串[]颜色={“黑色”、“红色”};
字符串[]数字={“一”,“二”};
列表=新的ArrayList();
for(int i=0;i
对于问题,请查看下面的代码:

我想扩展GifImageButton,但在以下位置出现错误“pl.droidsonroids.gif.GifImageButton没有默认构造函数可用”:

公共MyObject(字符串编号、字符串颜色)公共MyObject(包裹中)

注意:如果我删除了:“extends GifImageButton”和“public MyObject(Context-Context,AttributeSet-attrs)”,那么代码将被编译

class MyObject extends GifImageButton implements Parcelable {
    String color;
    String number;

    public MyObject(Context context, AttributeSet attrs) {
        super(context, attrs);
        setImageResource(R.drawable.a);
    }

    public MyObject(String number, String color) {
        this.color = color;
        this.number = number;
    }

    private MyObject(Parcel in) {
        color = in.readString();
        number = in.readString();
    }

    public int describeContents() {
        return 0;
    }

    @Override
    public String toString() {
        return number + ": " + color;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeString(color);
        out.writeString(number);
    }

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

        public MyObject[] newArray(int size) {
            return new MyObject[size];
        }
    };
}
类MyObject扩展ImageButton实现可包裹{
字符串颜色;
字符串编号;
公共MyObject(上下文、属性集属性){
超级(上下文,attrs);
setImageResource(R.drawable.a);
}
公共MyObject(字符串编号、字符串颜色){
这个颜色=颜色;
这个数字=数字;
}
私有MyObject(地块中){
color=in.readString();
number=in.readString();
}
公共int描述内容(){
返回0;
}
@凌驾
公共字符串toString(){
返回编号+“:”+颜色;
}
公共无效写入包(包出,内部标志){
out.writeString(彩色);
out.writeString(数字);
}
public static final Parcelable.Creator=新建Parcelable.Creator(){
公共MyObject createFromParcel(中的地块){
返回新的MyObject(在中);
}
公共MyObject[]新数组(整数大小){
返回新的MyObject[大小];
}
};
}

我可以在实现Parcelable的对象类中扩展GifImageButton吗?如果没有,我如何修复它?

出现错误消息,因为您需要在构造函数中调用超类的构造函数。如果没有显式调用,编译器将插入对无参数构造函数的调用。但是,所有的超类构造函数都有一些参数,这就是编译失败的原因

在你的情况下,我根本不会在你的课堂上实现
Parcelable
。超类没有实现它,所以您需要以某种方式保存超类的状态,这是不可能做到的。超类是一个
视图
,因此它保留了对当前活动的引用,而当前活动不能放入

您应该做的不是保存实例本身,而是保存所需的状态。您的状态当前由两个字符串表示。您可以在
MyObject
内部创建一个单独的类
State

static class State implements Parcelable {
    private String color;
    private String number;

    //Parcelable implementation omitted
}

然后为它实现
Parcelable
MyObject
将有一个字段
私有状态
,而不是当前的两个字段,一个构造函数接受一个
状态
,一个方法
状态getState()
,它将返回状态。当需要保存状态时,不保存对象,而是获取其状态并保存它。当您需要恢复时,首先恢复
状态
,然后将其与构造函数一起使用,以创建一个新的
MyObject
,其状态与以前相同。

您的MyObject类具有私有构造函数MyObject(Parcel-in),将其公开,以便编译器可以访问它

我尝试了它,但在MyDerivedClass中出现了错误。例如,在onCreate中的以下行中:list=savedInstanceState.getParcelableArrayList(“key”);错误为:类型参数“T”的推断类型MyObject不在其范围内;应该实现“android.os.Parcelable”。另一个错误出现在onSaveInstanceState的第行:outState.putParcelableArrayList(“key”,list);错误是:错误的第二个参数类型;找到“MyObject”,必需:“java.util”。ArrayList@ErezShmiel就像我说的,你需要保存状态,而不是对象本身。当然,如果您有一个对象列表并试图保存它,您将无法保存,因为它没有实现
Parcelable
。您需要从列表中的所有对象获取状态,创建一个新的
ArrayList
,并将其放入
捆绑包中。
static class State implements Parcelable {
    private String color;
    private String number;

    //Parcelable implementation omitted
}