我已在里面创建了ComplexView
的自定义视图EditText
。我的片段中有DetailsFragment
片段{3} ComplexView
。当我在DetailsFragment
中输入值(A,B,C)然后推送并弹出片段时,所有editTexts都具有相同的值C.我实现了自己的onSaveInstanceState
和onRestoreInstanceState
版本它没有帮助。有什么问题?
@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);
}
}
答案 0 :(得分:5)
发生这种情况的原因是EditText
的每个实例中的ComplexView
与该视图的每个其他实例共享一个ID。当您的ComplexView
向其子女发送保存/恢复事件时,使用共享相同ID的视图会让事情变得有点时髦。
要解决此问题,除了覆盖保存和恢复方法之外,您还需要阻止向ComplexView
个孩子发送状态保存/恢复。
你可以这样做:
@Override
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
dispatchFreezeSelfOnly(container);
}
@Override
protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
dispatchThawSelfOnly(container);
}
现在当ComplexView
恢复或保存状态时,仅 保存或恢复自己的状态;你告诉它你将自己处理保存和恢复孩子。
Cyril Mottier刚刚在here发布了一些好的幻灯片。引用这个问题的文章约占80%。