我有一个有两个动态部分的界面,其中一个比另一个更复杂。我不得不花一些时间使用Bundles和onSaveInstanceState()
等,以便在方向改变时保留第一部分的状态。
然后我转向用第二个更简单的部分做同样的事情,然后马上注意到我没有做某些事情。此部件的布局在onCreate()
中膨胀,它包含TextViews和EditTexts,其内容可以更改。此内容将保留,但布局的动态更改不会。
通过从主屏幕重新启动应用程序来调用onCreate()
时,不会保留更改。
我必须通过Bundle正确实现连续性,因为未保留的是在onCreate()
中创建的对应于视图的对象的状态。这一点,以及行为不一致的事实(从主屏幕重新开始与方向改变重新开始)使得很难将其视为“特征”,因为它意味着从XML中膨胀“新鲜”布局可能并不总是提供真正的新鲜与R.layout.whatever完全对应的布局。
我也猜测这可能发生在Activity的可见生命周期中,而不仅仅是onCreate()。那么这里的规则是什么?
答案 0 :(得分:2)
此内容已保留,但布局的动态更改不是
保留用户可变的常见小部件内容,例如输入EditText
的文本,是onSaveInstanceState()
内置实现的自动内容。但是,"视图...已删除并添加到其中" (来自您问题的上一版)肯定不会被onSaveInstanceState()
保留,如果您重新夸大布局,这些更改肯定会丢失。
当通过从主屏幕重新启动应用程序来调用onCreate()时,不会保留更改。
嗯,这取决于流程是否仍然存在,以及此活动是否在后台。
那么这里的规则是什么?
如果用户返回到您的活动的特定实例(配置更改,或从recent-tasks列表启动新进程),则您保存的实例状态将应用于创建的新活动实例。
如果用户在没有返回活动的特定实例(例如,主屏幕启动器)的情况下开始新进程,则不会应用保存的实例状态。