Android fragments 使用navigate<;加载viewpager时,创建并销毁了MvvmCross第一个选项卡片段&燃气轮机;
我将Mvvmcross 6与Xamarin Android一起使用。刚刚升级到Mvx 6.2,但问题依然存在。我按照示例游乐场加载viewpager。我有一个活动,其中包含一个用于3个选项卡的viewpager。在活动的viewmodel中,选项卡被添加到viewpager: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
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();
}
}