定居北平

从2010年开始准备资金,去年下半年开始慢慢在网上看房子,今年春节来之后,跑遍了大兴、房山、昌平、亦庄,看了十几个楼盘,经历了好几次的验资、摇号、选房。开始两次摇号选房都落空了,上周五长阳的一个楼盘开了,开发商为了省钱,把我们这个有优惠的用户排到了后面,本来已经对这个盘绝望,但选房的第二天销售说还有房子,又燃起了希望,我们带着希望跑过去了,最后选上了小区楼王的二层….. 交定金的那一刻,有点恍惚,无数次想象选到房子的情景并不是这样的。出来看见还有那么多人在排队,周末又看见其他楼盘依然那么多人抢有限的房子,心里稍微安慰了些。其实真的,这房子不便宜,怎么就能像抢大白菜一样,男女老少不看价格地疯抢呢?!不知道十年二十年后回想这时的我们,会有多少感慨。 没想到,真的定居这里了——我待了5年的城市,这是我们做的最大的一件事之一,几年的积蓄倾注进去了,我谨慎、自信地等待入住和幸福美满的生活。

July 19, 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

Mono for android绑定jar包报错解决办法

前面讲过,通过EmbeddedJar方式可以绑定jar包,这个在实践中已经证明没有问题了,但是绑定的过程中,可能会出现一些小错误,我在绑定讯飞语点的jar包的时候,就报了如下的错误: Error message: obj\Debug\generated\src\Com.Iflytek.Speech.SpeechRecognizer.cs(8,69,8,80): error CS0234: 命名空间“Com.Iflytek.Speech”中不存在类型或命名空间名称“SpeechBaser”(是否缺少程序集引用?) obj\Debug\generated\src\Com.Iflytek.Speech.SpeechSynthesizer.cs(8,70,8,81): error CS0234: 命名空间“Com.Iflytek.Speech”中不存在类型或命名空间名称“SpeechBaser”(是否缺少程序集引用?) obj\Debug\generated\src\Com.Iflytek.Speech.SpeechUnderstander.cs(8,71,8,82): error CS0234: 命名空间“Com.Iflytek.Speech”中不存在类型或命名空间名称“SpeechBaser”(是否缺少程序集引用?) obj\Debug\generated\src\Com.Iflytek.Speech.TextUnderstander.cs(8,69,8,80): error CS0234: 命名空间“Com.Iflytek.Speech”中不存在类型或命名空间名称“SpeechBaser”(是否缺少程序集引用?) IDE Version: xamarin.studio 4.0.3 当时几乎觉得无望的时候,给xamarin公司发了邮件,过了两天,他们回复了解决办法。他们的邮件说:这是mono for android的一个bug。幸亏给了解决办法: 在创建的类库(引用了jar包的类库)的Transforms文件夹下有个Metadata.xml,在这个文件里加入: public OnVolumeChangedEventArgs 就可以解决问题了,我相信其他类似的jar包也可以通过这种方式解决。 这也算是我为开源做的一次贡献,发现了一个bug,挺开心的! 另外,估计xamarin公司会在下一个版本解决这个bug,坚信他们能解决。

April 20, 2013

Mono for android中使用WebView,并显示加载百分比,返回按钮使用

WebView是一个非常重要的控件,移动开发过程中会经常使用WebView来显示数据。WebView的使用非常简单,创建相应的对象,使用LoadData或者LoadUrl方法加载html数据,前者是价值html字符串,后者是加载一个可访问的URL地址。 这是基本应用,WebView还有两个高级应用,一个是显示加载的百分比,另外一个是支持返回按钮。 1、如何加载百分比 这里需要对WebView的方法进行重写,如下所示: private class AwesomeWebClient : WebViewClient { } private class AwesomeWebChromeClient : WebChromeClient { private Activity mParentActivity; private string mTitle; public AwesomeWebChromeClient(Activity parentActivity) { mParentActivity = parentActivity; mTitle = parentActivity.Title; } public override void OnProgressChanged(WebView view, int newProgress) { mParentActivity.Title = string.Format(“Loading {0}%”, newProgress); mParentActivity.SetProgress(newProgress * 100); if (newProgress == 100) mParentActivity.Title = mTitle; } } 然后,调用相应的WebView方法: newsWebView = FindViewById(Resource.Id.newsWebView); newsWebView.Settings.JavaScriptEnabled = true; newsWebView.Settings.SetSupportZoom(true); newsWebView.Settings.BuiltInZoomControls = true; newsWebView.Settings.LoadWithOverviewMode = true; //Load 100% zoomed out ...

April 11, 2013

设置Mono for android启动页

移动应用都有应用启动页,在mono for android里,设置应用启动页非常简单。 1、在Style.xml里添加设置: 2、在需要的启动Activity里设置: [Activity(Label = “我读报”, MainLauncher = true, Theme = “@style/Theme.Splash”, ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait, NoHistory = true)] public class SplashActivity : Activity{ }

April 10, 2013