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

Mono for android中js与c#代码的交互

移动互联网的开发包中有大量的功能是设计到显示网页的,有些甚至是直接调取远程的网页,主要依赖于WebView这个控件,而实际的开发过程中,我们需要在js代码中调用c#里面的代码,或者在c#代码里直接调用相关的js方法,以完成更好的交互效果。 android sdk提供了非常简便的办法来实现这一的功能,而Mono for android也提供了相关的方法,步骤如下: step1:首先要在创建一个类,这个类是用于与js代码交互的,如下所示 public class Wodubao : Java.Lang.Object { Context context; public Wodubao (Context context) { this.context = context; } public Wodubao (IntPtr handle, JniHandleOwnership transfer) base (handle, transfer) { } [Export (“Article”)] // to become consistent with Java/JS interop convention, the argument cannot be System.String. public void Article (Java.Lang.String articleid) { ArticleActivity currentArticle = (ArticleActivity)context; currentArticle.Finish (); Intent intent = new Intent (context, typeof(ArticleActivity)); intent.PutExtra (“articleid”, articleid.ToString ()); context.StartActivity (intent); } } 说明:Wodubao是一个用于与js代码交互的类,在这个类里定义了一个方法Article ,这个就是js代码里的方法,方法需要一个参数 articleid,这个方法可以调用当前activity里的所有方法,以实现相应的效果。 ...

April 9, 2013

Mono for android中MD5加密的方法

其实和C#的代码是一样的,完全可以复用,这里给出相应的代码 /// /// MD5 /// /// /// public string MD5Hash(string strText) { MD5 MD5 = new MD5CryptoServiceProvider(); byte[] datSource = encoding.GetBytes(strText); byte[] newSource = MD5.ComputeHash(datSource); string byte2String = null; for (int i = 0; i < newSource.Length; i++) { string thisByte = newSource[i].ToString(“x”); if (thisByte.Length == 1) thisByte = “0” + thisByte; byte2String += thisByte; } return byte2String.ToUpper(); }

April 2, 2013

Mono for android中使用sqlite

小型数据库的使用在移动开发过程中非常方便,Mono for android提供了多种数据库访问方式,可以使用sqlite、使用WCF直接访问数据库,sqlite的访问非常简单,下面是一个使用monodroid(或者Mono for andorid访问数据库的方法): /// /// A helper class for working with SQLite /// public static class Database { private static string db_file = “database.db3”; public static SqliteConnection GetConnection () { var dbPath = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), db_file); bool exists = File.Exists (dbPath); if (!exists) SqliteConnection.CreateFile (dbPath); var conn = new SqliteConnection (“Data Source=” + dbPath); if (!exists) CreateDatabase (conn); return conn; ...

March 28, 2013