不调用onSaveInstanceState()和onRestoreInstanceState(Parcelable状态)?

时间:2012-09-08 01:37:11

标签: android android-view android-custom-view

我有一个扩展LinearLayout的自定义视图。我已经实现了onSaveInstanceState()和onRestoreInstanceState()来保存当前的视图状态。但是,不采取任何行动。当我在这两种方法中放入日志时,Log Cat中也没有任何内容。我认为这两种方法甚至都没有被调用。任何人都可以解释问题在哪里?感谢。

@Override
public Parcelable onSaveInstanceState() {
    Bundle bundle = new Bundle();
    bundle.putParcelable("instanceState", super.onSaveInstanceState());
    bundle.putInt("currentPage", currentPage);
    return bundle;
}

@Override
public void onRestoreInstanceState(Parcelable state) {

    if (state instanceof Bundle) {
      Bundle bundle = (Bundle) state;
      currentPage = bundle.getInt("currentPage");
      Log.d("State", currentPage + "");
      super.onRestoreInstanceState(bundle.getParcelable("instanceState"));
      return;
    }
       super.onRestoreInstanceState(state);
  }

2 个答案:

答案 0 :(得分:4)

在挖掘android os之后我终于想通了。我怀疑:这两种方法没有错。他们只是没有被召唤。 在Web上,您可以读到在重新创建活动时调用onRestoreInsatnceState'好吧,它有意义,但它并不完全正确。是的,在重新创建活动时调用onRestoreInstanceState(),但仅在iff:

时调用

它被操作系统杀死了。 "这种情况发生在:

  • 设备的方向发生变化(您的活动被破坏并重新创建)
  • 在你面前还有另一项活动,在某些时候,操作系统会杀死你的活动以释放内存(例如)。下次启动活动时,将调用onRestoreInstanceState()。"

因此,如果您正在进行活动并且点击设备上的“返回”按钮,则您的活动已完成(),并且下次启动应用时,它会再次启动(听起来像是创建,不是吗?)但是这次没有保存状态,因为当你点击Back按钮时你有意退出它。

答案 1 :(得分:4)

正如Steven Byle的评论所提到的,自定义View必须为其分配一个ID才能调用onSaveInstanceState。我通过在自定义View构造函数中设置id来完成此操作:

public class BoxDrawingView extends View {
    private int BOX_DRAWING_ID = 555;
    …

    public BoxDrawingView(Context context, AttributeSet attrs) {
        …
        this.setId(BOX_DRAWING_ID);
    }
    …

}