- 前言
- 一、获取要注入事件的 View 对象
- 二、通过反射获取 View 组件的事件设置方法并执行
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
在博客 【IOC 控制反转】Android 事件依赖注入 ( 事件三要素 | 修饰注解的注解 | 事件依赖注入步骤 ) 中 , 定义了 2 2 2 个注解 ,
- 第一个是方法上的注解 , 用于修饰方法 ;
- 第二个是修饰注解的注解 , 该注解用于配置注入的方法 ( 事件监听方法 | 监听器类型 | 监听器回调方法 ) ;
事件依赖注入比较复杂 , 涉及到动态代理 , 本博客分析 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 ) 事件依赖注入的详细步骤 ;
本博客的核心是 : 使用动态代理 , 创建 View.OnClickListener
或 View.OnLongClickListener
或 View.onTouchListener
等接口的动态代理类 ; 拦截相应的 onClick
, onLongClick
, onTouch
方法 , 执行自己的方法 , 其它方法正常执行 ;
在 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
关注
打赏
- 【Android Gradle 插件】Gradle 自定义 Plugin 插件 ③ ( 自定义插件作用 | Android Gradle 插件的扩展 | 自定义 Extension 扩展 )
- 【Android Gradle 插件】Gradle 构建生命周期 ③ ( BuildListener 构建监听器 | TaskExecutionGraphListener 任务执行图监听器 )
- 【Android Gradle 插件】Gradle 构建生命周期 ② ( Gradle 类的添加构建生命周期监听器函数 | Gradle#addListener 函数 )
- 【Android Gradle 插件】Gradle 构建生命周期 ① ( 分析构建脚本 | 执行初始化配置 | 执行 Gradle 任务 | Project#beforeEvaluate 函数 )
- 【Android Gradle 插件】自定义 Gradle 任务 ⑨ ( 控制 Gradle 执行任务顺序 | Task#finalizedBy 函数 | 控制 Gradle 执行任务顺序示例分析 )
- 【Android Gradle 插件】自定义 Gradle 任务 ⑧ ( 控制 Gradle 执行任务顺序 | Task#shouldRunAfter 函数 | 三个函数使用场景对比 )
- 【Android Gradle 插件】自定义 Gradle 任务 ⑦ ( 控制 Gradle 执行任务顺序 | Task#dependsOn 函数 | Task#mustRunAfter 函数 )
- 【数学分析】集合 ① ( 集合概念 | 集合表示 | 常用的数集合 | 集合的表示 )
- 【数学分析】学科简介 ( 初等数学缺陷 | 微分与积分 | 学习数学分析的目的 | 数学分析与高等数学对比 )
- 【Android Gradle 插件】自定义 Gradle 任务 ③ ( Gradle 自定义任务创建方法 Project#task 函数 | Task#doFirst 函数用法 )