我已经创建了内部有ComplexView的自定义视图EditText。我在他的布局中有3个片段。当我在我的DetailsFragment中输入值(a,b,c),然后推送并弹出一个片段时,所有的edittext都有相同的值c。我实现了自己的ComplexViewDetailsFragment版本,但没有帮助。怎么了?

@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%的篇幅。

10-07 20:53