Android View onSaveInstanceState не вызывается
Я работаю с CustomView, который расширяет некоторые виды Android, такие как FrameLayout. В моем макете я использую ViewPager с пользовательским PagerAdapter.
Проблема заключается в том, что мой Вид не восстановил состояние, когда фрагмент снова привязан к ViewPager/Activity. Например, у меня есть три фрагмента, если я перейду к последнему и вернусь к первому, ScrollView не там, где я его позволяю: он возвращается к умолчанию, сверху.
Я знаю, что с PagerAdapter не все фрагменты активны в одно и то же время, в основном juste + 1/-1.
Я не могу найти, почему мой View.onSaveInstanceState() не вызывается, так как onRestoreInstanceState.
Ответы
Ответ 1
Легкий ответ: это потому, что я не устанавливал id для своего представления (пользовательский или нет). Android не управлял onSaveInstanceState/onRestoreInstanceState
, если в представлении не установлен идентификатор.
Так как мой customView расширяет базовый вид, не добавляя дополнительного свойства, устанавливая ID для представления, разрешающего проблему, и поэтому onSaveInstanceState/onRestoreInstanceState вызывается так, как должно.
Итак, чтобы обобщить, используйте один из этих способов:
из XML
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
...
android:id="@+id/scrollView">
</ScrollView>
ИЛИ из Java
yourCustomView.setId(R.id.myCustomView);
- последний случай, вы добавляете статический идентификатор к res/values /ids.xml <item name="myCustomView" type="id"/>
Ответ 2
Сохранение состояния по умолчанию
Теперь у нас есть все, что нужно для сохранения и восстановления состояния. Однако это не произойдет по умолчанию. Если вы хотите, чтобы экземпляры вашего представления автоматически сохраняли состояние, вы можете добавить эту строку к методу init:
setSaveEnabled(true);
Будь или нет, это зависит от вас. Даже если ваше представление не сохраняет состояние по умолчанию, пользователи представления всегда могут включить сохранение состояния, вызвав setSaveEnabled (true) или указав android: saveEnabled = "true" в макете xml.