3

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

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

问题是我的对象扩展了 GifImageButton并实现了Parcelable,所以我在对象构造函数中收到此错误:“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但随后出现错误“pl.droidsonroids.gif.GifImageButton 没有可用的默认构造函数”:

public MyObject(String number, String color) AND public MyObject(Parcel in)

注意:如果我删除:“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 的对象类中扩展 GifImageButton 吗?如果没有,那么我该如何解决?

4

2 回答 2

1

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

在你的情况下,我根本不会Parcelable在你的课堂上实施。超类没有实现它,因此您还需要以某种方式保存超类的状态,这是不可能的。超类是 a View,因此它保留了对当前活动的引用,不能将其放入 aParcel中。

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

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

    //Parcelable implementation omitted
}

然后你实现Parcelable它。MyObject将有一个字段private State state而不是当前的两个字段,一个接受 a 的构造函数State和一个State getState()返回状态的方法。当您需要保存状态时,您不保存对象,而是获取其状态并保存它。当你需要恢复时,你先恢复第State一个,然后用它和构造函数一起创建一个MyObject和之前一样状态的新的。

于 2016-11-24T09:23:41.140 回答
0

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

于 2016-11-24T09:24:44.227 回答