Android通过注解初始化View

原创 2014年06月12日 14:42: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();


	@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、完成上面的步骤后就是如何去使用了,示例代码如下:

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 

@InjectView的实例化

这里是一个官方例子,轻量级的处理,灵感来自于强大的开源项目RoboGuice,可以通过wiki文档了解。 https://github.com/roboguice/roboguice/wiki基于反...
  • linshijun33
  • linshijun33
  • 2015-08-05 14:29:06
  • 904

使用InjectView和findViewById说拜拜

Android的findViewById真是太烦人了,模板似的方法,要写在每个Activity,Fragment,Adapter里面。声明View和findView总是间隔着未知的行距;setOnCl...
  • zjd934784273
  • zjd934784273
  • 2015-11-11 16:02:32
  • 2270

android ViewId自动注解使用详解(ViewInject)

Annotation就是注解了,JDK1.5新增加功能,该功能可用于类,构造方法,成员变量,方法,参数等的声明中。 api版本23下,android studio里是直接可以使用的,不用添加依赖库,以...
  • d276031034
  • d276031034
  • 2017-01-23 11:23:56
  • 1430

Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39269193,本文出自:【张鸿洋的博客】1、概述首先我们来吹吹牛,什么叫IoC,...
  • lmj623565791
  • lmj623565791
  • 2014-09-18 09:25:58
  • 68755

Android-注解详解

Android-注解详解背景上一章,我们研究了 Java注解 的用法;紧跟着这章研究一下Android相关的注解的使用,比如我们熟悉的ButterKnife就是使用注解的方式实现对其使用,掌握注解的使...
  • u014610664
  • u014610664
  • 2016-12-06 11:34:32
  • 4818

Android中的注解

本篇博客记录一下Android中注解的使用方式。
  • Gaugamela
  • Gaugamela
  • 2018-02-27 11:19:01
  • 286

Android注解框架对比

转载请注明出处:  Java的注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,标记可以加在包,类,属性,方法,本地变量上。 然后你可以写一个注解处理器去解析处理这...
  • p892848153
  • p892848153
  • 2015-12-30 11:13:36
  • 9113

Android中的自定义注解(反射实现-运行时注解)

预备知识: Java注解基础 Java反射原理 Java动态代理 一、布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,...
  • hp910315
  • hp910315
  • 2016-04-20 12:28:33
  • 6636

使用Android注解来改善代码

昨晚看到一篇好文章,然后是英文的,所以决定翻译分享给大家,这是原文链接:http://www.michaelevans.org/blog/2015/07/14/improving-your-code-...
  • abren32
  • abren32
  • 2015-07-21 13:59:30
  • 1746

android注解使用详解(图文)

在使用Java的SSH框架的时候,一直在感叹注解真是方便啊,关于注解的原理,大家可以参考我的另一片文章Java注解详解。最近有时间研究了android注解的使用,今天与大家分享一下。android中注...
  • u012702547
  • u012702547
  • 2015-08-08 10:45:59
  • 6813
收藏助手
不良信息举报
您举报文章:Android通过注解初始化View
举报原因:
原因补充:

(最多只允许输入30个字)