日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2025/6/17 Android 30 豆豆

文章目錄

  • 前言
  • 一、獲取要注入事件的 View 對象
  • 二、通過反射獲取 View 組件的事件設置方法并執行

前言

Android 依賴注入的核心就是通過反射獲取 類 / 方法 / 字段 上的注解 , 以及注解屬性 ; 在 Activity 基類中 , 獲取該注解 以及 注解屬性 , 進行相關操作 ;

在博客 【IOC 控制反轉】Android 事件依賴注入 ( 事件三要素 | 修飾注解的注解 | 事件依賴注入步驟 ) 中 , 定義了 222 個注解 ,

  • 第一個是方法上的注解 , 用于修飾方法 ;
  • 第二個是修飾注解的注解 , 該注解用于配置注入的方法 ( 事件監聽方法 | 監聽器類型 | 監聽器回調方法 ) ;

事件依賴注入比較復雜 , 涉及到動態代理 , 本博客分析 【IOC 控制反轉】Android 事件依賴注入 ( 事件依賴注入代碼示例 ) 事件依賴注入的詳細步驟 ;


本博客的核心是 : 使用動態代理 , 創建 View.OnClickListener 或 View.OnLongClickListener 或 View.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 组件的事件设置方法 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。