首先建立一个android项目 InjectTest 目录如下(工具是 eclipse)
接下来解释一下项目中出现的几个类的作用
(1)InjectView 这是一个自定义的注解类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 定义一个注解
* @author
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectView {
/**
* 通过注解 获取view
* @return
*/
public int id() default -1;
}
这个自定义的注解 用到了注解 这里解释一下
@Target(ElementType.FIELD)(具体的可以看源码)
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention(RetentionPolicy.RUNTIME)
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
(2)Injector
import java.lang.reflect.Field;
import android.app.Activity;
public class Injector {
private static final Injector instance = new Injector();//饿汉方式的单例
private Injector(){
//可做其他的处理
}
public synchronized static Injector getInstance(){
return instance;
}
public void injectView(Activity act, Field field){
if(field.isAnnotationPresent(InjectView.class)){
InjectView injectView = field.getAnnotation(InjectView.class);
int viewId = injectView.id();
try {
field.setAccessible(true);
field.set(act, act.findViewById(viewId));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}
public void injectView(Activity act){
Field[] fields = act.getClass().getDeclaredFields();
if(fields != null && fields.length > 0){
for(Field field : fields){
if(field.isAnnotationPresent(InjectView.class)){
injectView(act,field);
}
}
}
}
}
(3)MainActivity(layout就贴了,这个给自动生成的helloword加个id就行了)
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
//这样成组的出现,相当于“TextView injectView = (TextView)findViewById(R.id.injectview); ”
@InjectView(id = R.id.injectview)
private TextView injectView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Injector.getInstance().injectView(this);//这个是可以BaseActivity中
injectView.setText("inject test");
}
}
这样就大功告成了效果如下(源码就不上传了,已经全部贴出来了)