本来没写这个的,但是后来用的时候发现还是有坑的。

一、使用“插件”的资源

1.判断是否安装了“插件”,如果没有安装,先安装“插件”

2.已安装“插件”,获取“插件”资源ID: (获取 R.string.app_name 为例)

通过反射

//获取“插件”加载类
val classLoader = RePlugin.fetchClassLoader("plugin1")
//获取“插件”中values/strings.xml对应的类
val loadClass = classLoader.loadClass("com.test.qby.myapplication.R\$string")
//获取资源名字app_name
val field = loadClass.getField("app_name")
//获取“插件”ID R.string.app_name
val identifier = field.get(loadClass)

通过 RePlugin.fetchResourceIdByName 方法

val identifier = RePlugin.fetchResourceIdByName("plugin1", "string/app_name")

通过 RePlugin.fetchResources 和 getIdentifier 方法

val fetchResources = RePlugin.fetchResources("plugin1")
val identifier = fetchResources.getIdentifier("app_name", "string", RePlugin.fetchPackageInfo("plugin1").packageName)

3.三种方法都能获取到资源ID,再调用 RePlugin.fetchResources(“plugin1”).getXXX方法获取资源,或者直接使用ID。此外,RePlugin还提供了单独的获取layout对应View的方法

//获取layout/activity_plugin.xml
val view = RePlugin.fetchViewByLayoutName<View>("plugin1", "activity_plugin", null)

二、“插件”使用“宿主”的资源

(以使用“宿主”layout为例)
获取宿主资源ID

try {//通过宿主类加载器获取layout对应类val loadClass = RePlugin.getHostClassLoader().loadClass("com.test.qby.myapplication.R\$layout")//获取content_main字段val field = loadClass.getField("content_main")//获取content_main对应资源IDval any = field.get(loadClass)
} catch (e: ClassNotFoundException) {e.printStackTrace()
} catch (e: NoSuchFieldException) {e.printStackTrace()
} catch (e: IllegalAccessException) {e.printStackTrace()
}

使用布局资源ID

//第一种
//获取XmlResourceParser
val layout = RePlugin.getHostContext().resources.getLayout(any as Int)
//根据XmlResourceParser获取View
val view = layoutInflater.inflate(layout, null)//第二种
val view = View.inflate(RePlugin.getHostContext(), any as Int,null)

三、“插件”使用“宿主”资源需要通过反射还是比较麻烦的,这里可以抽成一个工具类方法。

工具类方法:

