Android之注解的使用——绑定android控件

注解介绍

注解最早是在Java的JDK5中出现的概念,并在JDK5推出后风行天下。

Android也继承了这种概念和语法。

这里介绍一下,注解在android中用的最火的一个例子,对控件的注解。

{

对注解不熟悉的同学,可以看以下几个博文,写的很详尽:

注解的基本解释:http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html

注解的自定义入门:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

注解处理:http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html

}

注解使用说明

如果写过C#、delphi之类的程序猿,刚开始接触android时,表示不能接受的是:这界面画起来要命,取控件还麻烦。

注解控件,能有效缓解你的这种不开森。

注解控件的原理和步骤是这样的:

首先,你要自定义一个注解,该注解中包含一个int型数据,用于表示android控件的ID(因为我们知道android控制唯一标识是用int来表示的);

其次,你要把这个注解,放在一个控件的头上(前面),表示这个控件已经顶上了这个注解标志,是自己人了;

最后,你要写个方法(注解处理类),对自己人做个处理,发个福利,表示自己人不需要再做繁琐的强转和findviewbyid了。


注解使用示例

根据上面的说明,我们一步步的来实现控件注解。

第一步,自定义注解

package com.example.injectview;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectView {
	int value();
}
表示该注解只作用于FIELD(域/变量),在运行时有效。

该注解只有一个value(),用于表示传入的控件ID(用value()表示是注解的一种缺省表示,这么写可以不用再传值的时候用key-value形式,只需要传入值即可)。


第二步,把注解放到一个控件的头上

        @InjectView(R.id.txt)
	TextView textView;
	@InjectView(R.id.btn)
	Button btn;

妥妥的。


第三步,写一个注解处理类

这里要用到反射,因为你是运行时有效,因此,可以用反射动态获取到类中所有的field,我们对这些field进行甄别,找到带注解标志的自己人,并做处理。

package com.example.injectview;

import java.lang.reflect.Field;

import android.app.Activity;

public class InjectUtil {

	public static void  InjectView(Activity activity){
		//获取类
		Class< ? extends Activity> recfClass=activity.getClass();
		//获取类中的所有field(域/变量)
		Field[] fields=recfClass.getDeclaredFields();
		//对获取到的field做遍历
		for(Field field:fields){
			//对遍历到的field做判断,是否带特定注解标识
			if(field.isAnnotationPresent(InjectView.class)){
				//获取到该field的注解
				InjectView injectView= field.getAnnotation(InjectView.class);
				//获取到该field的注解的value
				int id= injectView.value();
				//设置属性
				field.setAccessible(true);
				try {
					//对该field做控件绑定操作
					field.set(activity,activity.findViewById(id));
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				}
			}
			
		}
	}
	
}
至此,我们把所有准备都做完了,最后一步,使用它。

第四步,使用注解处理类

package com.example.injectview;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	@InjectView(R.id.txt)
	TextView textView;
	@InjectView(R.id.btn)
	Button btn;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		InjectUtil.InjectView(this);
		
		btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				textView.setText("click now");
			}
		});
	}

	

}

特别说明

应该都知道XUTILS中有这个控件注解。这边文章的作用是当你想用这个功能而不想用框架中的其他部分时,你可以使用以上方法。

源码地址



猜你喜欢

转载自blog.csdn.net/yangzhaomuma/article/details/51183110