Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在扩展ImageView的类上保存状态?_Java_Android_Imageview_Save_Parcelable - Fatal编程技术网

Java 如何在扩展ImageView的类上保存状态?

Java 如何在扩展ImageView的类上保存状态?,java,android,imageview,save,parcelable,Java,Android,Imageview,Save,Parcelable,我有一个骰子类(游戏是贪婪或法克尔),它实现了ImageView package se.mobilapplikationer.greeddicegame.model; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import an

我有一个骰子类(游戏是贪婪或法克尔),它实现了ImageView

package se.mobilapplikationer.greeddicegame.model;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;

import java.util.Random;

/**
 * Class representing a single die
 */
public class Die extends ImageView implements View.OnClickListener, Parcelable {

    //The value of the die
    private int value;
    //Random value generator
    private final Random random = new Random();
    //Is the die stored?
    private boolean stored;// = false;
    //Is the die locked?
    private boolean locked;// = true;
    //Main context
    private final Context context;

    Drawable drawable;

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(value);
        dest.writeByte((byte) (stored ? 1 : 0));
        dest.writeByte((byte) (locked ? 1 : 0));
    }

    public Die(Context context) {
        super(context);
        this.context = context;
    }

    public Die(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        init(context);

    }

    public Die(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.context = context;
        init(context);

    }

    /**
     * Sets the die image to nan and adds click listener.
     *
     * @param context
     */
    private void init(Context context) {
        setOnClickListener(this);
        setImageResource(context.getResources().getIdentifier("nan", "drawable", context.getPackageName()));
    }

    /**
     * Throw the die, generating a value from 1 to 6
     */
    public void throwDie() {
        this.value = random.nextInt((6 - 1) + 1) + 1;
        updateImage();
    }

    /**
     * Update the image to its corresponding value
     */
    private void updateImage() {
        setImageResource(context.getResources().getIdentifier("white" + value, "drawable", context.getPackageName()));
    }


    @Override
    public void onClick(View v) {
        //Dont do anything if the die is locked.
        if (locked) {
            return;
        }
        //If the die is only stored, unstore it.
        if (stored) {
            unStore();
        } else {
            store();
        }

    }


    private void store() {
        setImageResource(context.getResources().getIdentifier("grey" + value, "drawable", context.getPackageName()));
        this.stored = true;
    }

    private void unStore() {
        setImageResource(context.getResources().getIdentifier("white" + value, "drawable", context.getPackageName()));
        this.stored = false;
    }

    /**
     * Lock the die, setting the die image to red
     */
    public void lock() {
        setImageResource(context.getResources().getIdentifier("red" + value, "drawable", context.getPackageName()));
        this.locked = true;

    }

    /**
     *
     * @return stored condition of the die
     */
    public boolean isStored() {
        return stored;
    }

    /**
     *
     * @return Locked condition of the die
     */
    public boolean isLocked() {
        return locked;
    }

    /**
     *
     * @return The value of the die
     */
    public int getValue() {
        return value;
    }

    /**
     * Reset the die, locking it, unstoring it and setting image to nan
     */
    public void reset() {
        this.value = 0;
        this.locked = true;
        this.stored = false;
        setImageResource(context.getResources().getIdentifier("nan", "drawable", context.getPackageName()));
    }

    /**
     * Unlocks the die
     */
    public void unlock() {
        this.locked = false;
    }



}
现在我在屏幕旋转方面遇到了问题,因为类没有被保存,因为我不知道如何使用parcelable正确保存这个类,因为我无法创建类似的方法

public Die(Parcel in){
    ....
}

有人知道怎么做,或者有解决办法吗?

视图本身没有被打包;要保存的状态已打包。它应该是这样的:

static class SavedState extends View.BaseSavedState {
    int example; // things you want to save

    SavedState(Parcel superState) {
        super(superState);
    }

    private SavedState(Parcel in) {
        super(in);
        this.example = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(example);
    }

    public static final Parcelable.Creator<SavedState> CREATOR =
            new Parcelable.Creator<SavedState>() {

        public SavedState createFromParcel(Parcel in) {
            return new SavedState(in);
        }
        public SavedState[] newArray(int size) {
            return new SavedState[size];
        }
    };
}

@Override
public Parcelable onSaveInstanceState() {
    final Parcelable superState = super.onSaveInstanceState();
    SavedState ss = new SavedState(superState);
    ss.example = ...;
    return ss;
}

@Override 
public void onRestoreInstanceState(Parcelable state) {
    SavedState ss = (SavedState) state;
    super.onRestoreInstanceState(ss.getSuperState());
    doSomething(ss.example);
}
静态类SavedState扩展了View.BaseSavedState{
int-example;//要保存的内容
保存状态(包裹超级状态){
超级(超级国家);
}
私有存储状态(包裹在中){
超级(in),;
this.example=in.readInt();
}
@凌驾
公共无效写入包(包出,内部标志){
out.writeInt(示例);
}
公共静态最终包裹。创建者=
新建Parcelable.Creator(){
public SavedState createFromParcel(中的地块){
返回新的SavedState(in);
}
public SavedState[]新数组(整数大小){
返回新的SavedState[大小];
}
};
}
@凌驾
公共地块可在SaveInstanceState()上使用{
最终可包裹超级状态=super.onSaveInstanceState();
SavedState ss=新的SavedState(超级状态);
ss.example=。。。;
返回ss;
}
@凌驾
RestoreInstanceState(可包裹状态)上的公共无效{
SavedState ss=(SavedState)状态;
super.onRestoreInstanceState(ss.getSuperState());
剂量测定法(ss.示例);
}