android利用annotation代替findViewById()

首先建立一个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");
	}

	
}

这样就大功告成了效果如下(源码就不上传了,已经全部贴出来了)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值