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 - 代码人生与科技生活
评论