当前位置: 首页 > 知识库问答 >
问题:

MvvmCross第一个选项卡片段是在用navigate加载viewpager时创建并销毁的

方河
2023-03-14

我正在使用MVVMCROSS6与Xamarin Android。刚刚升级到MVX6.2,但问题仍然存在。我正在跟随样例游乐场加载视页。我有一个活动持有3个选项卡的视图页。在活动的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);

在playground示例中,当通过导航到那些选项卡的viewmodel构建viewpager时,不会创建选项卡片段。片段只有在显示时才会被创建。

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

是什么原因导致我的第一个选项卡片段在加载视页时被创建?请帮忙。

谢谢,

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);
}
    protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.activity_setting);

           …..

            ViewModel.ShowInitialViewModelsCommand.Execute();
        }
  ……
  <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个答案

益智明
2023-03-14

我也有同样的问题,我想我已经设法解决了它,至少在我的案件中是这样。(我在MvvmCross 6.2.3上)

我从ViewModel的ViewEmpression lifecycle回调调用ShowInitialViewModelsCommand(请参见https://www.mvvmcross.com/documentation/guritials/viewModel-Lifecycle),因为我觉得片段必须担心导航问题是不对的。当我发现这个问题时,我将它移回OnCreate,就像在游乐场示例中一样,问题就消失了。通过进一步的实验,看起来我可以从ViewModel的ViewCreated回调调用它,该回调比ViewExpression更早调用。

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

但那当然只是一种理论。不管怎样,这似乎是有效的,也许它会帮助某人。

 类似资料:
  • 我有一个,有4个选项卡。

  • 在我的应用程序中,我有一个ViewPager,里面有很多可滑动的标签,里面有碎片。我使用方法检测何时出现在屏幕上。当用户在选项卡之间滑动时,这非常有效,但它在第一次加载时不起作用。要运行该方法中的代码,我必须向左滑动,然后返回到第一个,因为方法是在方法之前调用的。 你有任何想法,我如何运行这段代码后,第一个片段是可见的吗?中有方法吗?

  • 我想使用带有选项卡的ViewPager。然而,我需要在寻呼机上方放置一个文本视图(以及选项卡),如下所示: 看起来对于选项卡小部件,我们可以使用PagerTitleStrip或PagerTabStrip内联一个选项卡小部件: 但是,PagerTitleStrip和PagerTabStrip小部件的风格与只使用ActionBar选项卡时不同。我希望选项卡看起来像它们,具有均匀间隔的选项卡大小。 是否

  • 我已经在我的片段中重写了以下方法:setUserVisibleHint 在fragment类中,变量设置为:private var isLoadOnce=false。 我有3个片段,问题是当我的活动popsup时,第一个片段是可见的,如果我单击最后一个选项卡,也就是第三个选项卡加载第三个片段,什么也不会发生,即web服务根本不会调用。

  • 我正在使用ViewPager Tablayout显示5个选项卡,当选择这些选项卡时,将从服务器获取数据以显示。所获取的数据的唯一区别是所选的选项卡。所以有5个片段做同样的事情是多余的。因此,我实现了使用一个片段,如下所示。 活动 片断 我怎样才能消除问题的点击选项卡混为一谈,我猜是由于双重调用开始片段。

  • 我使用了和。 但它一次加载两个页面。 有什么方法可以在viewpager中只加载一个页面吗?