【玩转Android主动化】
系列文章根本完结了,做了这么多功用后其实发现咱们所做的一切都是依赖于当时版别页面的元素id或许text的唯一性去做的,一旦微信晋级后这些id或text变化的话这些功用就悉数失效了,所以接下来咱们的重点工作要放在版别适配上.
为什么要适配
- 咱们都知道微信隔一段时间会更新一些版别,有大版别也有小版别,依照以往的经验,随着版别更新页面元素有时分会发生变化,一段某个版别的页面元素变化了,咱们之前做的所有功用就悉数失效了,咱们花了这么多时间做的东西总不能由于微信晋级就废弃掉吧,所有微信版别适配工作刻不容缓。
怎样适配
-
经过前边系列文章讲解根本上了解了咱们的每个页面都会界说一些枚举,里边放的便是元素节点的
id
和text
以及这个节点是解说阐明,运用的当地只需引证当时类中的值就能够了,那么为了适配不同版别,要怎样去把这块代码抽离出来呐。 -
咱们希望的是在每个功用页面类中界说一个接口,接口中界说一些接口特点,然后在界说一个版别完成类去逐一完成所有用到的节点,然后再依照版别号去分类。最终在界说一个全局变量标明当时用的是哪个版别,运用的当地依据传入的当时版别号去找到对应版别的节点。
-
有了上边的思路咱们先在主页试验一番,先界说一个接口
Node
interface Node {
val homeBottomNavNode: NodeInfo
val bottomNavContactsTabNode: NodeInfo
val bottomNavMineTabNode: NodeInfo
val homeRightTopPlusNode: NodeInfo
val createGroupNode: NodeInfo
}
- 在界说一个微信节点的完成类
WeChatNodesImpl
去完成接口界说的特点
enum class WeChatNodesImpl(val version: String) : WXHomePage.Node {
WechatVersion_8_0_40("8.0.40") {
//主页
override val homeBottomNavNode = NodeInfo("", "com.tencent.mm:id/fj3", "主页底导布局")
override val bottomNavContactsTabNode = NodeInfo("通讯录", "com.tencent.mm:id/f2s", "主页底导【通讯录】tab")
override val bottomNavMineTabNode = NodeInfo("我", "com.tencent.mm:id/f2s", "主页底导【我】tab")
override val homeRightTopPlusNode = NodeInfo("", "com.tencent.mm:id/grs", "主页右上角【加号】按钮")
override val createGroupNode = NodeInfo("建议群聊", "com.tencent.mm:id/knx","点击主页右上角【加号】按钮后弹框中的【建议群聊】按钮")
}
}
留意:这儿之所以要界说成枚举类,是为了列举多版别方便。
-
运用的当地直接调用
WeChatNodesImpl.WechatVersion_8_0_40.homeBottomNavNode.nodeId
,有新版别的时分调用WeChatNodesImpl.WechatVersion_x_x_x.homeBottomNavNode.nodeId
,但是这种方法有个很大的弊端便是每次只支撑一个版别。不同的用户或许运用的版别不一样,这样只支撑一个最新版的话就不够友好了。 -
方才也说了咱们界说的完成类是枚举,这样的话咱们传入某个指定的版别号,就能够从枚举中找到对应的版别的枚举,这样的话就把问题变成
怎样依据传入的版别号去主动获取对应版别的完成
. -
咱们把枚举值转换成key是版别号,value是对应的map,然后依据传入的版别号从map中取出对应的value即可
var currentWXVersion = "8.0.40"
private val wechatNodesImplMap by lazy { WeChatNodesImpl.values().associateBy { it.version } }
val currentWechatNodes: WeChatNodesImpl
get() = wechatNodesImplMap[currentWXVersion] ?: error("未适配的微信版别, currentWXVersion: $currentWXVersion")
-
具体运用的当地调用
currentWechatNodes.homeBottomNavNode.nodeId
就能够了,这样就会主动依据当时设置的版别号取到对应的节点了。 -
其实咱们还能够运用动态署理,去署理
Node
接口,感兴趣的能够了解一下
inline fun <reified Nodes> nodeProxy(): Nodes {
val nodesClass = Nodes::class.java
val proxy =
Proxy.newProxyInstance(nodesClass.classLoader, arrayOf(nodesClass)) { _, method, args ->
val impl = currentWechatNodes
method.invoke(impl, *args.orEmpty())
}
return proxy as Nodes
}
companion object : Nodes by nodeProxy()
最终作用
- 经过上边的方法已经做好了版别适配工作了,来看下作用吧
enum class WeChatNodesImpl(val version: String) : WXHomePage.Nodes {
WechatVersion_8_0_40("8.0.40") {
//主页
override val homeBottomNavNode = NodeInfo("", "com.tencent.mm:id/fj3", "主页底导布局")
override val bottomNavContactsTabNode = NodeInfo("通讯录", "com.tencent.mm:id/f2s", "主页底导【通讯录】tab")
override val bottomNavMineTabNode = NodeInfo("我", "com.tencent.mm:id/f2s", "主页底导【我】tab")
override val homeRightTopPlusNode = NodeInfo("", "com.tencent.mm:id/grs", "主页右上角【加号】按钮")
override val createGroupNode = NodeInfo("建议群聊","com.tencent.mm:id/knx","点击主页右上角【加号】按钮后弹框中的【建议群聊】按钮")
},
WechatVersion_x_x_x("x.x.x") {
//主页
override val homeBottomNavNode = NodeInfo("", "com.tencent.mm:id/fj3", "主页底导布局")
override val bottomNavContactsTabNode = NodeInfo("通讯录", "com.tencent.mm:id/f2s", "主页底导【通讯录】tab")
override val bottomNavMineTabNode = NodeInfo("我", "com.tencent.mm:id/f2s", "主页底导【我】tab")
override val homeRightTopPlusNode = NodeInfo("", "com.tencent.mm:id/grs", "主页右上角【加号】按钮")
override val createGroupNode = NodeInfo("建议群聊","com.tencent.mm:id/knx", "点击主页右上角【加号】按钮后弹框中的【建议群聊】按钮")
}
}
温馨提示:每次运用的时分从已经适配的版别列表中挑选自己手机里装置的微信版别,
挑选好版别号后在运用对应的功用
,当时已适配的版别号是8.0.40
完结
- 至此关于
Android主动化
的全系列文章算是暂时告一段落了,相信经过这几篇文章的学习你已经对其非常了解了,建议我们依据文章次序多阅览几遍加深理解。后边假如有更好玩的功用也欢迎在Issues中提出,或许打在谈论区,假如好玩咱就持续搞哈!
感兴趣的能够下载demo体会一下,在阅览源码过程遇到任何问题欢迎提Issues,假如对你有帮助,希望动动你的发财小手点个赞呗
还没有阅览过【玩转Android主动化】系列文章的能够依据下边列举的目录次序阅览哦
- 一、【玩转Android主动化】开篇序文
- 二、【玩转Android主动化】布局节点速查器
- 三、【玩转Android主动化】小试牛刀
- 四、【玩转Android主动化】微信老友导出
- 五、【玩转Android主动化】微信老友状况查看(假转账方法)
- 六、【玩转Android主动化】微信老友状况查看(拉群方法)
- 七、【玩转Android主动化】微信主动抢红包