zoukankan      html  css  js  c++  java
  • Android简易注解View(java反射实现)

    一、引言

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

    二、原理

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

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

     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 }
    View Code

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

     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(this, this.findViewById(id));//给我们要找的字段设置值
    36                     }
    37                 }
    38             }
    39         } catch (IllegalAccessException e) {
    40             e.printStackTrace();
    41         } catch (IllegalArgumentException e) {
    42             e.printStackTrace();
    43         }
    44     }
    45 }
    View Code

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

     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 }
    View Code

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

    PS:推荐使用第三方完整的注解框架。

    天生我才必有用,千金散去还复来!
  • 相关阅读:
    简单聊聊智能硬件的固件测试
    Regular进阶: 跨组件通信
    项目组建和磨合阶段常见的坑
    从需求到数据到改进,如何形成闭环
    请不要怪罪流程
    自备干货!如何有效的做竞品迭代分析
    css小点心
    java的collection集合
    java中的数组与集合相互转换
    java-增强for循环
  • 原文地址:https://www.cnblogs.com/Jack-Lu/p/4386578.html
Copyright © 2011-2022 走看看