@BindView 替代findViewById
- 新建自定义注解类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindView{
int value() default 0;
}
- 通过反射得到将注解传入的参数赋值给对应的注解对象
public class SBindKinf {
public static void bindField(Activity activity) {
Class cla = activity.getClass();
Field[] fields = cla.getDeclaredFields();
for (Field f : fields
) {
BindView bindView = f.getAnnotation(BindView.class);
if (bindView != null) {
View view = activity.findViewById(bindView.value());
f.setAccessible(true);
try {
f.set(activity, view);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
- 在setContentView之后执行SBindKinf.bindField
- 对应参数添加@BindView即可
@OnClick 替代setOnClickListener
- 新建自定义注解类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnClick{
int value() default 0;
}
- 通过反射得到将注解传入的参数赋值给对应的注解对象
public class SBindKinf {
public static void bindClick(Activity activity) {
Class cla = activity.getClass();
方法
for (Method me : methods
) {
OnClick click = me.getAnnotation(OnClick.class);
if (click != null) {
me.setAccessible(true);
View view = activity.findViewById(click.value());
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
me.invoke(activity);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
}
- 在setContentView之后执行SBindKinf.bindClick
- 对应方法添加@OnClick
最终代码
public class SBindKinf {
public static void bind(Activity activity) {
bindField(activity);
bindClick(activity);
}
private static void bindField(Activity activity) {
Class cla = activity.getClass();
Field[] fields = cla.getDeclaredFields();
for (Field f : fields
) {
BindView bindView = f.getAnnotation(BindView.class);
if (bindView != null) {
View view = activity.findViewById(bindView.value());
f.setAccessible(true);
try {
f.set(activity, view);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
private static void bindClick(Activity activity) {
Class cla = activity.getClass();
Method[] methods = cla.getDeclaredMethods();
for (Method me : methods
) {
OnClick click = me.getAnnotation(OnClick.class);
if (click != null) {
me.setAccessible(true);
View view = activity.findViewById(click.value());
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
me.invoke(activity);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
}