的一个片段

问题描述:

添加多个父活动我有一个片段需要被访问,而用户登录并且当用户是注销。因此我需要一个片段用于两个活动。我正在使用mvvmcross 4.1与Xamarin和Monodroid以及新添加的片段多亲功能。我不确定我是否正确实施了。的一个片段

不希望使用ViewPager,因为在查看屏幕时加载的相邻屏幕。

当我尝试导航到具有两个父活动的片段时,出现Android.Content.ActivityNotFoundException: Unable to find explicit activity class {za.co.app.something.example/examplepcl.droid.views.GetHelpView}; have you declared this activity in your AndroidManifest.xml?错误。

我一直在寻找在GitHub上的示例项目:https://github.com/MvvmCross/MvvmCross-AndroidSupport/tree/master/Samples/Example.Droid

请发表评论,并告诉我,我是否应该与我的基类和的ViewModels的代码更新我的问题。

我的片段:

using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using MvvmCross.Binding.BindingContext; 
using ExamplePCL.Droid.ModalPopups; 
using ExamplePCL.ViewModels; 
using MvvmCross.Droid.Shared.Attributes; 

namespace ExamplePCL.Droid.Views 
{ 
    [MvxFragment(typeof(LoggedOutTabViewModel), Resource.Id.content_frame)] 
    [MvxFragment(typeof(LoggedInTabViewModel), Resource.Id.content_frame)] 
    [Register("examplepcl.droid.views.GetHelpView")] 
    public class GetHelpView : BaseFragment<GetHelpViewModel> 
    { 
     protected override int FragmentId => Resource.Layout.gethelp; 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      var view = base.OnCreateView(inflater, container, savedInstanceState); 

      return view; 
     } 
    } 
} 

我的活动:

活动1:

using Android.App; 
using Android.OS; 
using Android.Views; 
using ExamplePCL.ViewModels; 
using Android.Content.PM; 
using Android.Support.V4.Widget; 
using ExamplePCL.Droid.Fragments; 
using Android.Support.V4.View; 
using ExamplePCL.Droid.Interfaces; 
using MvvmCross.Droid.Support.V7.Fragging.Caching; 
using Android.Widget; 
using Android.Support.Design.Widget; 
using Android.Support.V4.Content; 

namespace ExamplePCL.Droid.Views 
{ 
    [Activity(
     Theme = "@style/AppTheme", 
     LaunchMode = LaunchMode.SingleTask, 
     ScreenOrientation = ScreenOrientation.Portrait, 
     WindowSoftInputMode = SoftInput.AdjustResize | SoftInput.StateAlwaysHidden, 
     Name = "examplepcl.droid.views.LoggedInTabView")] 
    public class LoggedInTabView : BaseLoggedCachingFragmentActivity<LoggedInTabViewModel>, IDrawerActivity 
    { 
     TabLayout _globalNavTabLayout; 
     int _previousTab; 

     #region Activity LifeCycle Handling 

     protected override int ContentLayoutId => Resource.Layout.loggedin_base_view; 

     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      if (bundle == null) 
       ViewModel.ShowMenu(); 

      // Setup tabs 
      _globalNavTabLayout = FindViewById<TabLayout>(Resource.Id.tabs); 
      SetupTabLayout(); 
     } 

     protected override void OnPause() 
     { 
      _globalNavTabLayout.TabReselected -= GlobalNavTabLayout_TabReselected; 
      _globalNavTabLayout.TabSelected -= GlobalNavTabLayout_TabSelected; 
      base.OnPause(); 
     } 

     protected override void OnResume() 
     { 
      _globalNavTabLayout.TabReselected += GlobalNavTabLayout_TabReselected; 
      _globalNavTabLayout.TabSelected += GlobalNavTabLayout_TabSelected; 
      base.OnResume(); 
     } 

     #endregion 

     #region Menu and Toolbar Option Handling 

     public override bool OnOptionsItemSelected(IMenuItem item) 
     { 
      switch (item.ItemId) 
      { 
       case Android.Resource.Id.Home: 
        DrawerLayout.OpenDrawer(GravityCompat.Start); 
        return true; 
      } 
      return base.OnOptionsItemSelected(item); 
     } 

     #endregion 

     #region Tab Layout 

     void GlobalNavTabLayout_TabSelected(object sender, TabLayout.TabSelectedEventArgs e) 
     { 
      int tabPosition = e.Tab.Position; 

      SetTabPosition(tabPosition); 
     } 

     void GlobalNavTabLayout_TabReselected(object sender, TabLayout.TabReselectedEventArgs e) 
     { 
      int tabPosition = e.Tab.Position; 

      SetTabPosition(tabPosition); 
     } 

