Android_注解+反射代替findViewById()

时间:2022-12-26 16:16:19

最近没啥事,前段时间看到一个框架是使用的注解来代替findViewById()的然后就研究了,发现还是蛮容易的,下面就是注解的代码:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @author kchang
* @E-mail:kchang@163.com
*/
@Target(ElementType.FIELD)//属性
@Retention(RetentionPolicy.RUNTIME)//运行时执行
@Documented
public @interface InjectView {
public int value() default -1;
}

Activity代码:

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView; public class MainActivity extends Activity {
@InjectView(R.id.tv)
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InjectUtil.autoInjectView(this);
textView.setText("inject view test");
}

InjectUtil工具类的代码:

import java.lang.reflect.Field;

import android.app.Activity;

/**注入框架
* @author changkai
* @E-mail:changkai244@163.com
*/
public class InjectUtil {
/**
* 自动注入findViewById()
* @param activity
* 当前的activity
*/
public static void autoInjectView(Activity activity) {
Class<?> classAct = activity.getClass();
//获取所有的变量
Field[] fields = classAct.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(InjectView.class)) {//判断是否为InjectView注解
InjectView injectView = field.getAnnotation(InjectView.class);//获取InjectView注解
int id = injectView.value();//获取注解的值
if (id > 0) {
field.setAccessible(true);//允许范围私有变量
try {
field.set(activity, activity.findViewById(id));//给当前的变量赋值
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}

好的,就是这个简单。。。