Android通过注解初始化View

一、引言

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

Android通过注解初始化View

时间: 2024-10-17 14:20:01

Android通过注解初始化View的相关文章

Android进阶之自定义View实战(二)九宫格手势解锁实现

一.引言 在上篇博客Android进阶之自定义View实战(一)仿iOS UISwitch控件实现中我们主要介绍了自定义View的最基本的实现方法.作为自定义View的入门篇,仅仅介绍了Canvas的基本使用方法,而对用户交互层面仅仅处理了单击事件接口,在实际的业务中,常常涉及到手势操作,本篇博客以九宫格手势解锁View为例,来说明自定义View如何根据需求处理用户的手势操作.虽然九宫格手势解锁自定义View网上资料有很多,实现原理大同小异,但这里我只是根据自己觉得最优的思路来实现它,目的是让更

【Android】自己定义View

翻译自:http://developer.android.com/training/custom-views/index.html 一)创建view类 一个设计良好的自己定义view与其它的类一样.它使用接口来封装一系列的功能.有效的使用CPU和内存等.除了这些,定制view还应该满足例如以下条件: 符合Android标准 与Android XML 布局文件配合,提供符合style风格的定制属性 发送易接近性事件(accessibility events,针对听力或视觉有缺陷用户提供方便的事件)

从Android源码分析View绘制

在开发过程中,我们常常会来自定义View.它是用户交互组件的基本组成部分,负责展示图像和处理事件,通常被当做自定义组件的基类继承.那么今天就通过源码来仔细分析一下View是如何被创建以及在绘制过程中发生了什么. 创建 首先,View公有的构造函数的重载形式就有四种: View(Context context)    通过代码创建view时使用此构造函数,通过context参数,可以获取到需要的主题,资源等等. View(Context context, AttributeSet attrs)  

【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用——绘图、涂鸦板app的实现

利用一个简单的绘图app来说明安卓的图形处理类与自己定义View的应用. 例如以下图,有一个供用户自己随意绘图.涂鸦的app. 这里不做那么花俏了,仅提供黑白两色.但能够改变笔尖的粗细. 实质上这里的橡皮擦就是白色的画笔,根本不用使用到画笔的setXfermode方法,要搞一堆复杂的project. 用户画完图之后能够保存图像.图像的文件名称是当前的时间.保存的位置是sdcard的根文件夹. 制作步骤例如以下: 1.先设置好字体文件res\values\strings.xml,主要是app的名称

Android学习Scroller(一)——View调用scrollTo()的理解及使用

MainActivity如下: package cc.uu; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.app.Activity; /** * Demo描述: * scrollTo()和scrollB

[Android]如何创建一个View的分割线

如何创建一个View的分割线,如上图 我们见介绍三种可以创建看起来很不错的view的分割线,如在button之间添加分割线. 这个例子是将为LinearLayout内的三个Button间添加分割线. 这三个例子可能容易实现,相信会有更好的实现办法. 1 人工添加LinearLayout的分割线 我们可以创建一个View,这个View就是分割线,只要简单在Button之间添加这个分割线就可以. 分割线的实现,如下: <View android:layout_height="fill_pare

Android Wifi子系统源代码View

本文基于Android 4.2.2+Linux3.6.9+SAMA5D3 SoC从源代码的角度审视Android Wifi子系统. 软件平台:Linux3.6.9 + Android 4.2.2 硬件平台:Atmel SAMA5 Wifi模组:RTL8723AU(USB接口) Android的WiFi子系统自上而下包括如下一些内容: 应用层 Androd系统自带Settings应用 /system/app/Settings.apk http://androidxref.com/4.2.2_r1/

Android通过代码获取View

View view = LayoutInflater.from(mContext).inflate(R.layout.song_item_adapter, null); LayoutInflater inflater = (LayoutInflater)context.getSystemService       Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.hello,null); Android

【转】高手速成android开源项目【View篇】

主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其他如Dialog.Toast.EditText.TableView.Activity Animation等等. 一.ListView android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新ListView.ViewPager.WevView.ExpandableListVie