一、引言

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      * @return11      */12     public abstract int getLayoutId();13 14 15     @Override16     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 stub10         return R.layout.activity_claim;11     }12 13 }
View Code

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

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

更多相关文章

  1. Android(安卓)UI开发第三十五篇——AppCompat实现Action Bar
  2. NDK编程实例
  3. 【Android】注解框架(四)-- 一行代码注入微信支付
  4. Android完美解决输入框EditText隐藏密码打勾显示密码问题
  5. @+id/android:list"和"@android:id/list"的区别
  6. 实现Android(安卓)Studio JNI开发C/C++使用__android_log_print
  7. android 应用程序数据共享shareuserid篇+ContentResolver+Conten
  8. android读取keystore证书文件
  9. Android(安卓)Studio试用总结

随机推荐

  1. android实现页面黑白色
  2. 一个Android项目代码该怎么看
  3. Android(安卓)HIDL基础篇(一)
  4. Android引用项目出现ClassNotFoundExcept
  5. andriod 4.0以上版本添加了 android:conf
  6. Activity 跳转时的生命周期流程
  7. 使用maven构建android项目
  8. ERROR: the user data image is used by
  9. Ubuntu12.04下的Android 源码编译
  10. Android 自定义Toast