注解最早是在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中有这个控件注解。这边文章的作用是当你想用这个功能而不想用框架中的其他部分时,你可以使用以上方法。