Android:注解初始化findViewById

一、引言

Android中通过findViewById在布局文件中找到需要的View,加入一个Activity里面有许多的View需要初始化,那将是一件很繁琐的事情。当然Google一下你会发现有很多Android Annotations框架。比如比较有名的“Android Annotations”,这样的框架很复杂,用起来也比较麻烦,还有一些BUG,第一次使用也花费了不少时间研究。也许你在项目中只希望用到 Inject View这个功能,又或者你想知道这个实现的原理是怎样的。本文主要是解决这两个问题,实现一个最简单的ViewInject.


二、原理

原理是在Activity加载好后通过找到Activity中使用注解的字段,再通过Java反射的方式,动态的给这个字段设置值。

1、首先你需要了解一下Java的注解是如何工作的,如果你不了解可以先看一下相关的资料,这个比较简答。首先定义我们的注解类:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * view inect by id 
  3.  *  
  4.  * @author Lucky 
  5.  *  
  6.  */  
  7. @Target(ElementType.FIELD)//表示用在字段上  
  8. @Retention(RetentionPolicy.RUNTIME)//表示在生命周期是运行时  
  9. public @interface ViewInject {  
  10.     int value() default 0;  
  11. }  

2、我们需要定义个BaseActivity,在这个类中来解析注解

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  *  
  3.  * @author Lucky 
  4.  *  
  5.  */  
  6. public abstract class BaseActivity extends FragmentActivity {  
  7.     /** 
  8.      * get content view layout id 
  9.      *  
  10.      * @return 
  11.      */  
  12.     public abstract int getLayoutId();  
  13.   
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(getLayoutId());  
  19.         autoInjectAllField();  
  20.     }  
  21.     /** 
  22.      * 解析注解 
  23.      */  
  24.     public void autoInjectAllField() {  
  25.         try {  
  26.             Class<?> clazz = this.getClass();  
  27.             Field[] fields = clazz.getDeclaredFields();//获得Activity中声明的字段  
  28.             for (Field field : fields) {  
  29.                 // 查看这个字段是否有我们自定义的注解类标志的  
  30.                 if (field.isAnnotationPresent(ViewInject.class)) {  
  31.                     ViewInject inject = field.getAnnotation(ViewInject.class);  
  32.                     int id = inject.value();  
  33.                     if (id > 0) {  
  34.                         field.setAccessible(true);  
  35.                         field.set(thisthis.findViewById(id));//给我们要找的字段设置值  
  36.                     }  
  37.                 }  
  38.             }  
  39.         } catch (IllegalAccessException e) {  
  40.             e.printStackTrace();  
  41.         } catch (IllegalArgumentException e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.     }  
  45. }  



3、完成上面的步骤后就是如何去使用了,示例代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class TestActivity extends BaseActivity {  
  2.   
  3.     @ViewInject(R.id.claim_statement)  
  4.     private WebView mWebView;  
  5.           
  6.   
  7.     @Override  
  8.     public int getLayoutId() {  
  9.         // TODO Auto-generated method stub  
  10.         return R.layout.activity_claim;  
  11.     }  
  12.   
  13. }  

这样就可以了。几行代码可以大大的提高工作效率。


三、参考资料

1、http://www.2cto.com/kf/201405/302998.html 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值