前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【IOC 控制反转】Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 )

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

作者头像
韩曙亮
发布2023-03-29 17:26:25
发布2023-03-29 17:26:25
89100
代码可运行
举报
运行总次数:0
代码可运行

文章目录

总结

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

一、Android 布局依赖注入步骤


正常控制 : Android 中加载布局操作 , 由自己的 Activity 类加载布局 ;

控制反转 : Android 中加载布局操作 , 由 第三者 加载 Activity 布局 ;

Android 布局依赖注入步骤 :

  • ① 客户端 Activity : 定义 MainActivity , 继承 BaseActivity ;
  • ② IOC 库中的 Activity 父类 : 定义 BaseActivity , 在 BaseActivity 中的 onCreate 方法中 , 处理依赖注入相关逻辑 ;
  • ③ 依赖注入逻辑 : 获取 Activity 类 , 并使用反射获取类上的注解属性 ( 布局文件 ID ) , 为 Activity 设置该布局文件 ;

二、Android 布局依赖注入示例


1、创建依赖注入库

首先在 Android 应用中 , 创建一个 " Android Library " ,

设置主应用依赖该 Android 依赖库 :

代码语言:javascript
代码运行次数:0
运行
复制
dependencies {
    implementation project(path: ':ioc_lib')
}

2、声明注解

创建如下注解 :

代码语言:javascript
代码运行次数:0
运行
复制
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.TYPE)   // 该注解作用于类上
@Retention(RetentionPolicy.RUNTIME)    // 注解保留到运行时
public @interface ContentView {
    int value();    // 接收 int 类型值
}

@Target(ElementType.TYPE) 表示该注解作用与类上 ;

@Retention(RetentionPolicy.SOURCE) 注解保留到源码期 , Java 源码时期 RetentionPolicy.SOURCE -> Class 字节码时期 RetentionPolicy.CLASS -> JVM 运行时时期 RetentionPolicy.RUNTIME ;

int value() 表示该注解接收一个 int 类型的值 ;

3、Activity 基类

代码语言:javascript
代码运行次数:0
运行
复制
package kim.hsl.ioc_lib;

import android.app.Activity;
import android.os.Bundle;

import androidx.annotation.Nullable;

public class BaseActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 在此处注入布局
        //      此处传入的 Activity 参数是 MainActivity 子类对象
        InjectUtils.inject(this);
    }
}

4、依赖注入工具类

代码语言:javascript
代码运行次数:0
运行
复制
package kim.hsl.ioc_lib;

import android.app.Activity;

public class InjectUtils {
    /**
     * 为 Activity 注入布局
     * @param activity  该 Activity 是继承了 BaseActivity 的 MainActivity 实例对象
     */
    public static void inject(Activity activity) {
        // 获取 Class 字节码对象
        Class<? extends Activity> clazz = activity.getClass();
        // 反射获取类上的注解
        ContentView contentView = clazz.getAnnotation(ContentView.class);
        // 获取注解中的布局 ID
        int layoutId = contentView.value();
        // 为 Activity 设置显示的布局
        activity.setContentView(layoutId);
    }
}

5、客户端 Activity

代码语言:javascript
代码运行次数:0
运行
复制
package kim.hsl.ioc_demo;

import kim.hsl.ioc_lib.BaseActivity;
import kim.hsl.ioc_lib.ContentView;

/**
 * 当该 MainActivity 启动时 , 调用 BaseActivity 的 onCreate 方法
 *      在 BaseActivity 的 onCreate 方法中注入布局
 */
@ContentView(R.layout.activity_main)
public class MainActivity extends BaseActivity {
}

运行结果 :

三、博客源码

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 总结
  • 一、Android 布局依赖注入步骤
  • 二、Android 布局依赖注入示例
    • 1、创建依赖注入库
    • 2、声明注解
    • 3、Activity 基类
    • 4、依赖注入工具类
    • 5、客户端 Activity
  • 三、博客源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档