【发布时间】:2015-07-20 23:32:19
【问题描述】:
当我的应用程序启动时,我会动态地将片段实例(例如,fragment1)添加到未添加到后台堆栈的事务中的内容布局中。该片段显示了一些通过newInstance(List<Obj>) 静态方法传递给它的缓存数据。在onSaveInstanceState() 中,我保存数据,以便在重新创建片段时显示它。
现在假设我不重新创建片段。假设我用第二个片段替换它,比如fragment2(这次将事务添加到后台堆栈),执行两次屏幕旋转,然后按回。该应用程序将弹出返回堆栈并尝试再次显示fragment1,然后它会尝试显示List<Obj>,这将是null,因此将抛出NullPointerException。
我知道这是因为 fragment1 实例从一开始就没有被保存,因为它不在后台堆栈中,并且在设备旋转时也没有显示。
我的问题是,在这种情况下支持屏幕旋转的最合适的方式是什么?我可以将初始事务保存在后台堆栈中并让onBackPressed() 在弹出后台堆栈之前验证getSupportFragmentManager().getBackStackEntryCount() >= 1(我不希望弹出初始事务,因为fragment1 是我的初始屏幕)但我不' t认为这是正确的方法。有什么想法吗?
【问题讨论】:
-
您是否在
onResume中初始化/重新初始化?我希望它能处理这种情况,但我还没有测试过。 -
这种情况下
onResume我觉得没有什么特殊情况需要处理。 -
我的意思是,你能在
onResume中重新初始化List<Obj>吗?它应该在片段返回到前台时调用。 -
我宁愿不要。这样做对我来说听起来不太容易维护。如果我的应用程序的初始片段可以是多个不同的片段类,或者如果我决定添加其他片段而不将事务保存到后台堆栈,则我必须在
onResume上进行多次重新初始化。 -
等等。抱歉,我在考虑活动的
onResume。我可以在片段的onResume上做到这一点,但据我了解,问题不止于此。fragment1实例正在重新创建(它在轮换期间被销毁)并且没有对原始List<Obj>数据的引用。
标签: android android-fragments fragment-backstack fragmentmanager