/**
* 获取宿主资源ID
*
* @param packageName 包名,宿主包名
* @param className   类名,如layout\string\drawable\dimen\color
* @param fieldName   字段名,如字段content_main对应layout\content_main.xml
* @return 资源ID
*/
fun getHostResourceId(packageName: String, className: String, fieldName: String): Int {try {//通过宿主类加载器获取layout对应类val loadClass = RePlugin.getHostClassLoader().loadClass("$packageName.R\$$className")//获取content_main字段val field = loadClass.getField(fieldName)//获取content_main对应资源IDreturn field.get(loadClass) as Int} catch (e: ClassNotFoundException) {e.printStackTrace()} catch (e: NoSuchFieldException) {e.printStackTrace()} catch (e: IllegalAccessException) {e.printStackTrace()}return 0
}

使用工具类方法获取资源 ID

val layoutId = MyUtil.getHostResourceId(packageName,"layout","content_main")

以上仅个人学习记录,如有疏漏或谬误,欢迎留言交流!

360插件化方案RePlugin学习笔记-资源共享相关推荐

  1. 360 java插件设置_360插件化方案RePlugin初体验

    前天跟朋友聊天提到他们要做个跟360插件化方案类似的框架,领导让他们先了解一下360的实现思路,我也就跟着尝试了一下. RePlugin 是一套完整的.稳定的.适合全面使用的,占坑类插件化方案,由36 ...

  2. 滴滴插件化方案 VirtualApk 源码解析

    本文已在我的公众号hongyangAndroid原创首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/75000580 本文 ...

  3. 爱奇艺开源轻量级插件化方案 Neptune

    爱奇艺近日开源了其轻量级插件化方案 Neptune,项目地址:https://github.com/iqiyi/Neptune 插件化框架可以在主程序不重新安装的情况下,针对单个业务模块进行动态加载达 ...

  4. Cordova插件使用和开发学习笔记

    Cordova插件使用和开发学习笔记 1. Cordova插件开发 1.1 环境搭建 1.2 插件初始化 1.3 插件完善 1.4 plugin.xml 2. Cordova插件使用 2.1 创建项目 ...

  5. [Android]用架构师角度看插件化(1)-Replugin入门剖析

    多谢一直以来的支持,组件化的内容,应该会有一段时间不再更新,一些非常关键的技术将会在我将要出版的组件化书籍中提及. 组件化模块化的开发适合于中小型企业的业务叠加,和代码重用.而插件化的开发将组件化和模 ...

  6. [Android]用架构师角度看插件化(2)-Replugin 唯一hook点

    Replugin,为何我选择要研究这个的插件呢?很大的原因是因为它的介绍中说明,他只会有一个hook点. 一.Hook hook点是什么? 我们入门Android的时候,一定会看到过这个图,但是你确定 ...

  7. [Android]用架构师角度看插件化(3)-Replugin 需要占坑跳转?

    一.占坑 什么是占坑?为什么要占坑? Android插件化中,从一个插件Activity跳转到不同插件的Activity的时候,是否可以能正常跳转成功? 声明Activity需要配置什么? 声明Act ...

  8. android 插件化 方案,Android应用开发之Android 插件化,qihoo360插件方案配置教程

    本文将带你了解Android应用开发Android 插件化,qihoo360插件方案配置教程,希望本文对大家学Android有所帮助. Android 插件化,qihoo360插件方案 目录 Andr ...

  9. .NET Core开发实战(第14课:自定义配置数据源:低成本实现定制化配置方案)--学习笔记...

    14 | 自定义配置数据源:低成本实现定制化配置方案 这一节讲解如何定义自己的数据源,来扩展配置框架 扩展步骤 1.实现 IConfigurationSource 2.实现 IConfiguratio ...

  10. [插件化] Droid Plugin 学习总结

    原文地址: http://www.jianshu.com/p/d16cd0e3333f http://blog.csdn.net/qq_24889075/article/details/6848983 ...

最新文章

  1. AI助力清华博士进入周杰伦战队,预告AI应用迎来黄金时代?
  2. 基于psr规范php框架,PHP-PSR规范
  3. 0_0 SimpleFactoryMode 简单工厂模式
  4. 传统公司部署OpenStack(t版)简易介绍(四)——placement模块部署
  5. openresty+mysql+乱码_openresty记录响应body乱码问题
  6. kali linux子远程桌面,适用于kali linux的远程桌面开启方法(从windows xp 远程登录到kali linux )...
  7. C#.NET验证码智能识别学习笔记---06 解决java jre问题:JTessBoxEditor.jar打开的时报找不到或无法加载主类 com.sun.tools.javac.Main错误
  8. 常用SQL语句---备忘
  9. 面对数据缺失,如何选择合适的机器学习模型?
  10. Flex4 Skinning 1: 自定义一个简单按钮的皮肤
  11. ILSpy反编译软件的使用
  12. 蓝桥杯省赛C++A组B组题解整理(第十、九、八、七、六、五、四、三届)
  13. Keil MDK 编译器 AC5 和 AC6 优化选项重要内容和区别
  14. 电脑版微信怎么双开、多开 超级简单
  15. P4学习笔记(一)初识P4
  16. ​12个很棒的Pandas和NumPy函数,让分析事半功倍
  17. archlinux下网易云音乐netease-cloud-music部分问题
  18. 修改oracle nls_language
  19. TTS什么意思,缩写,微软TTS语音引擎(中文)5.1 “TTS”是“文本到语音(Text To Sound)”的简称
  20. Android Studio 使用Vuforia(高通)开发AR

热门文章

  1. 阮一峰:值得分享给开发者的 Authing 身份云
  2. NDB和InnoDB存储引擎比较
  3. Electron修改图标
  4. W3C 标准 较详细
  5. 4484: [Jsoi2015]最小表示 bitset+拓扑序
  6. Rhino6.9软件安装教程|兼容WIN10
  7. 华南理工计算机就业棒棒,国内3所校名“一字之差”的大学:均为理工大学,实力却天差地别...
  8. Elastic:关于索引生命周期ILM的一些试验;warm,cold,delete节点中min_age设置的是增量还是累计值
  9. 超越函数e^(-x^2)在(-∞, +∞)上的定积分的两种解法
  10. 自己写C#用汽车诊断卡对MIT电机做调试