MvvmCross第一个选项卡片段是在使用Navigation <>

时间:2018-09-19 10:53:48

标签: android-fragments xamarin.android android-viewpager mvvmcross

我在Xamarin Android上使用Mvvmcross 6。刚升级到Mvx 6.2,但问题仍然存在。我正在跟踪示例游乐场来加载viewpager。我有一个活动,其中包含3个标签的viewpager。在活动视图模型中,选项卡被添加到viewpager:

    var tasks = new List<Task>();
    tasks.Add(_navigationService.Navigate<SettingPreferenceViewModel>());
    tasks.Add(_navigationService.Navigate<SettingTrackingViewModel>());
    tasks.Add(_navigationService.Navigate<SettingCalorieViewModel>());
    await Task.WhenAll(tasks);

在游乐场示例中,通过导航到这些选项卡的viewmodel来构建viewpager时,不会创建选项卡片段。片段只有在显示时才会创建。

但是,就我而言,在Navigate ()之后,将创建SettingPreferenceFragment。使用Navigate ()创建第二个选项卡后,SettingPreferenceFragment将被销毁。稍后,SettingPreferenceFragment在显示时再次创建。即第一个标签创建两次。第一次创建和销毁是意外的。

对于我的第二个和第三个标签,代码基本上与第一个相同。它们都没有与选项卡一相同的问题。导航到相应的视图模型后,将不会创建片段。

导致我的第一个标签片段在加载viewpager期间创建的可能原因是什么?请帮忙。

谢谢

尼克

SettingRootViewModel.cs

public SettingRootViewModel(
    IMvxNavigationService navigationService
    //IMvxMessenger messenger
)
{
    _navigationService = navigationService;

    ShowInitialViewModelsCommand = new MvxAsyncCommand(ShowInitialViewModels);
}


public IMvxAsyncCommand ShowInitialViewModelsCommand { get; private set; }

private async Task ShowInitialViewModels()
{
    var tasks = new List<Task>();
    tasks.Add(_navigationService.Navigate<SettingPreferenceViewModel>());
    tasks.Add(_navigationService.Navigate<SettingTrackingViewModel>());
    tasks.Add(_navigationService.Navigate<SettingCalorieViewModel>());
    await Task.WhenAll(tasks);
}

SettingActivity.cs

    protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.activity_setting);

           …..

            ViewModel.ShowInitialViewModelsCommand.Execute();
        }

Activity.xml

  ……
  <LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.TabLayout
      android:id="@+id/tabs_fragment_setting_viewpager"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      local:tabIndicatorColor="@color/gray_700"
      local:tabGravity="fill"
      local:tabMode="fixed" />

    <android.support.v4.view.ViewPager
      android:id="@+id/viewpager_fragment_setting_viewpager"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

  </LinearLayout>

SettingPreferenceFragment

BaseFragment是一个MvxFragment。我尝试直接使用MvxFragment实施,但情况仍然相同。

    [MvxTabLayoutPresentation(TabLayoutResourceId = Resource.Id.tabs_fragment_setting_viewpager, 
    ViewPagerResourceId = Resource.Id.viewpager_fragment_setting_viewpager, 
    Title = "P", 
    ActivityHostViewModelType = typeof(SettingRootViewModel))]
[Register(nameof(SettingPreferenceFragment))]

    public class SettingPreferenceFragment : BaseFragment<SettingPreferenceViewModel>
    {
        protected override int FragmentId => Resource.Layout.fragment_setting_preference;


        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container,
                                          Bundle savedInstanceState)
        {
            // view = BindingInflate(Resource.Layout.fragment_route_summary, null) is handled in base fragment
            var view = base.OnCreateView(inflater, container, savedInstanceState);

            return view;
        }

        public override void OnDestroy()
        {
            base.OnDestroy();
        }
    }

1 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题,我认为至少已经解决了我的问题。 (我在MvvmCross 6.2.3上)

我正在从ViewModel的ViewAppearing生命周期回调(请参阅https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle)中调用ShowInitialViewModelsCommand,因为Fragment不得不担心导航对我来说是错误的。当我发现此问题时,就像在Playground示例中一样,将其移回了OnCreate,问题就消失了。经过进一步的实验,看来我可以从ViewModel的ViewCreated回调中调用它,该回调早于ViewAppearing调用。

基于此,我的理论是,ViewPager的初始化中有些地方会创建第一个Fragment(如果尚不存在),并且如果该点发生在您运行Navigate调用之前,被创建两次。您可能在OnCreate中做了很多工作吗?

但这当然只是一个理论。无论哪种方式,这似乎都能奏效,也许会对某人有所帮助。