     void SetupTabLayout() 
     { 
      _globalNavTabLayout.AddTab(_globalNavTabLayout.NewTab()); 
      _globalNavTabLayout.GetTabAt(0).SetCustomView(Resource.Layout.tab_layout_loggedin); 
      _globalNavTabLayout.GetTabAt(0).CustomView.FindViewById<ImageView>(Resource.Id.tab_icon).SetImageResource(Resource.Drawable.icon_my_bill); 

      _globalNavTabLayout.AddTab(_globalNavTabLayout.NewTab()); 
      _globalNavTabLayout.GetTabAt(1).SetCustomView(Resource.Layout.tab_layout_loggedin); 
      _globalNavTabLayout.GetTabAt(1).CustomView.FindViewById<ImageView>(Resource.Id.tab_icon).SetImageResource(Resource.Drawable.ico_my_products); 

      _globalNavTabLayout.AddTab(_globalNavTabLayout.NewTab()); 
      _globalNavTabLayout.GetTabAt(2).SetCustomView(Resource.Layout.tab_layout_loggedin); 
      _globalNavTabLayout.GetTabAt(2).CustomView.FindViewById<ImageView>(Resource.Id.tab_icon).SetImageResource(Resource.Drawable.btn_launchpadimage); 

      _globalNavTabLayout.AddTab(_globalNavTabLayout.NewTab()); 
      _globalNavTabLayout.GetTabAt(3).SetCustomView(Resource.Layout.tab_layout_loggedin); 
      _globalNavTabLayout.GetTabAt(3).CustomView.FindViewById<ImageView>(Resource.Id.tab_icon).SetImageResource(Resource.Drawable.ico_get_help); 

      _globalNavTabLayout.AddTab(_globalNavTabLayout.NewTab()); 
      _globalNavTabLayout.GetTabAt(4).SetCustomView(Resource.Layout.tab_layout_loggedin); 
      _globalNavTabLayout.GetTabAt(4).CustomView.FindViewById<ImageView>(Resource.Id.tab_icon).SetImageResource(Resource.Drawable.ico_track); 

      //Bring the TabLayout to the front so that it overlays the main content in the 
      var tabLayout = FindViewById<LinearLayout>(Resource.Id.linlay_appbar_globalnav); 
      tabLayout.BringToFront(); 

      SetTabPosition(2); 
     } 

     void SetTabPosition(int index) 
     { 
      switch (index) 
      { 
       case 0: 
        ViewModel.ShowMyBillScreenCommand.Execute(); 
        break; 
       case 1: // My Products 
        ViewModel.ShowMyProductsScreenCommand.Execute(); 
        break; 
       case 3: // Help 
        ViewModel.ShowGetHelpScreenCommand.Execute(); 
        break; 
       case 4: // Tracks 
        ViewModel.ShowTrackScreenCommand.Execute(); 
        break; 
       case 2: // QuickLinks 
        ViewModel.ShowQuickLinksScreenCommand.Execute(); 
        break; 
      } 
     } 

     #endregion 
    } 
} 

活动2:

using Android.App; 
using Android.OS; 
using Android.Content.PM; 
using ExamplePCL.ViewModels; 
using Android.Support.V4.View; 
using MvvmCross.Droid.Support.V7.Fragging.Caching; 
using ExamplePCL.Droid.Fragments; 
using Android.Support.Design.Widget; 
using Android.Widget; 
using Android.Views; 
using Android.Util; 
using Android.Content.Res; 
using Android.Support.V4.Content; 
using System.Threading.Tasks; 

namespace ExamplePCL.Droid.Views 
{ 
    [Activity(
     Theme = "@style/AppTheme", 
     LaunchMode = LaunchMode.SingleTask, 
     ScreenOrientation = ScreenOrientation.Portrait, 
     Name = "examplepcl.droid.views.LoggedOutTabView")] 
    public class LoggedOutTabView : BaseLoggedCachingFragmentActivity<LoggedOutTabViewModel> 
    { 
     TabLayout _globalNavTabLayout; 
     int _previousTab; 

     #region Activity LifeCycle Handling 

     protected override int ContentLayoutId => Resource.Layout.loggedout_base_view; 

     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      if (bundle == null) 
       ViewModel.ShowMenu(); 

      // Setup tabs 
      _globalNavTabLayout = FindViewById<TabLayout>(Resource.Id.tabs); 
      SetupTabLayout(); 
     } 

     protected override void OnPause() 
     { 
      _globalNavTabLayout.TabReselected -= GlobalNavTabLayout_TabReselected; 
      _globalNavTabLayout.TabSelected -= GlobalNavTabLayout_TabSelected; 

      base.OnPause(); 
     } 

     protected override void OnResume() 
     { 
      _globalNavTabLayout.TabReselected += GlobalNavTabLayout_TabReselected; 
      _globalNavTabLayout.TabSelected += GlobalNavTabLayout_TabSelected; 
      base.OnResume(); 
     } 

     #endregion 

     #region Tab Layout 

     void GlobalNavTabLayout_TabSelected(object sender, TabLayout.TabSelectedEventArgs e) 
     { 
      _globalNavTabLayout.TabSelected -= GlobalNavTabLayout_TabSelected; 
      _globalNavTabLayout.TabReselected -= GlobalNavTabLayout_TabReselected; 

      int tabPosition = e.Tab.Position; 

      SetTabPosition(tabPosition); 

      _globalNavTabLayout.TabSelected += GlobalNavTabLayout_TabSelected; 
      _globalNavTabLayout.TabReselected += GlobalNavTabLayout_TabReselected; 
     } 

