15
11

早上收到Xamarin的邮件,他们在纽约时间2013年11月13日上午宣布Xamarin将加入到VS2013(而且肯定是内置),让开发者使用C#语言高效开发优雅的ios和android的应用,届时还将给MSDN的订阅者们提供相关专题内容,太棒了!

这是mono老大Miguel de Icaza(米格尔·德伊卡萨)http://t.cn/8Dkw4qt 在twitter上的留言,他认为今天对于C#和F#是一个伟大的日子,估计Xamarin这两年过来的艰辛只有他们团队自己知道。

1

 

最后,恭喜Xamarin,恭喜Mono老大,这将是写入C#发展史的一件大事。

09
8

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

下载地址:基于Mono for android移动开发

mono for android移动开发

08
8

Mono for android获取网络状态

0
归档:2013年8月分类:开源Mono

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;
}
07
8

Mono for android中ListView控件使用

0
归档:2013年8月分类:开源Mono

今天介绍Mono for android中ListView控件使用,并且支持在ListView中嵌入button,支持button触发单独事件,ListView自身的行触发单独时间。

别小看了这个问题,MonoDroid(mono for android的前身)刚刚出来的时候,ListView里面是不能嵌入button的,即使能嵌入也不支持单独事件,还好新版本支持了。这里会涉及到一些技巧,我只是大致讲一下思路,后期会做成项目发到github上面去,大家下载下来就ok。

我要实现的效果是,在ListView的每一行里添加button按钮,并且点击ListView的行进入该行详情,点击行上面的按钮,则进入其他相关操作,比如购买、订阅,如下图所示:

ListView button

按照语法,分别创建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);这两段代码是相呼应的。

 

15
6

Mono for android中使用HorizontalPager

0
归档:2013年6月分类:开源Mono

智能手机上通过手势翻页的效果很普遍,这是大多数应用的必备功能,目前已经有很多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;
}

07
6

下拉刷新是现在微博非常流行的更新操作,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<object>();

mylActivity.myList.Add(mylActivity.htnList);

mylActivity.myList.Add("nextpage");

mylActivity.mainListAdapter.NotifyDataSetChanged();

Toast.MakeText (mylActivity, "已更新最新资讯", ToastLength.Short).Show ();

}

else

{

Toast.MakeText (mylActivity, "暂无更新", ToastLength.Short).Show ();

}

} else {

Toast.MakeText (mylActivity, "网络不给力", ToastLength.Short).Show ();

}

mylActivity.indexListView.onRefreshComplete ();

});

});

}

}

#endregion

step3:listview注册相关方法 indexListView.SetOnRefreshListener(new RefreshListener(this));

06
6

这两年,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);

17
5

Mono for android实现UI多线程

0
归档:2013年5月分类:开源Mono

在实际开发过程中,我们需要使用多线程来保证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来完成,不过有一个确定,就是不能终止当前的线程,比如如果这个线程执行慢,我先终止,暂时没有找到终止的办法

 

公告栏

欢迎大家来到我的博客,我是dodoro,希望我的博客能给你带来帮助。