Android通过注解初始化View
16lz
2021-01-24
一、引言
Android中通过findViewById在布局文件中找到需要的View,加入一个Activity里面有许多的View需要初始化,那将是一件很繁琐的事情。当然Google一下你会发现有很多Android Annotations框架。比如比较有名的“Android Annotations”,这样的框架很复杂,用起来也比较麻烦,还有一些BUG,第一次使用也花费了不少时间研究。也许你在项目中只希望用到 Inject View这个功能,又或者你想知道这个实现的原理是怎样的。本文主要是解决这两个问题,实现一个最简单的ViewInject.
二、原理
原理是在Activity加载好后通过找到Activity中使用注解的字段,再通过Java反射的方式,动态的给这个字段设置值。
1、首先你需要了解一下Java的注解是如何工作的,如果你不了解可以先看一下相关的资料,这个比较简答。首先定义我们的注解类:
/** * view inect by id * * @author Lucky * */@Target(ElementType.FIELD)//表示用在字段上@Retention(RetentionPolicy.RUNTIME)//表示在生命周期是运行时public @interface ViewInject {int value() default 0;}
2、我们需要定义个BaseActivity,在这个类中来解析注解
/** * * @author Lucky * */public abstract class BaseActivity extends FragmentActivity {/** * get content view layout id * * @return */public abstract int getLayoutId();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(getLayoutId());autoInjectAllField();}/** * 解析注解 */public void autoInjectAllField() {try {Class<?> clazz = this.getClass();Field[] fields = clazz.getDeclaredFields();//获得Activity中声明的字段for (Field field : fields) {// 查看这个字段是否有我们自定义的注解类标志的if (field.isAnnotationPresent(ViewInject.class)) {ViewInject inject = field.getAnnotation(ViewInject.class);int id = inject.value();if (id > 0) {field.setAccessible(true);field.set(this, this.findViewById(id));//给我们要找的字段设置值}}}} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();}}}
3、完成上面的步骤后就是如何去使用了,示例代码如下:
public class TestActivity extends BaseActivity {@ViewInject(R.id.claim_statement)private WebView mWebView;@Overridepublic int getLayoutId() {// TODO Auto-generated method stubreturn R.layout.activity_claim;}}
这样就可以了。几行代码可以大大的提高工作效率。
三、参考资料
1、http://www.2cto.com/kf/201405/302998.html
更多相关文章
- Android(安卓)面试题(5):谈谈 Handler 机制和原理?
- Android(安卓)Dagger2 初学笔记
- Android退出当前应用程序的方法
- Android(安卓)NotificationManager 和Notification的使用总结
- android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精
- Android多线程(三)HandlerThread源码原理解析
- Android(安卓)控件之TextView常见使用问题
- android中版本webView中js不执行问题
- 【Android笔记 七】Android(安卓)Sensor感应器介绍(三)获取用户移