1.解释:
注解只是一个标识(标记),没有具体的功能代码。
package com.miaozi.android_day03;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* created by panshimu
* on 2019/10/9
* @interface 代表注解
*/
@Target(ElementType.FIELD)// 代表放在哪里 FIELD代表属性 METHOD方法 TYPE类
@Retention(RetentionPolicy.RUNTIME)//什么时候起作用 RUNTIME运行时 CLASS编译时 SOURCE编程时
public @interface ViewById {
int value();//代表参数 多个参数放数组也行
}
2.通过注解和反射实现findViewById
package com.miaozi.android_day03;
import android.app.Activity;
import android.view.View;
import java.lang.reflect.Field;
/**
* created by panshimu
* on 2019/10/9
*/
public class ViewUtil {
public static void inject(Activity activity){
//获取所有的属性
Field[] declaredFields = activity.getClass().getDeclaredFields();
//过滤关于ViewById的属性
for(Field field : declaredFields){
ViewById annotation = field.getAnnotation(ViewById.class);
if(annotation!=null){
//执行findViewById
View viewById = activity.findViewById(annotation.value());
//反射注入
field.setAccessible(true);
try {
field.set(activity,viewById);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
使用:
@ViewById(R.id.tv)
private TextView tv;
网友评论