Android | 自定义 View 冷知识之动态替换 layout.xml 中的 View
在开发迭代中,有这么一个场景:
我们给
TextView
定制了不少功能,在下一个版本,需要把程序中的所有TextView
都替换成我自己的CustomTextView
,这个时候你会怎么做?有没有一种方法在不改动布局文件的情况下就能实现动态替换呢?
原理:layout.xml -> Java 对象
首先我们知道一个 layout.xml
转成 Java
对象,使用的是 LayoutInflater#inflate
方法。
其内部是通过 xml 解析器,解析到标签比如: Linearlayout
,
inflate()
会调用createViewFromTag()
实例化Linearlayout
对象;createViewFromTag()
方法内部使用了一个Factory
对象;Factory
会调用Factory#onCreateView()
来实例化这个Linearlayout
。
伪代码如下:
1 | public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) { |
所以我只要给 LayoutInflater
设置一个我们自定义的 Factory
就可以实现动态替换 View。
1 | public void setFactory(Factory factory) { |
替换方法
其实在 Activity 本身就是一个 LayoutInflater$Factory
1 | public class Activity extends ContextThemeWrapper |
所以我们只需要实现 Activity 的 onCreateView 就可以实现 View 的动态替换。
1 | public class MyActivity extends Activity { |
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Gavin Liu - 代码人生与科技生活
评论