第一步:先定义一个监听注解类
代码:
/**
* 监听注解
* @author 小夜
* @time 2018-3-5 11:15:00
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Onclick {
int value() default 0;
}
第二步:在activity中写一个点击时调用的方法并调用这个注解
@Onclick(R.id.btn)
private void click() {
toast("点击");
logD("点击了……………………");
}
第三步:也是整个框架的关键部分,注解的解释方法
public static void injectUtil(final Activity activity) {
Method[] methods = activity.getClass().getDeclaredMethods();
for (final Method method : methods) {
if (method.isAnnotationPresent(Onclick.class)) {
//获取注解内容
int viewId = method.getAnnotation(Onclick.class).value();
//通过注解找该view
final View view = activity.findViewById(viewId);
//设置该view的监听事件
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
method.setAccessible(true);
method.invoke(activity,null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
调用
injectUtil(this);
以上几行代码便实现了一个简单的通过注解实现按钮监听,这个框架的优点是简化了在写项目过程中去写很多的setOnClickListener(),使代码看起来更清晰。
不过在上面的代码中也有不足,那就是一个方法只能设置一个view的点击事件,要是很多view它们的点击事件都是同一个方法这时该框架就无法满足了,为了满足这一需求,只要对该框架进行小小的改动即可满足,具体改动如下:
/**
* 监听注解
* @author 小夜
* @time 2018-3-5 11:15:00
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Onclick {
int[] value() default 0;
}
public static void injectUtil(final Activity activity) {
Method[] methods = activity.getClass().getDeclaredMethods();
for (final Method method : methods) {
if (method.isAnnotationPresent(Onclick.class)) {
//获取注解内容
int[] viewIds = method.getAnnotation(Onclick.class).value();
//通过注解找该view
for (int i = 0; i < viewIds.length; i++) {
final View view = activity.findViewById(viewIds[i]);
//设置该view的监听事件
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
method.setAccessible(true);
method.invoke(activity,null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
}
当只有一个view添加点击事件时:
@Onclick(R.id.btn)
private void click() {
toast("点击");
logD("点击了……………………");
}
当有多个view需要添加点击事件时:
@Onclick({R.id.btn,R.id.text})
private void click() {
toast("点击");
logD("点击了……………………");
}