Android之注解的使用——绑定android控件
2016-04-18 22:15
495 查看
注解介绍
注解最早是在Java的JDK5中出现的概念,并在JDK5推出后风行天下。Android也继承了这种概念和语法。
这里介绍一下,注解在android中用的最火的一个例子,对控件的注解。
{
对注解不熟悉的同学,可以看以下几个博文,写的很详尽:
注解的基本解释:http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html
注解的自定义入门:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
注解处理:http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html
}
注解使用说明
如果写过C#、delphi之类的程序猿,刚开始接触android时,表示不能接受的是:这界面画起来要命,取控件还麻烦。注解控件,能有效缓解你的这种不开森。
注解控件的原理和步骤是这样的:
首先,你要自定义一个注解,该注解中包含一个int型数据,用于表示android控件的ID(因为我们知道android控制唯一标识是用int来表示的);
其次,你要把这个注解,放在一个控件的头上(前面),表示这个控件已经顶上了这个注解标志,是自己人了;
最后,你要写个方法(注解处理类),对自己人做个处理,发个福利,表示自己人不需要再做繁琐的强转和findviewbyid了。
注解使用示例
根据上面的说明,我们一步步的来实现控件注解。第一步,自定义注解
package com.example.injectview; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface InjectView { int value(); }表示该注解只作用于FIELD(域/变量),在运行时有效。
该注解只有一个value(),用于表示传入的控件ID(用value()表示是注解的一种缺省表示,这么写可以不用再传值的时候用key-value形式,只需要传入值即可)。
第二步,把注解放到一个控件的头上
@InjectView(R.id.txt) TextView textView; @InjectView(R.id.btn) Button btn;
妥妥的。
第三步,写一个注解处理类
这里要用到反射,因为你是运行时有效,因此,可以用反射动态获取到类中所有的field,我们对这些field进行甄别,找到带注解标志的自己人,并做处理。package com.example.injectview; import java.lang.reflect.Field; import android.app.Activity; public class InjectUtil { public static void InjectView(Activity activity){ //获取类 Class< ? extends Activity> recfClass=activity.getClass(); //获取类中的所有field(域/变量) Field[] fields=recfClass.getDeclaredFields(); //对获取到的field做遍历 for(Field field:fields){ //对遍历到的field做判断,是否带特定注解标识 if(field.isAnnotationPresent(InjectView.class)){ //获取到该field的注解 InjectView injectView= field.getAnnotation(InjectView.class); //获取到该field的注解的value int id= injectView.value(); //设置属性 field.setAccessible(true); try { //对该field做控件绑定操作 field.set(activity,activity.findViewById(id)); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } } } } }至此,我们把所有准备都做完了,最后一步,使用它。
第四步,使用注解处理类
package com.example.injectview; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { @InjectView(R.id.txt) TextView textView; @InjectView(R.id.btn) Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); InjectUtil.InjectView(this); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { textView.setText("click now"); } }); } }
特别说明
应该都知道XUTILS中有这个控件注解。这边文章的作用是当你想用这个功能而不想用框架中的其他部分时,你可以使用以上方法。源码地址
http://download.csdn.net/detail/yangzhaomuma/9495136相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories