我已经创建了内部有ComplexView
的自定义视图EditText
。我在他的布局中有3个片段。当我在我的DetailsFragment
中输入值(a,b,c),然后推送并弹出一个片段时,所有的edittext都有相同的值c。我实现了自己的ComplexView
和DetailsFragment
版本,但没有帮助。怎么了?
@Override
protected Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
bundle.putParcelable(STATE_SUPER_STATE, super.onSaveInstanceState());
bundle.putString(STATE_DESCRIPTION_TEXT, mDescription.getText().toString());
return bundle;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (state instanceof Bundle) {
Bundle bundle = (Bundle)state;
super.onRestoreInstanceState(bundle.getParcelable(STATE_SUPER_STATE));
mDescription.setText(bundle.getString(STATE_DESCRIPTION_TEXT));
} else {
super.onRestoreInstanceState(state);
}
}
最佳答案
发生这种情况的原因是EditText
的每个实例中的ComplexView
与该视图的每个其他实例共享一个id。当您的ComplexView
将save/restore事件分派给它的子级时,使用共享同一id的视图会有点奇怪。
要解决这个问题,除了重写save和restore方法之外,还需要阻止将状态保存/恢复分派给ComplexView
的子级。
你可以这样做:
@Override
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
dispatchFreezeSelfOnly(container);
}
@Override
protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
dispatchThawSelfOnly(container);
}
现在,当您的
ComplexView
恢复或保存它的状态时,它将只保存或恢复它自己的状态;您告诉它您将自己处理保存和恢复孩子的操作。西里尔·莫蒂尔刚刚在这个here上贴了一些不错的幻灯片。提到这个问题的那篇文章大约有80%的篇幅。