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