Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )

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

作者头像
韩曙亮
发布于 2023-03-29 09:28:04
发布于 2023-03-29 09:28:04
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

前言

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

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

个注解 ,

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

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

本博客的核心是 : 使用动态代理 , 创建 View.OnClickListener View.OnLongClickListener View.onTouchListener 等接口的动态代理类 ;

拦截相应的 onClick , onLongClick , onTouch 方法 , 执行自己的方法 , 其它方法正常执行 ;

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


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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @OnClick({R.id.textView})   // 事件注入
    public void onClick(View view) {
        Toast.makeText(this, "点击 TextView 组件", Toast.LENGTH_LONG).show();
    }

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 自定义注解
 *  用于依赖注入视图
 */
@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 数组 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                    // 通过反射获取 OnClick 注解的 int[] value() 方法
                    Method valueMethod = annotationType.getDeclaredMethod("value");
                    // 调用 value() 方法 , 获取视图组件 ID 数组
                    int[] viewIds = (int[]) valueMethod.invoke(annotations[j]);

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                    // 遍历 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 监听器 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                        // 获取 View 视图组件的 listenerSetter 对应方法
                        //      这里是 View.setOnClickListener
                        //      参数一是方法名称 , 参数二是方法参数类型
                        Method listenerSetterMethod =
                                view.getClass().getMethod(listenerSetter, listenerType);

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                        // 执行 View 的 setOnClickListener 方法, 为其设置点击事件
                        listenerSetterMethod.invoke(view, proxy);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
