我在 MainFragment 中创建视图模型:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
...
MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
...
}
当用户选择项目然后导航到详细信息片段时,该事务将添加到后台堆栈。
getFragmentManager()
.beginTransaction()
.replace(R.id.root, Details.newInstance())
.addToBackStack(null)
.commit();
当用户在“详细信息”片段中按返回时,一切正常,但如果用户在“详细信息”片段中旋转设备并按返回,则:
- 为 MainFragment 创建 ViewModel 的新实例
- 旧实例仍然存在(未调用 onCleared 方法)
这是 ViewModelProviders 中的错误吗?如何解决这个问题?
我认为 ViewModel 应该恢复。
这并不是很明显,但是当你打电话时addToBackStack
,片段管理器不会销毁您的片段,只是在新片段时停止它replace
交易来了。现在,您的后台堆栈上基本上有两个项目,它们都是您的实例Details
. Since onDestroy
从来没有被要求第一个,它的ViewModel's
onCleared
也从未被调用过。
在您的情况下,只需检查您的片段当前是否在容器中(例如通过FragmentManager.findFragment()
在这种情况下不更换它应该足够了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)