Android开发经验谈Android技术知识Android进阶之路

OnClickMe一款自动生成OnClick代码的插件

2020-06-22  本文已影响0人  liys_android
1. 使用背景

对于findViewById和OnClick,大部分时候, 我们使用ButterKnife就可以了,但是呢,谷歌后面出了DataBinding和Viewbinding来解决findViewById的问题,用了这两个以后,估计大家也不会使用ButterKnife. 那么问题来了,OnClick怎么处理呢? 直接手写吗? 所以就写了一个针对Onclick处理的小插件. 如下图:

OnClickMe.gif
2. 引用插件方式

File---settings---Plugins. 搜索OnClickMe

1594086344(1).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的功能而特意生成一个类,我觉得有点大材小用了,最终选择了反射.

如果还有什么更好的解决方法, 欢迎在下方评论留言

上一篇 下一篇

猜你喜欢

热点阅读