Подтвердить что ты не робот

Android View onSaveInstanceState не вызывается

Я работаю с CustomView, который расширяет некоторые виды Android, такие как FrameLayout. В моем макете я использую ViewPager с пользовательским PagerAdapter.

Проблема заключается в том, что мой Вид не восстановил состояние, когда фрагмент снова привязан к ViewPager/Activity. Например, у меня есть три фрагмента, если я перейду к последнему и вернусь к первому, ScrollView не там, где я его позволяю: он возвращается к умолчанию, сверху.

Я знаю, что с PagerAdapter не все фрагменты активны в одно и то же время, в основном juste + 1/-1.

Я не могу найти, почему мой View.onSaveInstanceState() не вызывается, так как onRestoreInstanceState.

4b9b3361

Ответ 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.