     void GlobalNavTabLayout_TabReselected(object sender, TabLayout.TabReselectedEventArgs e) 
     { 
      _globalNavTabLayout.TabReselected -= GlobalNavTabLayout_TabReselected; 

      int tabPosition = e.Tab.Position; 

      SetTabPosition(tabPosition); 

      _globalNavTabLayout.TabReselected += GlobalNavTabLayout_TabReselected; 
     } 


     public void SetupTabLayout() 
     { 
      _globalNavTabLayout.AddTab(_globalNavTabLayout.NewTab()); 
      _globalNavTabLayout.GetTabAt(0).SetCustomView(Resource.Layout.tab_layout); 
      _globalNavTabLayout.GetTabAt(0).CustomView.FindViewById<ImageView>(Resource.Id.tab_icon).SetImageResource(Resource.Drawable.ico_get_help); 

      _globalNavTabLayout.AddTab(_globalNavTabLayout.NewTab()); 
      _globalNavTabLayout.GetTabAt(1).SetCustomView(Resource.Layout.tab_layout); 
      _globalNavTabLayout.GetTabAt(1).CustomView.FindViewById<ImageView>(Resource.Id.tab_icon).SetImageResource(Resource.Drawable.ico_track); 

      _globalNavTabLayout.AddTab(_globalNavTabLayout.NewTab()); 
      _globalNavTabLayout.GetTabAt(2).SetCustomView(Resource.Layout.tab_layout); 
      _globalNavTabLayout.GetTabAt(2).CustomView.FindViewById<ImageView>(Resource.Id.tab_icon).SetImageResource(Resource.Drawable.btn_launchpadimage); 

      _globalNavTabLayout.AddTab(_globalNavTabLayout.NewTab()); 
      _globalNavTabLayout.GetTabAt(3).SetCustomView(Resource.Layout.tab_layout); 
      _globalNavTabLayout.GetTabAt(3).CustomView.FindViewById<ImageView>(Resource.Id.tab_icon).SetImageResource(Resource.Drawable.ico_lock); 

      //Bring the TabLayout to the front so that it overlays the main content 
      var tabLayout = FindViewById<LinearLayout>(Resource.Id.linlay_appbar_globalnav); 
      tabLayout.BringToFront(); 

      SetTabPosition(2); 
     } 

     async void SetTabPosition(int index) 
     { 
      switch (index) 
      { 
       case 0: // Get Help 
        ViewModel.ShowGetHelpScreenCommand.Execute(); 
        break; 
       case 1: // Track 
        ViewModel.ShowTrackScreenCommand.Execute(); 
        break; 
       case 2: // Quick Links 
        ViewModel.ShowQuickLinksScreenCommand.Execute(); 
        break; 
       case 3: // Login 
        ViewModel.ShowLoginScreenCommand.Execute(); 
        break; 
      } 
     } 

     #endregion 
    } 
} 

UPDATE:

这个问题似乎是与我使用的库MvvmCross.Droid.Shared.Attributes的方式。如果我只使用一个属性([MvxFragment(typeof(LoggedOutTabViewModel), Resource.Id.content_frame)]),我仍然会得到相同的错误。

但是,如果我使用库MvvmCross.Droid.Support.V7.Fragging.Attributes只有一个属性,那么我没有得到任何错误。但显然我不能使用该库,因为我需要两个属性来执行多个活动。

+0

在这种情况下,基于您登录或不登录这两项活动,似乎很愚蠢。为什么不让ViewModel根据它决定要做什么,只需切换可用选项卡的可见性? – Cheesebaron

+0

谢谢你的回复@cheesebaron !!我会喜欢这样做,但我不能对视图模型或架构做太多的修改,因为iOS版本已经完成,并且android版本已接近英寸。我的控制做出了太多的架构改变:(所以我正在寻找一个解决方案,将离开我只需做最小的改变 –

+0

你的'IDrawerActivity'实现了什么?这个'Interface'没有在你的'LoggedOutTabView' – Pilatus

尝试从您的项目中删除MvvmCross.Droid.Support.V7.Fragging包,因为从Mvx 4.1.4版本开始,它一直是depricated。它现在形成MvvmCross.Droid.Shared包的一部分,您可以从 nuget Link下车。已经显示安装了这两个软件包会导致issues

+0

它花了很多重构,但删除了包MvvmCross.Droid.Support.V7.Fraggin克'做了诡计。感谢您的帮助,您为我节省了很多时间! –

+1

MvvmCross.Droid.Shared直到5.1.1才使用,需要更改为MvvmCross.Droid.Support.Fragment – cfl

这更是一个解决办法比的解决方案,但你可以这样做:

而不必叫GetHelpView一个片段类,创建这三个 - >

GetHelpViewLoggedOut 

GetHelpViewLoggedIn 

GetHelpViewBase 

GetHelpViewBase可以包含所有常见代码介于GetHelpViewLoggedInGetHelpViewLoggedOut之间,甚至重复使用相同的代码ViewModel

不理想,但可能是一种解决方法。