gpt4 book ai didi

android - 根据所选项目 ViewModel 类型选择 fragment View

转载 作者:行者123 更新时间:2023-11-30 03:34:12 32 4
gpt4 key购买 nike

目标 MvvmCross,Android

目标:一个屏幕 (ViewModel/View),用户可以在其中选择动物组(两栖动物、鸟类、鱼类、无脊椎动物、哺乳动物、爬行动物)。选择一个组后, fragment View 将显示该动物组的信息。字段和布局因动物组而异(例如,鱼没有翅膀)。虽然对于这个问题我选择了动物组(这是非常静态的),但希望动物组列表是灵活的。

简化的应用程序结构:

  • MyApp.Core
    • View 模型
    • 主视图模型
    • IAnimalGroupViewModel
    • AmphibiansViewModel
    • BirdsBViewModel
    • FishViewModel
  • MyApp.Droid
    • 布局
      • 主视图
      • 两栖动物 fragment
      • 鸟类 fragment
      • 鱼片
    • 观点
      • 主视图
      • 两栖动物 fragment
      • 鸟类 fragment
      • 鱼片

MainView.axml 布局文件将包含(一个占位符)所显示动物组的 fragment 。

在 WPF 或 WP8 应用程序中,我可以使用 ContentPresenter 和 Style 自动显示选定的 ViewModel 及其 View 。

我怎样才能在 Droid 中实现类似的功能?

我可以在 MainView.cs 中使用 Switch/Case,它根据所选 ViewGroup 的类型设置 Fragment。但这意味着我每次添加新 View 时都必须修改 MainView。

有什么建议/想法吗?

最佳答案

目前,MvvmCross 没有像为 Activity 一样为 Fragments 提供任何类型的自动导航机制。

但是,在您的用例中,如果您想使用导航方法,那么您可以自动构建类似类型的自动查找/导航机制。

要做到这一点,最简单的开发者根可能是使用反射来查找所有 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);

有了这个,您就可以在需要时创建 fragment - 例如

  • 假设您通过 ViewModel 上的 ICommand 将 Selection 事件转换为 ShowViewModel<TViewModel>打电话
  • 并假设您有一个自定义 Mvx 演示器,它拦截这些 ShowViewModel 请求并将它们传递给 Activity (类似于 Fragment sample)- 例如

    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);
    }
    }
  • 然后您的 Activity 可以实现 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机制更通用,并在多个地方使用它。

关于android - 根据所选项目 ViewModel 类型选择 fragment View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16900323/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com