片段在主机活动中变为空

时间:2016-03-25 13:57:00

标签: android android-fragments xamarin mvvmcross

  • 我想从另一个片段调用片段方法,所以我在主机活动中找到相关片段并调用该片段的方法。但有一段时间我得到片段null。

    假设我想从所有其他片段保存片段A的数据。有4个片段,如A,B,C和D.当我从片段A和B中单击保存按钮然后它工作正常但是当我从片段C和D保存数据时,片段A变为空。

这是我的代码:

HostActivity.cs

 public class HostActivityView : MvxCachingFragmentCompatActivity<HostActivityViewModel>
{
 protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        try
        {               

            SetContentView(Resource.Layout.HostActivityView);

            var toolbar = FindViewById<Toolbar>(Resource.Id.myToolbar);

            if (toolbar != null)
            {
                // Toolbar will now take on default actionbar characteristics
                SetSupportActionBar(toolbar);                    
            }

            // View Pager
            var viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);
            if (viewPager != null)
            {
                // Add tabs in view pager
                var fragments = new List<MvxFragmentStatePagerAdapter2.FragmentInfo>
            {
                new MvxFragmentStatePagerAdapter2.FragmentInfo("Ticket", typeof(Tab_Ticket), typeof(TicketEditViewModel)),
                new MvxFragmentStatePagerAdapter2.FragmentInfo("Employee", typeof(Tab_Employee), typeof(EmployeeViewModel)),
                new MvxFragmentStatePagerAdapter2.FragmentInfo("Response", typeof(Tab_Correspondence), typeof(ResponseViewModel)),
                new MvxFragmentStatePagerAdapter2.FragmentInfo("Expense", typeof(Tab_Expenses), typeof(ExpenseViewModel)),                   

            };
                viewPager.Adapter = new MvxFragmentStatePagerAdapter2(this, SupportFragmentManager, fragments);
            }

            var tabLayout = FindViewById<TabLayout>(Resource.Id.tabs);
            tabLayout.SetupWithViewPager(viewPager);              

        }
        catch (Exception ex)
        {
            Mvx.Resolve<IUserInteraction>().Alert(ex.Message);
        }

    }

 public override bool OnOptionsItemSelected(IMenuItem item)
{
switch (item.ItemId)
{
   case Resource.Id.menu_accept:

       Tab_Ticket tabTicket = (Tab_Ticket)SupportFragmentManager.FindFragmentByTag("Tab_Ticket");
       if (tabTicket != null)
       {
            tabTicket.OnOptionsItemSelected(item);
            handled = true;
       }                   

       break;       
}
} 
}

这是我的片段代码: Fragment.cs:

public class Tab_Ticket : MvxFragment<TicketEditViewModel>
{
 public override View OnCreateView(Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState)
    {
        var ignored = base.OnCreateView(inflater, container, savedInstanceState);

        var view = this.BindingInflate(Resource.Layout.frg_tab_ticket, null);
        return view;
    }
    public override bool OnOptionsItemSelected(IMenuItem item)
    {
        switch (item.ItemId)
        {

            case Resource.Id.menu_accept:
                this.ViewModel.CmdTicketSave.Execute(null);
                return true;
                break;
        }
    }
 }

请建议我哪里出错了?

谢谢

1 个答案:

答案 0 :(得分:0)

终于得到了解决这个问题的方法。 在主机活动中增加视图寻呼机页面限制。因为我有5个片段,默认它在支持片段管理器中显示3个片段。所以有时候第一个片段为null。在我的代码中添加了这一行,它运行正常。

viewPager.OffscreenPageLimit = 6;

Here是关于此问题的更多详细信息。