Android 编程时我们少不了使用FindIdByView函数,在Xamarin Android开发时也需要如此。这个工作很无聊且烦人。在常规Android开发中,人们已经发明了一些方法免除这项工作,例如Android数据绑定,还有butterknife,都可以解决这个问题。关于它们我不去细说了。但是这两个方案在Xamarin Android开发里还无法使用。本文介绍一个函数,就可以把程序员从这项工作中解脱出来,原文请参见http://redth.codes/auto-wire-up-views-xamarin-activity/。

下面直接上代码吧。

这段是一个Activity.

 using Android.App;
using Android.Widget;
using Android.OS; namespace AndApp2
{
[Activity(Label = "AndApp2", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
int count = ;
Button myButton;
TextView txtName; protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
this.BindView(Resource.Layout.Main); myButton.Click += (s,e)=> {
myButton.Text = string.Format("{0} clicks!", count++);
txtName.Text = "Bruce";
};
}
}
}

其中BindView是一个扩展方法,包括SetContent和将View绑定到本Activity的变量上。
Layout中有一个Button myButton和一个TextView txtName.

下面是BindView扩展方法:

 public static class ActivityExtensions
{
public static void BindView(this Activity activity, int layoutResId)
{
activity.SetContentView(layoutResId);
//Get all the View fields from the activity
var members = from m in activity.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
where m.FieldType.IsSubclassOf(typeof(View))
select m; if (!members.Any())
return; members.ToList().ForEach(m =>
{
try
{
//Find the android identifier with the same name
var id = activity.Resources.GetIdentifier(m.Name, "id", activity.PackageName);
//Set the activity field's value to the view with that identifier
m.SetValue(activity, activity.FindViewById(id));
}
catch (Exception ex)
{
throw new MissingFieldException("Failed to wire up the field "
+ m.Name + " to a View in your layout with a corresponding identifier", ex);
}
});
}
}

该方法使用了反射,会有人担忧其性能。但是对于一个Activity中具有不多的View来说可以忽略不计。
当然,也不是一点问题都没有。原文已经指出了,如果想使用一个在layout中没有对应的View时会抛出异常。这个问题其实很好解决。例如,修改一下BindView函数,让我们约定凡是自动绑定的view变量都以m开头,其他的变量不以m开头就好了。当让我们也可以采取在变量上加注解的方案,这样也能解决问题,至于具体怎么弄,就不在这里说了,到此为止,我觉得现在已经足够好了。

XamarinAndroid 自动绑定View变量的更多相关文章

  1. 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定

    最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...

  2. 一个完全摆脱findViewById的自动绑定库

    代码地址如下:http://www.demodashi.com/demo/13504.html 问题 先来看一个正常的写法: <?xml version="1.0" enco ...

  3. Mvc内建功能(DefaultModelBinder)自动绑定。

    在做Asp.Net MVC项目中,都知道View负责页面展示数据或者提供页面收集数据,而所展示的数据或者收集的数据都是从Controller的Action中获取或提交到Controller的Actio ...

  4. 彻底解决Eclipse自动补全变量名及变量名后面追加类型名

    彻底解决Eclipse自动补全变量名问题的方法步骤 发布于 2014-11-04 14:53   已被阅读 31613159 次 大家使用eclipse或者MyEclipse敲代码的时候,是不是都被这 ...

  5. eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?

    对于编程人员来说,要记住大量的类名或类方法的名字,着实不是一件容易的事情.如果要IDE能够自动补全代码,那将为我们编程人员带来很大帮助. eclipse代码里面的代码提示功能默认是关闭的,只有输入“. ...

  6. jQuery插件:Ajax将Json数据自动绑定到Form表单

    jQuery注册方法的两种常用方式: //jQuery静态方法注册 //调用方法$.a1() $.extend({ a1: function () { console.log("a1&quo ...

  7. angular 输入框自动绑定值最长为16位,超过16位则会报错

    最近发现angular在使用input输入框的ng-model绑定scope变量的时候,发现,输入长串的数字将会出错.代码如下: <html> <head> <meta ...

  8. FlexiGrid 使用 全选、自动绑定

    1.介绍 Flexigrid是一个类似于Ext Gird,但基于jQuery开发的Grid.它具有的功能包括:可以调整列宽,合并列标题,分页,排序,显示/隐藏表格等.Flexigrid显示的数据能够通 ...

  9. WinForm开发-界面控件到实体,实体到界面控件自动绑定

    在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动 ...

随机推荐

  1. git 团队代码管理交流共同进步

    Installation methods for GitLab | GitLab https://about.gitlab.com/installation/#centos-7 gittutorial ...

  2. spring boot实现文件上传下载

    spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心.大部分的配置从开发人员可见变成了相对 ...

  3. [10.27_P3] 简单题 (脑洞)

    Description dzy 手上有一张n 个点m 条边的联通无向图,仙人掌是一张每条边最多在一个简单环内的联通无向图.他想求这个无向图的生成仙人掌中最多有多少条边. 但是dzy 觉得这个问题太简单 ...

  4. 基于TCP的字符串传输程序

    ---恢复内容开始--- LINUX中的网络编程是通过SOCKET接口来进行的. Socket(套接字) Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接 ...

  5. mac系统下设置eclipse的补全快捷键方法

    eclispe Word Completion 的默认快捷键是Alt+/eclipse Content Assist 的默认快捷键是Ctrl+Space在使用中发现Word Completion经常导 ...

  6. BZOJ_2947_[Poi2000]促销_堆

    BZOJ_2947_[Poi2000]促销_堆 Description Bytelandish连锁超市委托你编写一个程序来模拟一项即将施行的促销活动,该活动的规则如下: ●想要参与的顾客,只需把他的个 ...

  7. 洛谷P3004 宝箱Treasure Chest——DP

    题目:https://www.luogu.org/problemnew/show/P3004 似乎有点博弈的意思,但其实是DP: f[i][j] 表示 i~j 的最优结果,就可以进行转移: 注意两个循 ...

  8. vertical-align 和line-height 以及baseline的解析

    line-height是相对于font-size来计算的,vertical-align的百分比值是相对于line-height来计算的,vertical-align的默认是baseline; demo ...

  9. 04_显示意图打开activity

    实际上用显式意图打开一个activity就很简单了.只需要指定你要打开的这个activity的class就可以了. 需要注意一点的是创建了一个ThirdActivity必须要在清单文件里面声明.如果没 ...

  10. Linux 常用命令八 find

    一.find命令 find命令用于查找文件. 按文件名字查找: wang@wang:~/workpalce/python$ sudo find / -name "create.txt&quo ...