快讯:Xamarin公司与微软达成全面合作,将捆绑vs2013

早上收到Xamarin的邮件,他们在纽约时间2013年11月13日上午宣布Xamarin将加入到VS2013(而且肯定是内置),让开发者使用C#语言高效开发优雅的ios和android的应用,届时还将给MSDN的订阅者们提供相关专题内容,太棒了! 这是mono老大Miguel de Icaza(米格尔·德伊卡萨)http://t.cn/8Dkw4qt 在twitter上的留言,他认为今天对于C#和F#是一个伟大的日子,估计Xamarin这两年过来的艰辛只有他们团队自己知道。 最后,恭喜Xamarin,恭喜Mono老大,这将是写入C#发展史的一件大事。

November 15, 2013

《基于Mono for android移动开发》ppt讲座

这是我们团队内部关于Mono for android讲座的ppt,写得一般,不过能点出一些开发过程中的要害。 下载地址:基于Mono for android移动开发

August 9, 2013

Mono for android获取网络状态

app应用的一个重要功能就是连接到互联网,而连接互联网可以有很多中方式,2G、3G、wifi等方法,有时候是没有网络的,所以在开发应用的时候,需要判断网络状态。 mono for android提供了比较简便的方法来获取网络状态,代码如下: /// <summary> /// 获取网络状态 /// </summary> /// <returns><c>true</c>, if net work was checked, <c>false</c> otherwise.</returns> /// <param name="context">Context.</param> public static bool CheckNetWork(Context context) { var connectivityManager = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService); if(connectivityManager.ActiveNetworkInfo!=null) { NetworkInfo.State netWorkState=connectivityManager.ActiveNetworkInfo.GetState(); if(netWorkState==NetworkInfo.State.Connected) { return true; } } return false; }

August 8, 2013

Mono for android中ListView控件使用

