自定义View冷知识之动态替换layout.xml中的View
来源:互联网 发布:godaddy 转入阿里云 编辑:程序博客网 时间:2024/05/29 03:01
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
。
伪代码如下:
123456789101112131415161718192021222324252627
public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) {...final String name = parser.getName();...final View temp = createViewFromTag(root, name, inflaterContext, attrs);}View createViewFromTag(View parent, String name, Context context, AttributeSet attrs, boolean ignoreThemeAttr) {...View view;if (mFactory2 != null) {view = mFactory2.onCreateView(parent, name, context, attrs);} else if (mFactory != null) {view = mFactory.onCreateView(name, context, attrs);} else {view = null;}...view = createView(name, null, attrs);}
所以我只要给 LayoutInflater
设置一个我们自定义的 Factory
就可以实现动态替换View。
12345
public void setFactory(Factory factory) {}public void setFactory2(Factory2 factory) {}
替换方法
其实在 Activity 本身就是一个 LayoutInflater$Factory
1234567
public class Activity extends ContextThemeWrapperimplements LayoutInflater.Factory2,Window.Callback, KeyEvent.Callback,OnCreateContextMenuListener, ComponentCallbacks2,Window.OnWindowDismissedCallback, WindowControllerCallback {}
所以我们只需要实现 Activity 的 onCreateView 就可以实现 View 的动态替换。
123456789
public class MyActivity extends Activity {public View onCreateView(String name, Context context, AttributeSet attrs) {if (name.equals("TextView")) {return new CustomTextView(context, attrs);}return suqer.onCreateView(name, context, attrs);}}
0 0
- 自定义View冷知识之动态替换layout.xml中的View
- 自定义View之Layout浅析
- 在Layout xml中配置自定义View
- 在Layout xml中配置自定义View
- Android之在Layout中自定义View
- 自定义View之measure、layout、draw
- 自定义View之Layout方法详解
- 自定义view之layout()与onLayout()方法
- 自定义View Layout
- 自定义view&adapterview&layout
- 自定义View Layout过程
- 用户界面View之Layout
- 【转】android:自定义layout动态改变view位置和大小
- android:自定义layout动态改变view位置和大小
- 【自定义view系列】View的layout过程
- Android知识梳理之自定义View
- 自定义view的Layout过程
- xml布局里面使用自定义view中的内部view
- 【C#】C#中的委托与事件
- Android编程权威指南(第二版)学习笔记(十七)—— 第17章 Master-Detail 用户界面
- 属性注入方式
- ubuntu下android-studio环境配置
- ffmpeg裁剪合并视频
- 自定义View冷知识之动态替换layout.xml中的View
- Qt QPainter类 画板的使用
- HTML+CSS学习笔记四
- React native 技术视频免费共享190集(持续更新中)
- 【攻略技巧】分分钟教你选出最适合自己的笔记本电脑!
- 简易视频播放器
- ServiceWorker详解
- Python快速入门视频
- Python第三方库--绘图工具Pychartdir安装