Android fragments 使用navigate<;加载viewpager时,创建并销毁了MvvmCross第一个选项卡片段&燃气轮机;

Android fragments 使用navigate<;加载viewpager时,创建并销毁了MvvmCross第一个选项卡片段&燃气轮机;,android-fragments,xamarin.android,android-viewpager,mvvmcross,Android Fragments,Xamarin.android,Android Viewpager,Mvvmcross,我将Mvvmcross 6与Xamarin Android一起使用。刚刚升级到Mvx 6.2,但问题依然存在。我按照示例游乐场加载viewpager。我有一个活动,其中包含一个用于3个选项卡的viewpager。在活动的viewmodel中,选项卡被添加到viewpager: var tasks = new List<Task>(); tasks.Add(_navigationService.Navigate<SettingPreferenceViewModel

我将Mvvmcross 6与Xamarin Android一起使用。刚刚升级到Mvx 6.2,但问题依然存在。我按照示例游乐场加载viewpager。我有一个活动,其中包含一个用于3个选项卡的viewpager。在活动的viewmodel中,选项卡被添加到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);
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>
……
设置首选项片段

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();
        }
    }
[MvxTabLayoutPresentation(TabLayoutResourceId=Resource.Id.tabs\u fragment\u setting\u viewpager,
ViewPagerResourceId=Resource.Id.viewpager\u片段\u设置\u viewpager,
Title=“P”,
ActivityHostViewModelType=typeof(SettingRootViewModel))]
[寄存器(名称(设置首选项片段))]
公共类设置PreferenceFragment:BaseFragment
{
受保护覆盖int FragmentId=>Resource.Layout.fragment\u设置\u首选项;
创建时公共覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
创建视图上的公共覆盖视图(布局、充气机、视图组容器、,
Bundle savedInstanceState)
{
//view=BindingInflate(Resource.Layout.fragment\u route\u summary,null)在基本片段中处理
var view=base.OnCreateView(充气机、容器、savedInstanceState);
返回视图;
}
公共覆盖无效OnDestroy()
{
base.ondestory();
}
}

我遇到了完全相同的问题,我想我已经设法解决了这个问题,至少在我的案例中是这样。(我在MvvmCross 6.2.3上)

我从ViewModel的ViewEmerging生命周期回调中调用ShowInitialViewModelsCommand(请参阅),因为我觉得片段必须担心导航问题是不对的。当我发现这个问题时,我把它移回到了游乐场示例中的OnCreate,问题就消失了。通过进一步的实验,看起来我可以从ViewModel的ViewCreated回调调用它,该回调在ViewModel出现之前被调用

基于此,我的理论是,在ViewPager的初始化过程中有一个点,如果它不存在,它会创建它的第一个片段,如果该点发生在运行导航调用之前,那么该片段将被创建两次。你在OnCreate中做了很多工作吗

但这当然只是一个理论。不管怎样,这似乎奏效了,也许会对某人有所帮助

  ……
  <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>
    [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();
        }
    }