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

歡迎訪問 生活随笔!

生活随笔

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

Android

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

發布時間:2025/6/17 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 總結
  • 一、Android 視圖依賴注入步驟
  • 二、Android 布局依賴注入示例
    • 1、創建依賴注入庫
    • 2、聲明注解
    • 3、Activity 基類
    • 4、依賴注入工具類
    • 5、客戶端 Activity
  • 三、博客源碼

總結

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





一、Android 視圖依賴注入步驟



Android 視圖依賴注入步驟 :

  • ① 聲明注解 : 聲明視圖注入注解 BindBiew ;
  • ② 客戶端 Activity : 定義 MainActivity , 繼承 BaseActivity , 在屬性字段上使用 @BindBiew 注解注入視圖 ;
  • ③ IOC 庫中的 Activity 父類 : 定義 BaseActivity , 在 BaseActivity 中的 onCreate 方法中 , 處理依賴注入相關邏輯 ;
  • ④ 依賴注入邏輯 : 獲取 Activity 類 , 并使用反射獲取類中的所有屬性字段 , 獲取所有的 @BindBiew 注解 , 如果找到該注解 , 執行 findViewById 獲取視圖組件對象 , 并賦值給 Activity 中的屬性字段 ;




二、Android 布局依賴注入示例




1、創建依賴注入庫


首先在 Android 應用中 , 創建一個 " Android Library " ,

設置主應用依賴該 Android 依賴庫 :

dependencies {implementation project(path: ':ioc_lib') }

2、聲明注解


創建如下注解 :

package kim.hsl.ioc_lib;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** 自定義注解* 用于依賴注入視圖*/ @Target(ElementType.FIELD) // 該注解作用于字段上 @Retention(RetentionPolicy.RUNTIME) // 注解保留到運行時 public @interface BindView {int value(); // 接收 int 類型值 }

@Target(ElementType.FIELD) 表示該注解作用于屬性字段上 ;

@Retention(RetentionPolicy.SOURCE) 注解保留到源碼期 , Java 源碼時期 RetentionPolicy.SOURCE -> Class 字節碼時期 RetentionPolicy.CLASS -> JVM 運行時時期 RetentionPolicy.RUNTIME ;

int value() 表示該注解接收一個 int 類型的值 ;


3、Activity 基類


package kim.hsl.ioc_lib;import android.app.Activity; import android.os.Bundle;import androidx.annotation.Nullable;public class BaseActivity extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 在此處注入布局// 此處傳入的 Activity 參數是 MainActivity 子類對象InjectUtils.inject(this);} }

4、依賴注入工具類


將上一篇博客 【IOC 控制反轉】Android 布局依賴注入 ( 布局依賴注入步驟 | 布局依賴注入代碼示例 ) 中的布局注入 , 抽到 injectLayout 方法中 ; 將注入視圖組件定義在 injectViews 方法中 ;

package kim.hsl.ioc_lib;import android.app.Activity; import android.view.View;import java.lang.reflect.Field;public class InjectUtils {/*** 為 Activity 注入布局* @param activity 該 Activity 是繼承了 BaseActivity 的 MainActivity 實例對象*/public static void inject(Activity activity) {// 注入布局文件injectLayout(activity);// 注入視圖組件injectViews(activity);}/*** 注入布局文件*/private static void injectLayout(Activity activity) {// 獲取 Class 字節碼對象Class<? extends Activity> clazz = activity.getClass();// 反射獲取類上的注解ContentView contentView = clazz.getAnnotation(ContentView.class);// 獲取注解中的布局 IDint layoutId = contentView.value();// 為 Activity 設置顯示的布局activity.setContentView(layoutId);}/*** 注入視圖組件*/private static void injectViews(Activity activity) {// 獲取 Class 字節碼對象Class<? extends Activity> clazz = activity.getClass();// 獲取類的屬性字段Field[] fields = clazz.getDeclaredFields();// 循環遍歷類的屬性字段for (int i = 0; i < fields.length; i ++) {// 獲取字段Field field = fields[i];// 屬性有可能是私有的, 這里設置可訪問性field.setAccessible(true);// 獲取字段上的注解, @BindView 注解// 注意不是所有的屬性字段都有 @BindView 注解BindView bindView = field.getAnnotation(BindView.class);if (bindView == null) {// 如果沒有獲取到 BindView 注解 , 執行下一次循環continue;}// 獲取注入的視圖組件int viewId = bindView.value();// 根據組件 id 獲取對應組件對象View view = activity.findViewById(viewId);try {// 通過反射設置 Activity 的對應屬性字段的值field.set(activity, view);} catch (IllegalAccessException e) {e.printStackTrace();}}} }

5、客戶端 Activity


package kim.hsl.ioc_demo;import android.util.Log; import android.widget.TextView;import kim.hsl.ioc_lib.BaseActivity; import kim.hsl.ioc_lib.BindView; import kim.hsl.ioc_lib.ContentView;/*** 當該 MainActivity 啟動時 , 調用 BaseActivity 的 onCreate 方法* 在 BaseActivity 的 onCreate 方法中注入布局*/ @ContentView(R.layout.activity_main) // 布局注入 public class MainActivity extends BaseActivity {/*** 視圖注入*/@BindView(R.id.textView)private TextView textView;@Overrideprotected void onResume() {super.onResume();// 驗證 textView 是否注入成功Log.i("MainActivity", "textView : " + textView);} }

運行結果 :

Logcat 打印結果 :

I/MainActivity: textView : android.widget.TextView{fe85f76 V.ED..... ......ID 0,0-0,0 #7f08017e app:id/textView}





三、博客源碼



GitHub : https://github.com/han1202012/IOC_Demo

CSDN : https://download.csdn.net/download/han1202012/24031128

總結

以上是生活随笔為你收集整理的【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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