首先自定义一个Library,然后在里面创建
BindString
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindString {
@StringRes int value() default -1;
}
BindView
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindView {
@IdRes int value() default View.NO_ID;
}
OnClick
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnClick {
@IdRes int[] value();
}
Butterknife
public class Butterknife {
public static void bind(final Activity activity){
Class<Activity> clazz = (Class<Activity>) activity.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field: fields ) {
field.setAccessible(true);//
//该注释里面是否包含此注释
if (field.isAnnotationPresent(BindView.class)){
//拿到修饰该属性的注解
BindView bindView = field.getAnnotation(BindView.class);
int value = bindView.value();
//现在需要取到控件的id
View viewById = activity.findViewById(value);
try {//给属性赋值
field.set(activity,viewById);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
if (field.isAnnotationPresent(BindString.class)){
BindString bindString = field.getAnnotation(BindString.class);
int value = bindString.value();
String string = activity.getResources().getString(value);
try {
field.set(activity,string);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
Method[] declaredMethods = clazz.getDeclaredMethods();
for (final Method method: declaredMethods ) {
method.setAccessible(true);
if(method.isAnnotationPresent(OnClick.class)){
OnClick onClick = method.getAnnotation(OnClick.class);
int[] onClickValue = onClick.value();
for (int id :onClickValue) {
View viewById = activity.findViewById(id);
viewById.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
method.invoke(activity,v);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
}
}
下面进行一个点击