今天介绍Mono for android中ListView控件使用,并且支持在ListView中嵌入button,支持button触发单独事件,ListView自身的行触发单独时间。 别小看了这个问题,MonoDroid(mono for android的前身)刚刚出来的时候,ListView里面是不能嵌入button的,即使能嵌入也不支持单独事件,还好新版本支持了。这里会涉及到一些技巧,我只是大致讲一下思路,后期会做成项目发到github上面去,大家下载下来就ok。 我要实现的效果是,在ListView的每一行里添加button按钮,并且点击ListView的行进入该行详情,点击行上面的按钮,则进入其他相关操作,比如购买、订阅,如下图所示: 按照语法,分别创建AnimalListActivity和AnimalListAdapter,这里主要关注度在Adapter里面怎么给button添加click事件,特别是复用和不复用item的情况。 view.FindViewById<Button> (Resource.Id.btn_Take).Click += delegate { Intent intent = new Intent (this.context, typeof(BuyActivity)); context.StartActivity (intent); }; 1、如果不复用item,可以实现上面的效果,但是如果加载的数据流超过50左右直接会导致卡死;所以必须得复用; 2、如果复用item,需要注意如何给button添加复用事件。我已经想到解决办法了:只能在item的view被创建的第一次的时候给item加click事件,否则会支持n+1次 if (convertView == null || !(convertView is TableLayout)) { view = context.LayoutInflater.Inflate(Resource.Layout.SubListItems, parent, false); //订阅按钮 var Iv_sub=view.FindViewById<ImageView>(Resource.Id.Iv_Sub); Iv_sub.Tag=position; Iv_sub.Click += delegate { int pos=Convert.ToInt32(Iv_sub.Tag); 这里还需要用到一个技巧Iv_sub.Tag=position;和int pos=Convert.ToInt32(Iv_sub.Tag);这两段代码是相呼应的。

August 7, 2013

Mono for android中使用HorizontalPager

智能手机上通过手势翻页的效果很普遍,这是大多数应用的必备功能,目前已经有很多jar包的类库实现了这个方法,不过这次我们不需要引用jar包,因为热心的程序员已经把java版的HorizontalPager翻译成了c#版的,可以直接在项目中使用。 github上面有相关的代码,直接去下载就可以https://github.com/Cheesebaron/MonoDroid.HorizontalPager 将这个类添加到自己的项目中,使用方法如下: var horiPager = new HorizontalPager (this); horiPager.ScreenChanged += new ScreenChangedEventHandler (horiPager_ScreenChanged); horiPager.AddView (BuildWebView (nextPageModel)); 其中,horiPager_ScreenChanged是翻页的过程中执行的委托方法,如果需要在翻页的过程中或者完成前后做操作,可以把相应的方法写在这里。 **重要说明:**HorizontalPager因为支持手势左右滑动翻页,所以捕获不到单指点击事件,但是可以通过修改源代码,实现当点击中间的时候能捕获到点击事件(不过这样手势在中间滑动的时候会捕获不到): 找到方法public override bool OnTouchEvent(MotionEvent e),修改case为Down的情况 case MotionEventActions.Down: mLastMotionX = ev.GetX(); mLastMotionY = ev.GetY(); if(mLastMotionX>deviceWith*5/11&&mLastMotionX<deviceWith*6/11) { return true; }

June 15, 2013

Mono for android中实现下拉刷新PullToRefreshListView

下拉刷新是现在微博非常流行的更新操作,android中有非常经典的类库PullToRefreshListView,不过开发者已经把java代码转成c#了,在github上面有相关的代码下载。 使用比较简单,下面给出步骤: step1:将PullToRefreshListView类库引用到项目中,并且把相关的资源文件和xml界面文件也拷贝到项目中pull_to_refresh_header.axml; step2:定义相关的类 #region 下拉刷新 private class RefreshListener : PullToRefreshListView.OnRefreshListener { private MainActivity mylActivity; List<WodubaoService.Model.hotnews> tempList; public RefreshListener (MainActivity activity) { mylActivity = activity; } public void onRefresh () { ThreadPool.QueueUserWorkItem (delegate { mylActivity.isNetWork = WebHelper.CheckNetWork (mylActivity); if (mylActivity.isNetWork) { tempList = mylActivity.appA.GetAppHots (); } mylActivity.RunOnUiThread (delegate { bool isUpate=false; if (tempList != null && tempList.Count > 0) { if(!tempList[0].articleId.Equals(mylActivity.htnList[0].articleId)) { isUpate=true; } mylActivity.htnList = tempList; } if(mylActivity.isNetWork) { if(isUpate) { mylActivity.myList=new List(); mylActivity.myList.Add(mylActivity.htnList); mylActivity.myList.Add(“nextpage”); mylActivity.mainListAdapter.NotifyDataSetChanged(); Toast.MakeText (mylActivity, “已更新最新资讯”, ToastLength.Short).Show (); ...

June 7, 2013

Mono for android中引入经典类库slidingmenu

这两年,google风格的android菜单很流行,因为能节省大量的屏幕空间,而slidingmenu是国外一个开源的类库,能实现类似facebook和google plus这样的菜单功能,通过之前的介绍,我们已经能轻松在Mono for android中引入jar包。下面介绍如何引入slidingmenu,并且实现他。 step1:从github上下载https://github.com/jfeinstein10/SlidingMenu ,并且在项目中引用,按照Mono for android中引用jar包的方法添加这个类库,编译一般都会成功; step2:在需要用到的Acitivity中引用 using Com.Slidingmenu.Lib.App; step3:调用相关函数 View menu = inflatorservice.Inflate (Resource.Layout.LeftMenu, null); SetBehindContentView (menu); 说明:如果打算调整menu的可以拉动的宽度,调用方法 SlidingMenu.SetBehindWidth (200);

June 6, 2013

Mono for android实现UI多线程

在实际开发过程中,我们需要使用多线程来保证UI不被卡住,mono for android提供了非常方便的方法来进行多线程开发,其中一种就是使用Thread,下面是一个例子: var progressDialog = ProgressDialog.Show(this, null, “加载中…”, true); ; //启动页面 new Thread(new ThreadStart(delegate { loginuser = userapi.Login(Et_phone.Text, Et_pwd.Text, true); this.RunOnUiThread(() => { progressDialog.Hide(); if (loginuser.uid != null && loginuser.uid.Length != 0) { Finish(); } else { Toast.MakeText(this, “登录失败,请输入正确的用户名或密码”, ToastLength.Short).Show(); } }); })).Start(); 这里其实是使用了C#的线程Thread来完成,不过有一个确定,就是不能终止当前的线程,比如如果这个线程执行慢,我先终止,暂时没有找到终止的办法

May 17, 2013

Mono for android中添加友盟sdk的第二种方法

前一篇文章介绍了如何在Mono for android中引用jar包的方法,这个方法比较麻烦,而且需要学习大量的桥接语言的命名规则,而且参数传递也很麻烦,今天我将介绍另外一种更加方便和简介的方法。通过今天的方法,我们可以添加任意的jar包,并且可以直接在c#项目中引用相应的类库,就如同我们引用一个c#类库一样,在这种方法中,一切的都是非常c#的。 step1:mono for android的解决方案中,创建新的工程,选择Android下的“Android Java Bindings Library”; step2:在新创建的项目中有一个文件夹"Jars",在这个文件夹中添加自己需要引用的jar包; step3:将新添加的Jar包的Build action设置为EmbeddedJar; step4:编译新增的工程,如果没有出问题,那么恭喜你可以调用这个jar包了,在这一步可能会出现错误,下一篇文章我会详细介绍。其实在这一步中mono完成了一项工作:将jar包的代码进行了转换,编程c#代码,非常强大。 step5:在项目中引用上面编译好的工程,然后就可以直接引入名称空间,并且可以使用C#一样的语法对jar包里面的所有方法、属性进行调用。比如: Com.Umeng.Socialize.Controller.UMServiceFactory.ShareTo(this,meta,“分享自最大的数字报刊平台“我读报”)",photo); 网络上大量的开源jar包你都可以使用。

May 15, 2013

Mono for android中添加友盟sdk的第一种方法

如何在Mono for android中添加友盟sdk,这个功能非常重要,他直接牵扯一个非常重要的问题:如何在mono for android的项目中引入jar包?考虑到android目前大量的应用都是基于java开发的,很多开源的类库和组件也是基于java开发的,所以如何在mono项目引入jar包非常关键,这是做mono for android应用开发的核心之一。我们在项目中已经成功地引入了jar包,几乎所有的包都可以引入和使用,这当然归功于xamarin公司的优秀产品。 在这里,我先介绍第一种方法:直接在app项目引入jar包,通过桥接语言调用。其实在实际项目中这种方式用得很少,但我强烈建议每一个C#程序员都尝试一次,因为他会让你对编程语言有更深一层次的理解。我以umeng_sdk.jar为例,这个包主要是用于统计app运行、安装等情况的。 step1:在项目添加现有文件,选择umeng_sdk.jar; step2:将umeng_sdk.jar的属性Build Action,设置为AndroidJavaLibrary; step3:创建一个类,如下所示 /// /// Java libary helper. /// java类库 /// public static class JavaLibaryHelper { #region umeng class private static IntPtr _umengHelperClass = JNIEnv.FindClass(“com/umeng/analytics/MobclickAgent”); public static void UmengOnResume(Context context) { IntPtr methodId = JNIEnv.GetStaticMethodID(_umengHelperClass, “onResume”, “(Landroid/content/Context;)V”); JNIEnv.CallStaticVoidMethod(_umengHelperClass, methodId,new JValue(context)); } public static void UmengOnPause(Context context) { IntPtr methodId = JNIEnv.GetStaticMethodID(_umengHelperClass, “onPause”, “(Landroid/content/Context;)V”); JNIEnv.CallStaticVoidMethod(_umengHelperClass, methodId,new JValue(context)); ...

May 6, 2013