前一篇利用反射和注解实现了findViewById的简化调用,但是对于view的事件却没有设置监听器,仍然需要一个个view去调用setOnClickListener,仍然有赘余之处。今天就再次将这一部分完善一下。
大体的思路,取得View类的setOnClickListener的反射Method,然后利用前面获取到的view作为参数和我们新传入一个View.onClickListener对象,去调用这个Method,这样就给view添加了点击事件的监听器.
首先,要在ViewField注解里多加一个字段,表示是点击事件,接着考虑到有的控件没有onClick事件监听,所以,这个值对于每个view是可能不同的。
重新定义如下:
```
/**
* Created by Andy on 2017/3/9 0009.
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceViewField{
// public int value(); //如果默认定义是value,则在使用是默认是 @ViewField(R.id.back)
public intid();// 使用:@ViewField(id=R.id.back)
public String onClick();//事件监听
}
```
其次 ,要让Activity或Fragment实现View.OnClickListener接口,实现onClick方法。
再次,修改我们以前的注入方法,添加View.OnClickListener参数
public static voidinject(Activity activity,View.OnClickListener listener) {
}
获取到view之后,为view的setOnClickListener方法传入参数,即可。
String onClick = vf.onClick();
if(!TextUtils.isEmpty(onClick) && listener!=null){
Class listenerCls = View.class;
Method setListenerMethod = listenerCls.getMethod("setOnClickListener",View.OnClickListener.class);
setListenerMethod.invoke((View)view,listener);
}
最后,在我们的Activity的onClick方法里写入验证代码,结果发现ok。
只能感叹一句,反射的魅力无穷大!