我正在使用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();
}
}
我也有同样的问题,我想我已经设法解决了它,至少在我的案件中是这样。(我在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中只加载一个页面吗?