上次使用Xamarin.Android实现了一个比较常用的功能PullToRefresh,详情见:Xamarin. Android实现下拉刷新功能

这次将实现另外一个手机App中比较常用的功能:侧滑菜单。通过搜索,发现有很多侧滑菜单,有仿手机QQ的侧滑菜单,有折叠的侧滑菜单,有SlidingMenu等,不过我还是比较喜欢 ResideMenu实现的效果,所以想通过Xamarin.Android的绑定实现该效果。这次实现该菜单遇到的问题比较多,花的时间也较多,花了三四个晚上才解决所有的问题。下面是详细的实现步骤:

作者:loyldg 出处:http://www.cnblogs.com/loyldg/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:loyldg@126.com 联系我,非常感谢。

一、生成ResideMenu.dll

  1. 从网上下载ResideMenu的源代码,我是下载的master分支的代码,如果有需要可以下载其他分支的代码。
  2. 导入到MyEclispe中,编译一下(默认情况导入后会自动编译)。
  3. 打开ResideMenu所在的目录,将res目录和生成的bin目录里的内容打包成residemenu.zip。
  4. 在Visual Studio中新建一个Android Binding 项目,命名为ResideMenuLib。
  5. 在ResideMenuLib项目的Jars目录里添加residemenu.zip和nineoldandroids-library-2.4.0.jar(在ResideMenu项目的libs目录里),将residemenu.zip的生成操作设置为LibraryProjectZip,nineoldandroids-library-2.4.0.jar的生成操作设置为ReferenceJar,注意是ReferenceJar而不是EmbeddedReferenceJar。
  6. 编译ResideMenuLib项目。

二、使用ResideMenu

  普通方式使用就不贴代码了,简单描述一下使用步骤,详细的代码请看Mvvmcross中使用ResideMenu

  1. 在Visual Studio中新建ResideMenuDemo项目。
  2. 分别添加对ResideMenuLib和NineOldAndroids的引用,NineOldAndroids直接引用Nuget里面的就ok,否则需要重新绑定NineOldAndroids,然后添加引用。
  3. 将Java的ResideMenuDemo(与ResideMenu在同一目录)转换为C#的即可。
  4. 编译C#版的ResideMenuDemo,然后运行。

三、MvvmCross中使用ResideMenu

其实在MvvmCross中使用ResideMenu和普通方式使用差不多,只是MvvmCross中需要设置对应的ViewModel。需要注意的是,使用低版本SDK时需要引用Xamarin.Android.Support.v4.dll,下面是具体的步骤:

  1. 新建一个可以移植的类库项目MvxResideMenu.Core,通过Nuget添加对MvvmCross的引用
  2. 添加ViewModel的代码
  3. 新建Android项目MvxResideMenu.Droid,删除自动生成的MainActivity,通过Nuget添加对MvvmCross和NineOldAndroids的引用
  4. 编写对应的View和相关布局代码
  5. 编译并运行

  下面是代码:

ViewModel的代码:

public class BaseViewModel : MvxViewModel
    {
        private string _hello = "Hello MvvmCross BaseViewModel";

        public string Hello
        {
            get { return _hello; }
            set
            {
                _hello = value;
                RaisePropertyChanged(() => Hello);
            }
        }

        private string _title;

        public string Title
        {
            get { return _title; }
            set
            {
                _title = value;
                RaisePropertyChanged(() => Title);
            }
        }
    }

    public class MainViewModel : BaseViewModel
    {
        public MainViewModel()
        {
            Hello = "Hello MvvmCross MainViewModel";
            Title = "MainViewModel";
        }
    }

    public class FirstViewModel
        : BaseViewModel
    {     
        public FirstViewModel()
        {
            Hello = "Hello MvvmCross FirstViewModel";
            Title = "FirstViewModel";
        }
    }

    public class SecondViewModel : BaseViewModel
    {
       public SecondViewModel()
        {
            Hello = "Hello MvvmCross SecondViewModel";
            Title = "SecondViewModel";
        }
    }

    public class ThirdViewModel : BaseViewModel
    {
        public ThirdViewModel()
        {
            Hello = "Hello MvvmCross ThirdViewModel";
            Title = "ThirdViewModel";
        }
    }

    public class FourthViewModel : BaseViewModel
    {
        public FourthViewModel()
        {
            Hello = "Hello MvvmCross FourthViewModel";
            Title = "FourthViewModel";
        }
}
View Code

相关文章: