【问题标题】:How to add a fragment to the backstack in MvvmCross 4.0?如何在 MvvmCross 4.0 中向 backstack 添加片段?
【发布时间】:2016-03-20 13:13:10
【问题描述】:

我有一个在框架布局中托管片段的 Activity。如果我将显示的片段更改为另一个片段,则该片段不会添加到后退堆栈中,因此使用“后退”按钮将立即关闭应用程序而不是导航回来(FragmentManager.BackStackEntryCount 在 OnBackPressed 中始终为 0 ()-回调)。

在托管片段的“MainActivity”的 ViewModel 中,我通过 ShowViewModel-方法显示片段:

public class MainViewModel : MvxViewModel
{
    public IMvxCommand ShowHomeCommand
    {
        get { return new MvxCommand(ShowHomeExecuted); }
    }

    private void ShowHomeExecuted()
    {
        ShowViewModel<HomeViewModel>();
    }
}

片段类具有将 ViewModel 分配给主机活动的注释:

[MvxFragment(typeof(MainViewModel), Resource.Id.fragment_container)]
[Register("namespace.of.HomeFragment")]

我在我的设置类中使用默认的 AndroidViewPresenter:

protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
   var mvxFragmentsPresenter = new MvxFragmentsPresenter(AndroidViewAssemblies);
   Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(mvxFragmentsPresenter);
   return mvxFragmentsPresenter;
}

我希望在 MvxFragment 属性或 MvxFragment 类中有一个参数“AddToBackstack”或类似参数,但没有这样的。 MvvmCross 4.0 中的新片段机制中是否遗漏了某些内容或当前不支持返回堆栈?

【问题讨论】:

    标签: c# android xamarin mvvmcross


    【解决方案1】:

    您可以做的是在您的MainActivity 中添加类似这样的内容:

    public override void OnBeforeFragmentChanging (IMvxCachedFragmentInfo fragmentInfo, Android.Support.V4.App.FragmentTransaction transaction)
            {
                var currentFrag = SupportFragmentManager.FindFragmentById (Resource.Id.content_frame) as MvxFragment;
    
                if(currentFrag != null 
                    && fragmentInfo.ViewModelType != typeof(MenuViewModel) 
                    && currentFrag.FindAssociatedViewModelType() != fragmentInfo.ViewModelType)
                    fragmentInfo.AddToBackStack = true;
                base.OnBeforeFragmentChanging (fragmentInfo, transaction);
            }
    

    这将在导航发生之前将片段添加到后台堆栈。

    【讨论】:

      【解决方案2】:

      我认为这就像将片段上的属性更改为一样简单

      [MvxFragment(typeof(MainViewModel), Resource.Id.fragment_container, AddToBackStack = true)]
      [Register("namespace.of.HomeFragment")]
      

      这当然适用于 v4.2.3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-25
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多