韩曙亮
2023/03/29
3.1K0
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
韩曙亮
2023/03/29
3550
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 创建 事件监听器 对应的 动态代理 | 动态代理的数据准备 | 创建调用处理程序 | 创建动态代理实例对象 )
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
韩曙亮
2023/03/29
2.5K0
【IOC 控制反转】Android 事件依赖注入 ( 事件三要素 | 修饰注解的注解 | 事件依赖注入步骤 )
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
韩曙亮
2023/03/29
9220
IOC架构实现布局、事件注入
通过反射获取ContentView注解,并最终调用Activity的setContentView方法
aruba
2021/12/06
5540
IOC架构实现布局、事件注入
Android触摸事件_wpf触摸屏点击事件
这些方法都是View类的,所以像TextView这样看似不是按钮的组件也可以使用这些监听。
全栈程序员站长
2022/09/30
2.3K0
移动架构-IOC架构设计
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中
Android技术干货分享
2019/05/10
8120
移动架构-IOC架构设计
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
韩曙亮
2023/03/29
7650
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )
Android事件处理概述
通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件、选框的状态切换事件。 一、Android事件处理 Android提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理。 基于监听的事件处理:主要做法就是为Android界面组件绑定特定的事件监听器,前面小节已经见到大量这种事件处理的示例。 基于回调的事件处理:主要做法就是重写Android组件特定的回调方法, 或者重写Activity的回调方法。Android为绝大部分界面组件都提供了
分享达人秀
2018/02/02
1.1K0
Android事件处理概述
自定义Android IOC框架
所谓IOC,即控制反转(Inversion of Control,英文缩写为IoC)
没关系再继续努力
2021/11/29
3800
View的事件源码解析
上次刚刚分析了view的事件拦截机制,那么这次我们通过源码来分析一波view的事件,如果对view的事件不了解的,可以先看View的事件拦截浅析 解析View的源码 既然是分析源码,那么我们就要找准入手点,不然几万行代码看完在整理完还是很累的。既然是事件的分析,我们就应该知道从哪入手。就是touchevent了。 首先,我们先了解下下面几个属性,这肯定是和事件有关的。 1.clickable:控制当前view是否可以点击 2.longclickable:控制当前view是否可以长按 3.foucsable:
我就是马云飞
2018/02/05
9720
View的事件源码解析
Android之按钮点击事件(单击、双击、长按等)
在布局文件中添加按钮点击事件 1、在xml文件中 为 Button 添加android:onclick属性
程思扬
2023/07/24
2.9K0
.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式
在Andrioid开发中,常见的事件如下 单击事件 OnClickListener 长按事件 OnLongClickListener 滑动事件 OnTouchListenner 键盘事件 OnKeyListenner 焦点事件 setOnFoucsChangeListener 设置方式 1.动态设置(最常用的方式) Button btn = (Button) findViewById(R.id.btnTest); btn.setOnClickListener(new View.OnClic
用户1149182
2018/01/16
1.1K0
.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式
【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )
【Android 插件化】插件化简介 ( 组件化与插件化 ) 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 ) 【Android 插件化】插件化原理 ( 类加载器 )
韩曙亮
2023/03/29
8200
【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )
Android事件处理机制
1.前言 在android的进阶之路上,看《android开发艺术探索》实在看不下去了,开始怀疑自己的android基础了,于是找了两本android基础的书把android基础过一遍,还确实发现了好多知识漏洞-基于回调的事件,这个还真以前没用过,然后就想着把android事件处理机制的知识点都整理一遍,嗯,就是这样的。 2.基于监听的事件 基于监听的事件更接近于“面向对象”的事件处理,这种处理方法与java的AWT/Swing的处理方式相同。 2.1监听的处理流程 基于监听的事件
用户1907613
2018/07/20
9510
Android中基于监听的事件处理
上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本期继续来学习其他四种事件监听器。 一、使用内部类作为事件监听器 和上面的匿名内部类不同,使用内部类可以在当前类中复用该监听器类;因为监听器类是外部类的内部类,所以可以自由访问外部类的所有界面组件,这也是内部类的两个优势。 接下来通过一个简单的示例程序来学习Android使用内部类作为事件监听器。 继续使用WidgetSample工程,在app/main/res
分享达人秀
2018/02/02
1.6K0
Android中基于监听的事件处理
Android Button 单击事件
方法一:在XML文件中指定 单击事件函数 <Button             android:id="@+id/button1"             android:layout_width="120dip"             android:layout_height="wrap_content"             android:layout_alignParentLeft="true"             android:layout_below="@+id/textView1
磊哥
2018/05/08
1.9K0
Android开发学习——事件监听方式
大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件器更合适,实际上,这种形式是目前是最广泛的事件监听器形式。上面的程序代码就是匿名内部类来创建事件监对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握 内部类
Max超
2019/01/21
6370
Android Studio 知识储备 之 ✨-基础知识学习历程
所有的资源文件都会在R.java文件下生成对应的资源id,我们可以直接通过资源id访问到对应的资源。使用mipmap会在图片缩放在提供一定的性能优化,分辨率不同系统会根据屏幕分辨率来选择hdpi,mdpi,xmdpi,xxhdpi下的对应图片,所以你解压别人的apk可以看到上述目录同一名称的图片,在四个文件夹下都有,只是大小和像素不一样而已!当然,这也不是绝对的,比如我们把所有的图片都丢在了drawable-hdpi下的话,即使手机 本该加载ldpi文件夹下的图片资源,但是ldpi下没有,那么加载的还会是hdpi下的图片! 另外,还有一种情况:比如是hdpi,mdpi目录下有,ldpi下没有,那么会加载mdpi中的资源! 原则是使用最接近的密度级别!另外如果你想禁止Android不跟随屏幕密度加载不同文件夹的资源,只需在AndroidManifest.xml文件中添加android:anyDensity="false"字段即可!
呆呆敲代码的小Y
2021/08/12
7020
Android 事件处理探险
Android提供了两套事件处理机制:基于监听的事件处理;基于回调的事件处理 1.基于监听的事件处理 Android的事件处理是一种委派式事件处理方式(事件源将整个事件处理委托给事件监听器),事件监听的处理模型主要涉及:Event Source(事件源)、Event(事件)、Event Listener(事件监听器)。 小技巧: requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉窗口标题 getWindow().setFlags(WindowManage
非著名程序员
2018/02/02
6890
推荐阅读
相关推荐
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验