如何在MvvmCross版本中制作DrawerMenu? v.5.4.2

时间:2017-11-08 11:48:43

标签: android mvvm xamarin.android mvvmcross drawerlayout

我正在使用来自MvvmCross存储库的 StarWarsEaxmple ,但我无法使其正常运行。 MvvmCross的输出,我认为问题出在MvvmCross或Presenter的不同版本中。 在Sample中,版本是5.1.1,在我的项目中是5.4.2。并且表现出奇怪的行为。

当我不涉及MvvmCross NavigationService时,我可以看到空抽屉。但是,当我同时导航到两个ViewModels时(如示例中所示),我只能看到没有抽屉的菜单页面,甚至不会调用其他页面框架。

Reference to MvvmCross Sample

主要活动

[Activity(Icon = "@drawable/icon", 
    Theme = "@style/AppTheme", LaunchMode = LaunchMode.SingleTop, 
    ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : MvxCachingFragmentCompatActivity<MainViewModel>
{
    public DrawerLayout DrawerLayout;
    //This method is invoked
    protected override void OnCreate(Bundle bundle)
    {            base.OnCreate(bundle);
        SetContentView(Resource.Layout.activity_main);

        DrawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawerLayout);

        ViewModel.ShowDefaultMenuItem();
    }
....

菜单片段

[MvxFragment(typeof(MainViewModel), Resource.Id.navigationFrame)]
[Register("VacationManager.Droid.Activities.MenuFragment")]
public class MenuFragment : MvxFragment<MenuViewModel>, NavigationView.IOnNavigationItemSelectedListener
{
    private NavigationView _navigationView;
    private IMenuItem _previousMenuItem;

   //This method is invoked too
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {

        base.OnCreateView(inflater, container, savedInstanceState);
        var view = this.BindingInflate(Resource.Layout.menu_view, null);

        _navigationView = view.FindViewById<NavigationView>(Resource.Id.navigation_view);
        _navigationView.SetNavigationItemSelectedListener(this);

        return view;
    }
}

页面的主要部分

[MvxFragment(typeof(MainViewModel), Resource.Id.bodyFrame, false)]
[Register("VacationManager.Droid.Activities.VacationRequestListFragment")]
public class VacationRequestListFragment : BaseFragment<VacationRequestListViewModel> // You can find BaseFragment in sample
{
    protected override int FragmentId => Resource.Layout.fragment_list;
    //It is never invoked
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView(inflater, container, savedInstanceState);
        return this.BindingInflate(Resource.Layout.fragment_list, container, false);
    }
} 

MainPage布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:local="http://schemas.android.com/apk/res-auto"
      android:id="@+id/drawerLayout"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@color/warning">

      <!-- Center Side -->


      <android.support.design.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/mainFrame">

            <include layout="@layout/toolbar" />
            <FrameLayout
              android:id="@+id/bodyFrame"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:layout_centerInParent="true"/>

            <android.support.design.widget.FloatingActionButton
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="bottom|right"
              android:layout_margin="16dp"
              android:src="@drawable/bullseye"
              local:layout_anchor="@id/bodyFrame"
              local:layout_anchorGravity="bottom|right|end" />

      </android.support.design.widget.CoordinatorLayout>

      <!-- Left Side -->
      <FrameLayout
        android:id="@+id/navigationFrame"
        android:layout_height="match_parent"
        android:layout_width="240dp"
        android:layout_gravity="left|start"
        android:clickable="true" />

</android.support.v4.widget.DrawerLayout>

MainPage布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.NavigationView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_view"
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeToolbarNavigationView"
    android:background="@color/colorPrimary"
    local:itemTextColor="@color/light_gray"
    local:itemIconTint="@color/light_gray"
    local:headerLayout="@layout/navigation_header"
    local:menu="@menu/navigation_drawer" />

主要ViewModel

public void ShowDefaultMenuItem()
{
    NavigationService.Navigate<VacationRequestListViewModel>();
    NavigationService.Navigate<MenuViewModel>();
}

似乎我失去了一些小细节......任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

问题首先在于活动的属性名称空间。它们应该 MvvmCross.Droid.Views.Fragments 。而且MvxFragmentAttribute代替MvxFragmentPresentationAttribute,我们需要使用 wb 。然后就行了。

相关问题