目前,MvvmCross 没有像为活动提供任何类型的自动导航机制一样为 Fragment 提供自动导航机制。
但是,在您的用例中,如果您想使用导航方法,那么您可以自动构建类似类型的自动查找/导航机制。
为此,最简单的开发者根可能是使用反射来查找所有片段的查找字典
var fragments = from type in this.GetType().Assembly.GetTypes()
where typeof(IAnimalGroupView)..sAssignableFrom(type)
where type.Name.EndsWith("Fragment")
select type;
var lookup = fragments.ToDictionary(
x => x.Name.Substring(0, x.Name.Length - "Fragment".Length)
+ "ViewModel",
x => x);
有了这个,您就可以在需要时创建片段 - 例如
- 假设您通过 ViewModel 上的 ICommand 将 Selection 事件转换为
ShowViewModel<TViewModel>
调用
并假设您有一个自定义 Mvx 演示者,它拦截这些 ShowViewModel 请求并将它们传递给活动(类似于片段示例) - 例如
public class CustomPresenter
: MvxAndroidViewPresenter
{
// how this gets set/cleared is up to you - possibly from `OnResume`/`OnPause` calls within your activities.
public IAnimalHostActivity AnimalHost { get; set; }
public override void Show(MvxViewModelRequest request)
{
if (AnimalHost != null && AnimalHost.Show(request))
return;
base.Show(request);
}
}
那么你的活动可以Show
使用类似的东西来实现:
if (!lookup.ContainsKey(request.ViewModelType.Name))
return false;
var fragmentType = lookup[request.ViewModelType.Name];
var fragment = (IMvxFragmentView)Activator.Create(fragmentType);
fragment.LoadViewModelFrom(request);
var t = SupportFragmentManager.BeginTransaction();
t.Replace(Resource.Id.my_selected_fragment_holder, fragment);
t.Commit();
return true;
笔记:
- 如果您不在
ShowViewModel
这里使用,那么显然可以调整相同的方法...但是这个答案必须提出一些建议...
- 在更大的多页应用程序中,您可能希望使这种
IAnimalHostActivity
机制更加通用并在多个地方使用它。