首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BadParcelableException ClassNotFoundException协调员$SavedState

BadParcelableException ClassNotFoundException协调员$SavedState
EN

Stack Overflow用户
提问于 2016-03-11 18:01:17
回答 1查看 1.5K关注 0票数 4

我有一个扩展CoordinatorLayout的自定义视图,我正在使用类扩展BaseSavedState的典型方式覆盖onRestoreInstanceStateonSaveInstanceState。当我的观点恢复的时候,我得到:

代码语言:javascript
复制
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.design.widget.CoordinatorLayout$SavedState
at android.os.Parcel.readParcelableCreator(Parcel.java:2432)
at android.os.Parcel.readParcelable(Parcel.java:2358)
at android.view.AbsSavedState.(AbsSavedState.java:57)
at android.view.View$BaseSavedState.(View.java:21457)
at android.support.design.widget.CoordinatorLayout$SavedState.(CoordinatorLayout.java:2656)

如果我评论一下我的两种方法onRestoreInstanceStateonSaveInstanceState,这个问题就解决了。请参阅下面的自定义视图代码:

代码语言:javascript
复制
 @Override
  protected Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();
    SavedState ss = new SavedState(superState);
    ss.scrollX = scrollView.getScrollX();
    ss.scrollY = scrollView.getScrollY();
    return ss;
  }

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

    post(() -> scrollView.scrollTo(ss.scrollX, ss.scrollY));
  }

  static class SavedState extends BaseSavedState {
    int scrollX;
    int scrollY;

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

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

    @Override
    public void writeToParcel(Parcel out, int flags) {
      super.writeToParcel(out, flags);
      out.writeInt(this.scrollX);
      out.writeInt(this.scrollY);
    }

    //required field that makes Parcelables from a Parcel
    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];
          }
        };
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-11 18:19:30

这是因为AbsSavesState使用了null类加载器,所以您必须自己序列化它:

代码语言:javascript
复制
@Override
  protected Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();
    SavedState ss = new SavedState(superState);
    ss.scrollX = scrollView.getScrollX();
    ss.scrollY = scrollView.getScrollY();
    return ss;
  }

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

    post(() -> scrollView.scrollTo(ss.scrollX, ss.scrollY));
  }

  static class SavedState extends BaseSavedState {
    Parcelable superState;
    int scrollX;
    int scrollY;

    SavedState(Parcelable superState) {
      // We store the state ourself and send an empty state to to the parent
      super(EMPTY_STATE);
      this.superState = superState;
    }

    private SavedState(Parcel in) {
      super(in);
      this.superState = in.readParcelable(CoordinatorLayout.SavedState.class.getClassLoader());
      this.scrollX = in.readInt();
      this.scrollY = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
      super.writeToParcel(out, flags);
      out.writeParcelable(superState, flags);
      out.writeInt(this.scrollX);
      out.writeInt(this.scrollY);
    }

    //required field that makes Parcelables from a Parcel
    public static final Parcelable.Creator CREATOR =
        new Parcelable.Creator() {
          public SavedState createFromParcel(Parcel in) {
            return new SavedState(in);
          }

          public SavedState[] newArray(int size) {
            return new SavedState[size];
          }
        };
  }
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35946908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档