上次使用Xamarin.Android实现了一个比较常用的功能PullToRefresh,详情见:Xamarin. Android实现下拉刷新功能
这次将实现另外一个手机App中比较常用的功能:侧滑菜单。通过搜索,发现有很多侧滑菜单,有仿手机QQ的侧滑菜单,有折叠的侧滑菜单,有SlidingMenu等,不过我还是比较喜欢 ResideMenu实现的效果,所以想通过Xamarin.Android的绑定实现该效果。这次实现该菜单遇到的问题比较多,花的时间也较多,花了三四个晚上才解决所有的问题。下面是详细的实现步骤:
作者:loyldg 出处:http://www.cnblogs.com/loyldg/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:loyldg@126.com 联系我,非常感谢。
一、生成ResideMenu.dll
- 从网上下载ResideMenu的源代码,我是下载的master分支的代码,如果有需要可以下载其他分支的代码。
- 导入到MyEclispe中,编译一下(默认情况导入后会自动编译)。
- 打开ResideMenu所在的目录,将res目录和生成的bin目录里的内容打包成residemenu.zip。
- 在Visual Studio中新建一个Android Binding 项目,命名为ResideMenuLib。
- 在ResideMenuLib项目的Jars目录里添加residemenu.zip和nineoldandroids-library-2.4.0.jar(在ResideMenu项目的libs目录里),将residemenu.zip的生成操作设置为LibraryProjectZip,nineoldandroids-library-2.4.0.jar的生成操作设置为ReferenceJar,注意是ReferenceJar而不是EmbeddedReferenceJar。
- 编译ResideMenuLib项目。
二、使用ResideMenu
普通方式使用就不贴代码了,简单描述一下使用步骤,详细的代码请看Mvvmcross中使用ResideMenu
- 在Visual Studio中新建ResideMenuDemo项目。
- 分别添加对ResideMenuLib和NineOldAndroids的引用,NineOldAndroids直接引用Nuget里面的就ok,否则需要重新绑定NineOldAndroids,然后添加引用。
- 将Java的ResideMenuDemo(与ResideMenu在同一目录)转换为C#的即可。
- 编译C#版的ResideMenuDemo,然后运行。
三、MvvmCross中使用ResideMenu
其实在MvvmCross中使用ResideMenu和普通方式使用差不多,只是MvvmCross中需要设置对应的ViewModel。需要注意的是,使用低版本SDK时需要引用Xamarin.Android.Support.v4.dll,下面是具体的步骤:
- 新建一个可以移植的类库项目MvxResideMenu.Core,通过Nuget添加对MvvmCross的引用
- 添加ViewModel的代码
- 新建Android项目MvxResideMenu.Droid,删除自动生成的MainActivity,通过Nuget添加对MvvmCross和NineOldAndroids的引用
- 编写对应的View和相关布局代码
- 编译并运行
下面是代码:
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"; } }