Android Hook View的创建流程
创始人
2024-02-09 07:18:40
0

前言

前面我们对setContentView的源码进行了深入的分析Android最全的setContentView源码分析,那了解了View的创建流程,我们可以做些什么呢?答案就是我们可以通过拦截View的创建流程去解析View对应的属性(如textColor、src、background等),然后进行APP的换肤!

具体拦截实现

前面我们分析过View的创建流程会交给Factory2.onCreateView()方法去实现,那我们就通过实现 LayoutInflater.factory2接口进行View的创建拦截!

  • 实现LayoutInflater.factory2接口
class BaseSkinActivity : BaseActivity(), LayoutInflater.Factory2
  • onCreate(savedInstanceState: Bundle?)中设置LayoutInflater.factory2
    override fun onCreate(savedInstanceState: Bundle?) {val layoutInflater = LayoutInflater.from(this)layoutInflater.factory2 = this  //当前activity实现 LayoutInflater.factory2接口super.onCreate(savedInstanceState)}
  • 在factory2接口方法中进行View的创建拦截处理
 override fun onCreateView(parent: View?,name: String,context: Context,attrs: AttributeSet): View? {val view = createView(parent, name, context, attrs)if (view != null) {//在这里可以通过attrs解析View的属性和值,进行对应的换肤操作}return view}private fun createView(parent: View?,name: String,context: Context,attrs: AttributeSet): View {//这里的实现参考系统中的AppCompatDelegateImpl.createView方法,直接抄if (appCompatViewInflater == null) {appCompatViewInflater = AppCompatViewInflater()}var inheritContext = falseif (IS_PRE_LOLLIPOP) {if (mLayoutIncludeDetector == null) {mLayoutIncludeDetector = LayoutIncludeDetector()}inheritContext = if (mLayoutIncludeDetector!!.detect(attrs)) {true} else {if (attrs is XmlPullParser // If we have a XmlPullParser, we can detect where we are in the layout) (attrs as XmlPullParser).depth > 1 // Otherwise we have to use the old heuristicelse shouldInheritContext(parent as ViewParent?)}}return appCompatViewInflater!!.createView(parent, name, context, attrs, inheritContext,IS_PRE_LOLLIPOP,  /* Only read android:theme pre-L (L+ handles this anyway) */true,  /* Read read app:theme as a fallback at all times for legacy reasons */VectorEnabledTintResources.shouldBeUsed() /* Only tint wrap the context if enabled */)}private fun shouldInheritContext(parent: ViewParent?): Boolean {var parent: ViewParent? = parentval windowDecor: View = window.decorViewwhile (true) {if (parent == null) {return true} else if (parent === windowDecor || parent !is View|| ViewCompat.isAttachedToWindow((parent as View?)!!)) {return false}parent = parent.getParent()}}

其中AppCompatViewInflater我们无法调用使用系统对应的createView方法,最简单的方式是我们直接复制一份相同的AppCompatViewInflater类,去设置createViewpublic方法即可,createView方法的实现完全可以参考系统中的AppCompatDelegateImpl.createView方法~~

总结

这里只是简单的提供了APP插件换肤的思路,实际开发中插件换肤需要考虑的问题是比较多的,如多套皮肤的管理、自定义View的处理等等问题,但插件换肤的核心就是Hook View的创建流程,从而替换View的属性,说到底还是对源码的深刻理解。

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

相关内容

热门资讯

为什么一听到声音就特别烦躁,有... 为什么一听到声音就特别烦躁,有时候还会控制不住想哭?是不是你最近压力太大了?去看看心理医生吧。要不然...
有没有知道名家描写四季的文章? 有没有知道名家描写四季的文章?只要是家描写四季的文章都行,大家帮找找吧~最好是夏天和冬天的~大家帮帮...
学习计划书的格式 学习计划书的格式急急急急急啊学习计划书格式分三块:1.学习计划书名称仔细回顾一下自己的学习情况,找出...
四年级下册暑假生活指导参考答案... 四年级下册暑假生活指导参考答案山东教育出版社(英语)是2011年的 是帮助tony闯关的。急急...
《翼年代记之东京默示录》主要讲... 《翼年代记之东京默示录》主要讲什么的讲的就是故事讲小樱及小狼来自玖楼国(在日文中,《魔卡少女樱》的大...
纪晓岚简介 纪晓岚简介 纪昀(jǐ yún),字晓岚,一字春帆,晚号石云,道号观弈道人。生于清雍正二年(17...
昨天买的奶茶今天有了一点沉淀物... 昨天买的奶茶今天有了一点沉淀物,还有一点酸味,还吃得了吗?如果你买的不是酸奶最好是不要吃了!这么热的...
冲熬是什么意思 冲熬是什么意思冲熬是什么意思封建迷信的意思
实木家具油漆工艺流程 实木家具油漆工艺流程实木家具刷油漆的方法步骤:第一步,卸把手等装饰品,为了防止把手等饰品沾上油漆,刷...
我想买一台收音机给我奶奶,请问... 我想买一台收音机给我奶奶,请问大家什么电台最适合老人听?最好是没有医学专家讲座的电台。谢谢各位了! ...
寻找儿时的味道!! 寻找儿时的味道!!小时候吃过一种火锅蘸料,别人送的,说是四川的,很麻!吃完嘴巴没感觉那种,不是辣!有...
巢毁卵破的意思是什么,出处是哪... 巢毁卵破的意思是什么,出处是哪里?cháo huǐ luǎn pò成语释义 鸟巢毁了,卵也一定会打...
美好的反义词是什么 标准答案 美好的反义词是什么 标准答案美好【近义词】优美 美妙 美丽 俊美【反义词】丑恶 丑陋丑恶糟糕...
西西里岛有哪些经典值得推荐? 西西里岛有哪些经典值得推荐?我觉得陶尔米纳小城商业气息异常浓重, 基本就是一个为了旅游而生的小城, ...
股评,下跌能量不足,观望.是什... 股评,下跌能量不足,观望.是什么意思就是说某个股票,价格已经下降,但并没有放量下跌,请观望。意思是说...
请你留下请你别走请你留下我的朋... 请你留下请你别走请你留下我的朋友就算要走也请稍停留天空下雨天留我也留 ,这首歌名是什么?就是,请你留...
考研小作文写跑题了 但格式字数... 考研小作文写跑题了 但格式字数都对 能多少分应该是只能得8分
大学生的新一年工作计划书怎么写 大学生的新一年工作计划书怎么写 
星空卫视的动画片 星空卫视的动画片星空卫视2004年到2007年(具体哪一年我也忘记了)播的一部动画片 里面的鬼跟主人...
猴子吃香蕉 猴子吃香蕉有只猴子在树林里采了100根香蕉堆成一堆,猴子家离香蕉堆50米,猴子打算把香蕉背回家,每次...