@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClick {
int[] value();
}
@OnClick({R.id.tv1,R.id.tv2})
public void onClick(View view){
switch (view.getId()) {
case R.id.tv1 :
Log.e("TAG", "tv1");
break;
case R.id.tv2 :
Log.e("TAG", "tv2");
break;
}
}
public static void injectOnClick(Activity activity) {
Class<? extends Activity> cls = activity.getClass();
Method[] declaredMethods = cls.getDeclaredMethods();
if (declaredMethods == null && declaredMethods.length < 0) {
return;
}
for (Method declaredMethod : declaredMethods) {
if (declaredMethod.isAnnotationPresent(OnClick.class)) {
OnClick onClick = declaredMethod.getAnnotation(OnClick.class);
try {
int[] ids = onClick.value();
Object proxy = Proxy.newProxyInstance(View.OnClickListener.class.getClassLoader(), new Class[]{View.OnClickListener.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return declaredMethod.invoke(activity, args);
}
});
for (int id : ids) {
View view = activity.findViewById(id);
Method setOnClickListener = view.getClass().getMethod("setOnClickListener", View.OnClickListener.class);
setOnClickListener.invoke(view, proxy);
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}