вторник, марта 15, 2016

Custom view, EditText, проблема при восстановлении состояния (use saveEnabled(fals))

С большим интересом потратил несколько часов на локализацию следующей проблемы:
- у меня есть custom view
- это композитный view, внутри которого используется EditText
- таких view у меня на экране несколько
- custom view обрабатывает сохранение и восстановление состояния в методах onSaveInstanceState и onRestoreInstanceState
- дебаггер показывает, что вызов этих методов и их работа выполняются корректно.

Но: после смены ориентации экрана в каждом из этих view содержится текст, который был введён в самый нижний из этих view.

Решение:
для EditText, входящего в состав композитного view, запретить сохранение состояния:

<EditText
    android:id="@+id/value"
    android:saveEnabled="false"
    .../>




Для коллекции - код, который отвечает за сохранение и восстановление состояния view

static class ViewSavedState extends View.BaseSavedState {

    private String text, title, hint;
    private int maxLength;

    public ViewSavedState(Parcelable superState) {
        super(superState);
    }

    public ViewSavedState(Parcel source) {
        super(source);
        text = source.readString();
        title = source.readString();
        hint = source.readString();
        maxLength = source.readInt();
    }

    @Override    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeString(text);
        dest.writeString(title);
        dest.writeString(hint);
        dest.writeInt(maxLength);
    }

    public static final Parcelable.Creator<ViewSavedState> CREATOR = new Parcelable.Creator<ViewSavedState>() {

        public ViewSavedState createFromParcel(Parcel in) {
            return new ViewSavedState(in);
        }

        public ViewSavedState[] newArray(int size) {
            return new ViewSavedState[size];
        }
    };
}

...

@Overrideprotected Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();

    ViewSavedState viewState = new ViewSavedState(superState);
    viewState.maxLength = getMaxLength();
    viewState.title = getTitle();
    viewState.text = getText();
    viewState.hint = getInfoText();

    return viewState;
}

@Overrideprotected void onRestoreInstanceState(Parcelable state) {
    if (state instanceof ViewSavedState) {
        ViewSavedState viewState = (ViewSavedState) state;
        super.onRestoreInstanceState(viewState.getSuperState());

        setMaxLength(viewState.maxLength);
        setTitle(viewState.title);
        setText(viewState.text);
        setInfoText(viewState.hint);
    } else {
        super.onRestoreInstanceState(state);
    }
}

Комментариев нет: