我在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
对于我的第二个和第三个标签,代码基本上与第一个相同。它们都没有与选项卡一相同的问题。导航到相应的视图模型后,将不会创建片段。
导致我的第一个标签片段在加载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();
}
}
答案 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中做了很多工作吗?
但这当然只是一个理论。无论哪种方式,这似乎都能奏效,也许会对某人有所帮助。