Android视图 onSaveInstanceState 方法未被调用

17
我正在使用CustomView,它扩展了一些Android视图,如FrameLayout。在我的布局中,我使用一个带有自定义PagerAdapter的ViewPager。
问题是,当片段重新附加到ViewPager / Activity时,我的视图没有恢复其状态。例如,我有三个片段,如果我向最后一个滑动并返回第一个,则ScrollView不在我离开它的位置:它回到了默认的顶部。
我知道使用PagerAdapter时,并不是所有的片段都同时处于活动状态,基本上只是+1 / -1。
我找不到为什么我的View.onSaveInstanceState()没有被调用,因此也不能调用onRestoreInstanceState。
2个回答

42

简单的答案是:因为我没有给我的视图(自定义或非自定义视图)设置id。如果视图没有设置ID,Android将无法管理onSaveInstanceState/onRestoreInstanceState

因此,由于我的自定义视图扩展了基本视图,并且没有额外的属性,将一个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中添加静态id <item name="myCustomView" type="id"/>


2
对我来说,在方向改变时,这个程序无法正常工作,因为横屏和竖屏有不同的布局。虽然 OnSaveInstanceState 被调用了,但 onRestoreInstanceState 却没有被调用。 - Boy
@Boy 我也遇到了同样的问题。你的视图是否在一个被 ViewPager 托管的 Fragment 中? - Andrea Baccega
@AndreaBaccega 确实是这样。似乎ViewPager也会恢复一些片段。 - Boy
@AndreaBaccega 你可以尝试使用 android:configChanges="orientation|keyboardHidden|screenSize",这可能会修复它。 - Hugo Gresse

4

默认情况下保存状态

我们现在已经准备好让视图保存和恢复其状态了。但是,默认情况下这不会发生。如果您希望您的视图实例自动保存状态,可以将以下行添加到init方法中:

setSaveEnabled(true);

做这件事是由您自行决定的。即使您的视图默认不保存状态,视图的用户仍然可以通过调用 setSaveEnabled(true) 或在布局XML中指定 android:saveEnabled="true" 来启用保存状态。


视图仍需要一个android:id才能正常工作... setSaveEnabled()的文档说:“...视图仍必须分配一个id(通过{@link #setId(int)}))才能保存其状态....”。saveEnabled默认也为true - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接