我的活动在恢复时可能会显示DialogFragment
。正如fragment transactions tutorial中所述,我在onResumeFragments()
中这样做,以避免可怕的IllegalStateException: Can not perform this action after onSaveInstanceState
。在大多数情况下,一切都很好。
但我的活动还有一个OnSharedPreferenceChangeListener
,可以在更改某个偏好时重新启动活动。触发侦听器的首选项更改是由Spinner
中的选择引起的。如果活动通过调用recreate()
重新启动,则会获得IllegalStateException
。但如果活动像这样重新启动,那就没问题了:
finish();
final Intent intent = new Intent(StartActivity.this, StartActivity.class);
startActivity(intent);
我更喜欢使用recreate()
,因为我希望保存我的实例状态。为什么会导致在onResumeFragments()
之后调用onSaveInstanceState()
?
答案 0 :(得分:0)
setRetainInstance(true)
的片段,但在onCreate(...)
而不是onActivityCreated(...)
中缓存了对其活动的引用。该片段试图使用旧活动显示对话框。 (更确切地说,活动是从onResumeFragments()
间接调用片段上的方法。)相当混乱。我应该重新考虑片段和活动之间的整个关系。
编辑:我已经发现了另一种可能发生的方式,这不是我的错。如果锁定屏幕显示在正在运行的活动上,则会调用onSaveInstanceState()
。但是当锁定屏幕被解除时,onRestoreInstanceState()
在onResume()
和onResumeFragments()
之间 。这个bug至少有五年了。谢谢,谷歌。