如何检索自定义视图的状态?

时间:2014-09-23 15:09:21

标签: android android-custom-view

我已在里面创建了ComplexView的自定义视图EditText。我的片段中有DetailsFragment片段{3} ComplexView。当我在DetailsFragment中输入值(A,B,C)然后推送并弹出片段时,所有editTexts都具有相同的值C.我实现了自己的onSaveInstanceStateonRestoreInstanceState版本它没有帮助。有什么问题?

@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);
    }
}

1 个答案:

答案 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%。