我有一个扩展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);
}
答案 0 :(得分:4)
在挖掘android os之后我终于想通了。我怀疑:这两种方法没有错。他们只是没有被召唤。 在Web上,您可以读到在重新创建活动时调用onRestoreInsatnceState'好吧,它有意义,但它并不完全正确。是的,在重新创建活动时调用onRestoreInstanceState(),但仅在iff:
时调用它被操作系统杀死了。 "这种情况发生在:
因此,如果您正在进行活动并且点击设备上的“返回”按钮,则您的活动已完成(),并且下次启动应用时,它会再次启动(听起来像是创建,不是吗?)但是这次没有保存状态,因为当你点击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);
}
…
}