IOC 控制反转Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOC 控制反转Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )相关的知识,希望对你有一定的参考价值。

前言

Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;

在博客 【IOC 控制反转】Android 事件依赖注入 ( 事件三要素 | 修饰注解的注解 | 事件依赖注入步骤 ) 中 , 定义了 2 2 2 个注解 ,

  • 第一个是方法上的注解 , 用于修饰方法 ;
  • 第二个是修饰注解的注解 , 该注解用于配置注入的方法 ( 事件监听方法 | 监听器类型 | 监听器回调方法 ) ;

事件依赖注入比较复杂 , 涉及到动态代理 , 本博客分析 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 ) 事件依赖注入的详细步骤 ;


本博客的核心是 : 使用动态代理 , 创建 View.OnClickListenerView.OnLongClickListenerView.onTouchListener 等接口的动态代理类 ;
拦截相应的 onClick , onLongClick , onTouch 方法 , 执行自己的方法 , 其它方法正常执行 ;





一、获取要注入事件的 View 对象



MainActivity 中 , 使用了 @OnClick({R.id.textView}) 注解 , 修饰 public void onClick(View view) 方法 ;

    @OnClick({R.id.textView})   // 事件注入
    public void onClick(View view) {
        Toast.makeText(this, "点击 TextView 组件", Toast.LENGTH_LONG).show();
    }

@OnClick 注解中 , 传入的注解属性 int[] value() , 就是 View 组件的 ID 数组 ;

/**
 * 自定义注解
 *  用于依赖注入视图
 */
@Target(ElementType.METHOD)   // 该注解作用于方法上
@Retention(RetentionPolicy.RUNTIME)    // 注解保留到运行时
@EventBase(
        listenerSetter = "setOnClickListener",
        listenerType = View.OnClickListener.class,
        callbackMethod = "onClick")
public @interface OnClick {
    int[] value();    // 接收 int 类型数组
}

通过反射获取注解的 value 方法 , 调用注解的 value 方法 , 即可获取 View 组件 ID 数组 ;

                    // 通过反射获取 OnClick 注解的 int[] value() 方法
                    Method valueMethod = annotationType.getDeclaredMethod("value");
                    // 调用 value() 方法 , 获取视图组件 ID 数组
                    int[] viewIds = (int[]) valueMethod.invoke(annotations[j]);

然后遍历该数组 , 调用 activity.findViewById 获取 View 组件 ;

                    // 遍历 ID 数组
                    for (int k = 0; k < viewIds.length; k ++) {
                        // 获取组件实例对象
                        View view = activity.findViewById(viewIds[k]);
                        if (view == null) {
                            continue;
                        }
					}




二、通过反射获取 View 组件的事件设置方法并执行



获取 View 组件的事件设置方法 , 如果设置的是点击事件 , 就是获取 setOnClickListener 方法 , 如果设置的是长按事件 , 就是获取 onLongClickListener 方法 , 如果设置的是触摸方法 , 就是获取 setOnTouchListener 方法 ;

获取方法时 , 需要传入方法的参数 , 就是设置的事件监听器对象 , 点击事件的事件监听器是 View.OnClickListener 监听器 , 触摸事件的事件监听器是 View.OnTouchListener 监听器 ;

                        // 获取 View 视图组件的 listenerSetter 对应方法
                        //      这里是 View.setOnClickListener
                        //      参数一是方法名称 , 参数二是方法参数类型
                        Method listenerSetterMethod =
                                view.getClass().getMethod(listenerSetter, listenerType);

执行该设置 " 事件监听器 " 的方法 , 需要通过反射调用该方法 , 同时传入事件监听器 , 事件监听器需要用到动态代理 , 在下一篇博客介绍 ;

                        // 执行 View 的 setOnClickListener 方法, 为其设置点击事件
                        listenerSetterMethod.invoke(view, proxy);

以上是关于IOC 控制反转Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )的主要内容,如果未能解决你的问题,请参考以下文章

IOC 控制反转Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )

IOC 控制反转Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 创建 事件监听器 对应的 动态代理 | 动态代理的数据准备 | 创建调用处理程序 | 创建动态代理实例对象 )(代码片

IOC 控制反转Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )(代

IOC 控制反转Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 )

IOC 控制反转Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )

Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)