Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.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
Android自定义视图保存和恢复状态_Android_Android View_Android Custom View - Fatal编程技术网

Android自定义视图保存和恢复状态

Android自定义视图保存和恢复状态,android,android-view,android-custom-view,Android,Android View,Android Custom View,我有自定义组件扩展了ImageView。方法onSaveInstanceState和onRestoreInstanceState工作正常,但不幸的是,当我单击查看mIsSelectedState=false时 我怎样才能解决这个问题 public class CustomImageView extends ImageView { private boolean mIsSelectedState; ... public CustomImageView(Context context, Attr

我有自定义组件扩展了ImageView。方法onSaveInstanceState和onRestoreInstanceState工作正常,但不幸的是,当我单击查看mIsSelectedState=false时

我怎样才能解决这个问题

public class CustomImageView extends ImageView {

private boolean mIsSelectedState;
...

public CustomImageView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs, defStyleAttr);
}

private void init(Context context, AttributeSet attrs, int defStyleAttr) {
    setSaveEnabled(true);

    TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CustomImageView, defStyleAttr, 0);
    ...
    attributes.recycle();

    mPaintImage = new Paint(Paint.ANTI_ALIAS_FLAG);
    ...
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if (!isClickable()) {
        mIsSelectedState = false;
        return super.onTouchEvent(event);
    }

    ...

    invalidate();
    return super.dispatchTouchEvent(event);
}

...

@Override
protected Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();
    SavedState savedState = new SavedState(superState);

    savedState.mSelected = mIsSelectedState;
    return savedState;
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
    if(!(state instanceof SavedState)) {
        super.onRestoreInstanceState(state);
        return;
    }

    SavedState savedState = (SavedState)state;
    super.onRestoreInstanceState(savedState.getSuperState());
    setSelectedState(savedState.mSelected);
    setBorderColor(mBorderSelectedColor);
}

private void setSelectedState(boolean isSelected) {
    mIsSelectedState = isSelected;
}

...

private static class SavedState extends BaseSavedState {
    boolean mSelected;

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

    private SavedState(Parcel in) {
        super(in);
        mSelected = in.readByte() != 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        super.writeToParcel(out, flags);
        out.writeByte((byte) (mSelected ? 1 : 0));
    }

    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];
                }
            };
}
公共类CustomImageView扩展了ImageView{
私有布尔未选状态;
...
公共CustomImageView(上下文上下文、属性集属性、int defStyleAttr){
super(上下文、attrs、defStyleAttr);
init(上下文、attrs、defStyleAttr);
}
私有void init(上下文上下文、属性集attrs、int defStyleAttr){
setSaveEnabled(真);
TypedArray attributes=context.ActainStyledAttributes(attrs,R.styleable.CustomImageView,defStyleAttr,0);
...
attributes.recycle();
mpaimpigage=新油漆(油漆.防油漆别名\u标志);
...
}
@凌驾
公共布尔dispatchTouchEvent(MotionEvent){
如果(!isClickable()){
mIsSelectedState=false;
返回super.onTouchEvent(事件);
}
...
使无效();
返回super.dispatchTouchEvent(事件);
}
...
@凌驾
受保护的地块onSaveInstanceState(){
可包裹的超级状态=super.onSaveInstanceState();
SavedState SavedState=新的SavedState(超级状态);
savedState.mSelected=mIsSelectedState;
返回savedState;
}
@凌驾
RestoreInstanceState上的受保护无效(可包裹状态){
如果(!(保存状态的状态实例)){
super.onRestoreInstanceState(状态);
返回;
}
SavedState SavedState=(SavedState)状态;
super.onRestoreInstanceState(savedState.getSuperState());
setSelectedState(savedState.mSelected);
setOrderColor(mBorderSelectedColor);
}
私有void setSelectedState(布尔值isSelected){
MissectedState=isSelected;
}
...
私有静态类SavedState扩展了BaseSavedState{
选择布尔值;
保存状态(可包裹的超级状态){
超级(超级国家);
}
私有存储状态(包裹在中){
超级(in),;
mSelected=in.readByte()!=0;
}
@凌驾
公共无效写入包(包出,内部标志){
super.writeToParcel(输出,标志);
out.writeByte((字节)(mSelected?1:0));
}
公共静态最终包裹。创建者=
新建Parcelable.Creator(){
public SavedState createFromParcel(中的地块){
返回新的SavedState(in);
}
public SavedState[]新数组(整数大小){
返回新的SavedState[大小];
}
};
}

保存状态的正确方法如下所示:

第一个覆盖
onSaveInstanceState()

然后,无论何时恢复,都应覆盖:

 @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mIsSelectedState = savedInstanceState.getInt("myconstantKey");
}
如果要在活动之间切换,也可以在
onCreate
上执行此操作

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
           mIsSelectedState = savedInstanceState.getBoolean("myconstantKey");
        }

        ...
    }
请记住,Android活动生命周期很棘手,但一旦掌握了窍门,一切都会变得更好:)


希望能有帮助。

如果(!isClickable())可能会进入内部{mIsSelectedState=false;这就是为什么您得到的结果是false。您调试过吗?仅供参考:在我看来,没有必要创建您自己的包裹。在大多数情况下,它会给您的代码添加大量的垃圾。只需使用内置的Bundle类,并在其上设置属性。@ShadabAnsari是的,我检查了它。我还对其进行了更详细的借记。在nDraw()调用了onRestoreInstantState并将mIsSelectedState设置为正确的值,但不幸的是,在onDraw()期间,我遇到了不正确的错误data@Matt为什么您认为这个捆绑包更好?例如在View super.onSaveInstanceState()中返回Parcelable对象。当我们谈论示例活动时,我同意你的看法。主要是因为你不能搞乱包裹上的包裹。自定义包裹总是有可能编码错误。这是活动的正确方式,但我认为他希望在视图级别处理它。是的,我希望保存和恢复da视像层的电讯局长
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
           mIsSelectedState = savedInstanceState.getBoolean("myconstantKey");
        }

        ...
    }