在派生图形 class 中为 onSaveInstanceState(Bundle) 实现 Parcelable
implementing Parcelable in a derived-graphic class for onSaveInstanceState(Bundle)
我想保存和恢复屏幕方向更改的一些数据 (portrait/landscape)。
为此,我在 class 中实现了 onSaveInstanceState 和 onRestoreInstanceState,其中包含我要恢复的列表。它似乎工作正常,在 MyObject class 中我实现了 Parcelable.
问题是我的对象 扩展了 GifImageButton 并实现了 Parcelable 所以我在我的对象构造函数中得到了这个错误:"There is no default constructor available for pl.droidsonroids.gif.GifImageButton"
public class MyDerivedClass extends MyBaseClass { // extends AppCompatActivity
ArrayList<MyObject> list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.episode_five);
if(savedInstanceState == null || !savedInstanceState.containsKey("key")) {
String[] colors = {"black", "red"};
String[] numbers = {"one", "two"};
list = new ArrayList<MyObject>();
for(int i = 0; i < numbers.length; i++)
list.add(new MyObject(numbers[i], colors[i]));
}
else {
list = savedInstanceState.getParcelableArrayList("key");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList("key", list);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle inState) {
list = inState.getParcelableArrayList("key");
super.onSaveInstanceState(inState);
init();
}
public void init() {
list.add(new MyObject("three", "transparent"));
list.add(new MyObject("for", "white"));
}
}
关于问题,查看下面的代码:
我想 扩展 GifImageButton 但我在 "There is no default constructor available for pl.droidsonroids.gif.GifImageButton" 处收到错误消息:
public MyObject(字符串编号,字符串颜色)
AND public 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];
}
};
}
我可以在实现 Parcelable 的对象 class 中扩展 GifImageButton 吗?如果没有,我该如何解决?
出现这个错误信息是因为你需要在你的构造函数中调用superclass的构造函数。如果没有显式调用,编译器会插入一个不带参数的构造函数调用。但是,所有超级 class 构造函数都有一些参数,这就是编译失败的原因。
在你的情况下,我根本不会在你的 class 中实现 Parcelable
。 superclass 没有实现它,因此您还需要以某种方式保存 superclass 的状态,这是不可能的。 superclass 是一个 View
,所以它保留了对当前 activity 的引用,不能放入 Parcel
.
您应该做的不是保存实例本身,而是保存您需要的状态。您的状态当前由两个字符串表示。您可以在 MyObject
:
中创建一个单独的 class State
static class State implements Parcelable {
private String color;
private String number;
//Parcelable implementation omitted
}
然后你为它实现Parcelable
。 MyObject
将有一个字段 private State state
而不是当前的两个字段,一个采用 State
的构造函数和一个方法 State getState()
,它将 return 状态.当你需要保存状态时,你不保存对象,而是获取它的状态并保存它。当你需要恢复时,你先恢复State
,然后用它和构造函数一起创建一个新的MyObject
,状态和以前一样。
you MyObject class 具有私有构造函数 MyObject(Parcel in),使其成为 public 以便编译器可以访问它
我想保存和恢复屏幕方向更改的一些数据 (portrait/landscape)。
为此,我在 class 中实现了 onSaveInstanceState 和 onRestoreInstanceState,其中包含我要恢复的列表。它似乎工作正常,在 MyObject class 中我实现了 Parcelable.
问题是我的对象 扩展了 GifImageButton 并实现了 Parcelable 所以我在我的对象构造函数中得到了这个错误:"There is no default constructor available for pl.droidsonroids.gif.GifImageButton"
public class MyDerivedClass extends MyBaseClass { // extends AppCompatActivity
ArrayList<MyObject> list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.episode_five);
if(savedInstanceState == null || !savedInstanceState.containsKey("key")) {
String[] colors = {"black", "red"};
String[] numbers = {"one", "two"};
list = new ArrayList<MyObject>();
for(int i = 0; i < numbers.length; i++)
list.add(new MyObject(numbers[i], colors[i]));
}
else {
list = savedInstanceState.getParcelableArrayList("key");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList("key", list);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle inState) {
list = inState.getParcelableArrayList("key");
super.onSaveInstanceState(inState);
init();
}
public void init() {
list.add(new MyObject("three", "transparent"));
list.add(new MyObject("for", "white"));
}
}
关于问题,查看下面的代码:
我想 扩展 GifImageButton 但我在 "There is no default constructor available for pl.droidsonroids.gif.GifImageButton" 处收到错误消息:
public MyObject(字符串编号,字符串颜色) AND public 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];
}
};
}
我可以在实现 Parcelable 的对象 class 中扩展 GifImageButton 吗?如果没有,我该如何解决?
出现这个错误信息是因为你需要在你的构造函数中调用superclass的构造函数。如果没有显式调用,编译器会插入一个不带参数的构造函数调用。但是,所有超级 class 构造函数都有一些参数,这就是编译失败的原因。
在你的情况下,我根本不会在你的 class 中实现 Parcelable
。 superclass 没有实现它,因此您还需要以某种方式保存 superclass 的状态,这是不可能的。 superclass 是一个 View
,所以它保留了对当前 activity 的引用,不能放入 Parcel
.
您应该做的不是保存实例本身,而是保存您需要的状态。您的状态当前由两个字符串表示。您可以在 MyObject
:
State
static class State implements Parcelable {
private String color;
private String number;
//Parcelable implementation omitted
}
然后你为它实现Parcelable
。 MyObject
将有一个字段 private State state
而不是当前的两个字段,一个采用 State
的构造函数和一个方法 State getState()
,它将 return 状态.当你需要保存状态时,你不保存对象,而是获取它的状态并保存它。当你需要恢复时,你先恢复State
,然后用它和构造函数一起创建一个新的MyObject
,状态和以前一样。
you MyObject class 具有私有构造函数 MyObject(Parcel in),使其成为 public 以便编译器可以访问它