美文网首页
用反射和注解实现对findViewById的简化调用(续)

用反射和注解实现对findViewById的简化调用(续)

作者: 咸亨酒店 | 来源:发表于2017-03-13 19:30 被阅读16次

前一篇利用反射和注解实现了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。

只能感叹一句,反射的魅力无穷大!

相关文章

网友评论

      本文标题:用反射和注解实现对findViewById的简化调用(续)

      本文链接:https://www.haomeiwen.com/subject/ppsqnttx.html