Android通过注解初始化View
2016-04-18 14:26
302 查看
一、引言
Android中通过findViewById在布局文件中找到需要的View,加入一个Activity里面有许多的View需要初始化,那将是一件很繁琐的事情。当然Google一下你会发现有很多Android Annotations框架。比如比较有名的“AndroidAnnotations”,这样的框架很复杂,用起来也比较麻烦,还有一些BUG,第一次使用也花费了不少时间研究。也许你在项目中只希望用到 Inject View这个功能,又或者你想知道这个实现的原理是怎样的。本文主要是解决这两个问题,实现一个最简单的ViewInject.
二、原理
原理是在Activity加载好后通过找到Activity中使用注解的字段,再通过Java反射的方式,动态的给这个字段设置值。1、首先你需要了解一下Java的注解是如何工作的,如果你不了解可以先看一下相关的资料,这个比较简答。首先定义我们的注解类:
[java] viewplain copy
/**
* view inect by id
*
* @author Lucky
*
*/
@Target(ElementType.FIELD)//表示用在字段上
@Retention(RetentionPolicy.RUNTIME)//表示在生命周期是运行时
public @interface ViewInject {
int value() default 0;
}
2、我们需要定义个BaseActivity,在这个类中来解析注解
[java] viewplain copy
/**
*
* @author Lucky
*
*/
public abstract class BaseActivity extends FragmentActivity {
/**
* get content view layout id
*
* @return
*/
public abstract int getLayoutId();
@Override
protected 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、完成上面的步骤后就是如何去使用了,示例代码如下:
[java] viewplain copy
public class TestActivity extends BaseActivity {
@ViewInject(R.id.claim_statement)
private WebView mWebView;
@Override
public int getLayoutId() {
// TODO Auto-generated method stub
return R.layout.activity_claim;
}
}
这样就可以了。几行代码可以大大的提高工作效率。
三、参考资料
1、http://www.2cto.com/kf/201405/302998.html相关文章推荐
- android学习总结
- Android:使用ViewPager实现左右滑动切换图片 (简单版)
- Android 6.0权限管理
- 关于 Android 进程保活,你所需要知道的一切
- Android——加载中的dialog
- Android自定义加载控件实现数据加载动画
- android:关于主工程和library project
- Android的6大布局
- androidStudio ndk Cannot find 'jni.h'
- Android Multidex 遇到的问题
- 如何用Fiddler对Android应用进行抓包
- iOS开发 Android开发 移动Web开发
- Android:颜色透明度换算
- Android相机、图册demo
- Android框架 加载图片 库 Picasso 的使用简介
- 收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation
- Android学习笔记之 android:collapseColumns ,android:shrinkColumns 和stretchColumns
- startActivityForResult用法详解
- Android Studio 插件 Statistic
- Android源码及SDK国内镜像下载