С большим интересом потратил несколько часов на локализацию следующей проблемы:
- у меня есть custom view
- это композитный view, внутри которого используется EditText
- таких view у меня на экране несколько
- custom view обрабатывает сохранение и восстановление состояния в методах onSaveInstanceState и onRestoreInstanceState
- дебаггер показывает, что вызов этих методов и их работа выполняются корректно.
Но: после смены ориентации экрана в каждом из этих view содержится текст, который был введён в самый нижний из этих view.
Решение:
для EditText, входящего в состав композитного view, запретить сохранение состояния:
<EditText
android:id="@+id/value"
android:saveEnabled="false"
.../>
Для коллекции - код, который отвечает за сохранение и восстановление состояния view
- у меня есть 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); } }
Комментариев нет:
Отправить комментарий