11

我有一个扩展 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);
  }
4

2 回答 2

4

在挖掘了android os之后,我终于弄明白了。正如我所怀疑的:这两种方法没有任何问题。他们只是没有被调用。在 Web 上,您可以读到“重新创建活动时调用 onRestoreInsatnceState”好吧,这是有道理的,但它并不完全正确。是的,onRestoreInstanceState() 在重新创建活动时被调用,但仅当:

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

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

所以如果你在你的活动中并且你点击了设备上的后退按钮,你的活动是完成(),下次你启动你的应用程序时它会再次启动(听起来像是重新创建,不是吗?)但是这次没有保存状态,因为您在点击后退按钮时故意退出了它。

于 2012-09-09T01:15:58.977 回答
4

正如 Steven Byle 的评论所提到的,一个自定义View必须有一个分配给它的 idonSaveInstanceState才能被调用。我通过在我的自定义View构造函数中设置一个 id 来实现这一点:

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

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

}
于 2014-05-23T14:49:29.593 回答