OnClickMe一款自动生成OnClick代码的插件
2020-06-22 本文已影响0人
liys_android
1. 使用背景
对于findViewById和OnClick,大部分时候, 我们使用ButterKnife就可以了,但是呢,谷歌后面出了DataBinding和Viewbinding来解决findViewById的问题,用了这两个以后,估计大家也不会使用ButterKnife. 那么问题来了,OnClick怎么处理呢? 直接手写吗? 所以就写了一个针对Onclick处理的小插件. 如下图:
![](https://img.haomeiwen.com/i13519092/1e9d69809a5eceed.gif)
2. 引用插件方式
File---settings---Plugins. 搜索OnClickMe
![](https://img.haomeiwen.com/i13519092/070f4192261cf47e.png)
插件地址:https://plugins.jetbrains.com/plugin/14634-onclickme
下载离线版:https://plugins.jetbrains.com/plugin/download?rel=true&updateId=91006
3. 使用方式
和ButterKnife差不多,鼠标右键 选中布局---generate----OnClickMe.
OnClickUtils.init(Activity activity); //Activity中使用
OnClickUtils.init(Object target, View view); //Fragment或其它地方使用
4. 附加:注解类和解析类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface OnClick {
@IdRes int[] value() default { View.NO_ID };
}
public class OnClickUtils {
public static void init(Activity target){
View sourceView = target.getWindow().getDecorView();
initClick(target, sourceView);
}
public static void init(Object target, View view){
initClick(target, view);
}
private static void initClick(@NonNull final Object target, @NonNull View source){
final Method[] methods = target.getClass().getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
boolean hasAnno = methods[i].isAnnotationPresent(OnClick.class);
if(!hasAnno){
continue;
}
OnClick onClick = methods[i].getAnnotation(OnClick.class);
int[] ids = onClick.value();
for (int j = 0; j < ids.length; j++) {
final int finalI = i;
source.findViewById(ids[j]).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
methods[finalI].invoke(target, v);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
}
5. 总结
主要配合databinding或Viewbinding使用
6. 疑问
解析使用的是反射,可能有人会说影响性能,其实这点性能对体验是感觉不到的,如果像ButterKnife一样自动生成一个类去解析,为了一个Onclick的功能而特意生成一个类,我觉得有点大材小用了,最终选择了反射.
如果还有什么更好的解决方法, 欢迎在下方评论留言