我需要了解如何使用MvxCachingFragmentCompatActivity。我在previous question之前问过这个问题,但是我得到了一段示例代码,这有用但不是我需要的代码。我需要的是了解如何使用它。
首先,我有一个活动,我的所有观点都是片段。
我的重要假设是,如果我的活动被拆除并需要恢复,使用MvxCachingFragmentCompatActivity将使我能够恢复我的应用程序导航层次结构。有人可以确认这是否正确。
如果这是正确的,我该如何使用它。例如
如果有一些相关的文档会很棒。
我需要知道这一点,因为我的活动被拆除,然后在我使用另一个活动进行相机功能后恢复。当Activity恢复自身时,我的片段的ViewModel为null。我也发现Close(this)在我的视图模型中不起作用。我确信我没有做我需要做的所有事情来完成这项工作,但我需要指导它应该如何使用。
任何帮助都会受到赞赏,也许是来自MvvmCross团队的人。我真的被困在这里了。我更喜欢描述行为,而不是指向一个样本,但两者都很棒。
[ 更新 ] 所以我构建了V4和V7 MvvmCross库的调试版本并开始调试。据我所知,只要你将以下属性添加到你的片段类中,就应该设置缓存你的片段。
[MvxFragment(typeof(MainActivityViewModel), Resource.Id.contentFrame, AddToBackStack = true, IsCacheableFragment = true)]
[Register("com.dummynamespace.MyFragment")]
请注意,小写命名空间很重要,您的类名称可以是大小写混合。
但是,在我的活动被销毁并重新创建之后,我仍然会遇到问题。在我的情况下,我实际上看到我的活动被破坏,并且连续不断地重建。一个例子是我在活动销毁并重新创建后无法关闭视图。这似乎是由于GetFragmentInfoByTag(MvxCachingFragmentCompatActivity类)中的代码返回关闭视图所需的错误信息。关闭功能需要返回的IMvxCachedFragmentInfo中的ContentId,但是将其返回为0.此外,AddToBackStack属性设置为false。下面我列出了片段信息
中返回的内容AddToBackStack = false
CacheFragment = true
CachedFragment = null
ContentId = 0
FragmentType = This is set to the correct fragment type
Tag = This is set to the corresponding view model for the fragment
在销毁并重新创建活动之前,片段信息是正确的。
我正在使用MvvmCross 4.2.3。有没有其他人经历过这个?
更新02/03/2017 我发现我的活动被破坏和重建不是由于记忆而是由于相机的方向。我们发现只有当我们以横向模式保持相机时它才会失败。
关于ContentId设置为0的问题是由于我的应用程序无法解析IMvxJsonConverter实现。未安装MvvmCross Json插件时会发生这种情况。此外,您必须将以下内容添加到App.cs文件中,以便可以注册
Mvx.RegisterType<IMvxJsonConverter, MvxJsonConverter>();
如果没有这样做,那么Try.Resolve将失败,并且会跳过使用它的代码。有时它会以静默方式完成,有时会输出日志。在我看来,如果你期望你的应用程序能够在活动被拆除和重建后继续存在,那么这应该是致命的。
还安装了一个MvvmCross Json插件,您必须在视图模型save-Restore中实现保存和恢复状态模式
更新新问题08/03/2017 我正在测试应用程序中每个视图的恢复。我这样做是通过允许更改方向来销毁我的MvxCachingFragmentCompatActivity然后重新创建它。
当活动被破坏时,我的片段也被破坏了。在这一点上,我整理了我的视图模型,以确保它是免费的,不会导致内存泄漏。
然而,当遇到OnCreate时,我遇到了一个问题。它似乎做了两件事
问题是调用MvxFragmentExtensions OnCreate(1)调用视图模型缓存并返回一个尚未启动的视图模型,例如调用它的Start(),但这用于设置DataContext。
在调用RestoreViewModelsFromBundle(2)之后,虽然DataContext已经通过构造函数 - >初始化 - >恢复状态 - >开始设置,但不会再次设置事件。所以我现在有一个视图模型设置不正确,所以我的视图不起作用。
当我拿出我的代码来整理视图模型时,由于(1)设置的缓存视图模型现在具有正确的数据,因此我得到了更多。但我遇到了其他问题,因为它试图创建一个新的视图模型,因为调用了RestoreViewModelsFromBundle(2)。作为一个短期修复,无论如何我可以强制将作为恢复过程一部分创建的视图模型设置为ViewModel
MvvmCross团队的成员是否可以帮助了解一些有关此处发生的事情以及原因的信息?