美文网首页
通过注解手写监听框架(原创,转载请标注)

通过注解手写监听框架(原创,转载请标注)

作者: 江南小夜 | 来源:发表于2018-03-13 10:14 被阅读28次
第一步:先定义一个监听注解类
    代码:
    /**
    * 监听注解
    * @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("点击了……………………");
}

相关文章

网友评论

      本文标题:通过注解手写监听框架(原创,转载请标注)

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