【问题标题】:MVVMCross-Android dynamic fragment inside fragment and manage navigation stack per fragmentMVVMCross-Android 动态片段内部片段并管理每个片段的导航堆栈
【发布时间】:2019-02-28 08:55:49
【问题描述】:

我目前正在开发 MVVMCross Xamarin Android 项目。到目前为止,我已经实现了正常导航和底栏导航。我想在每个底栏标签中打开动态片段。例如,我有底部栏菜单最近、收藏和附近。单击每个选项卡会创建片段。在每个片段中,我想提供在点击时动态创建片段的工具。

我想在这里实现的是,它应该明智地保持导航标签的堆栈。假设我分别为“最近”、“收藏”和“附近”创建了 5、3、4 个片段,目前我在最喜欢的选项卡上,单击返回应该首先导航回所有 3 个选项卡。同样,它应该遵循其他选项卡的导航。

此 github 链接中提供的特性和功能完全相同 [https://github.com/ncapdevi/FragNav][1]。这是适用于 Android 的,但我需要建议如何使用 Xamarin、MVVMCross 和 C# 实现相同的功能。

非常感谢任何帮助。

【问题讨论】:

    标签: c# android xamarin mvvmcross


    【解决方案1】:

    首先你的链接失效了,然后我认为你需要了解碎片的后台堆栈并显示隐藏的功能来实现它。FragmentTransaction

    一般思路,你有RecentFragmentFavoriteFragmentNearByFragment三个根片段, 当您点击相关标签时,您可以使用片段的 showhide 方法,例如 这个:

     FragmentTransaction fTransaction = FragmentManager.BeginTransaction();
                hideAllFragment(fTransaction);
                //judge which tab is clicked
                switch (tab.Id)
                {
                    case Recent:                
                        if (recentFragment== null)
                        {
                            recentFragment= new RecentFragment ();
                            fTransaction.Add(Resource.Id.ly_content, recentFragment);
                        }
                        else{fTransaction.Show(recentFragment);}break;
                    case Favorite:
                        if (favoriteFragment== null)
                        {
                            favoriteFragment= new FavoriteFragment();
                            fTransaction.Add(Resource.Id.ly_content, favoriteFragment);
                        }
                        else{fTransaction.Show(favoriteFragment);}
                        break;
                    case NearBy:
                        if (nearByFragment== null)
                        {
                            nearByFragment= new NearByFragment();
                            fTransaction.Add(Resource.Id.ly_content, nearByFragment);
                        }else{fTransaction.Show(nearByFragment);}break;
                }
                fTransaction.Commit();
    

    然后在每个根片段中实现回栈使用addToBackStack

    FragmentManager fragmentManager = FragmentManager;
            FragmentTransaction fragmentTransaction = fragmentManager.BeginTransaction();
            fragmentTransaction.Replace(containerViewId,fragment);
            fragmentTransaction.AddToBackStack(null);
            fragmentTransaction.Commit();
    

    最后你可以尝试封装一个控制器

    【讨论】:

    • 感谢您关注这位Leo Zhu。我会仔细阅读你的答案并更新你。请查看链接github.com/ncapdevi/FragNav
    • 嗨,Leo,你的想法似乎不错,但为了实现确切的功能,我所做的是在 C# 中转换了完整的 github.com/ncapdevi/FragNav 控制器代码。花了很多努力,但最终它按预期工作。我仍然必须检查如何包含 MVVM 交叉视图模型。
    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 2023-02-14
    • 2019-04-24
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2015-07-25
    相关资源
    最近更新 更多