之前记录了自己走通 LayoutInflater 的源码整体流程,一直想搞个好玩的东西,想起之前看到过的换肤方案,决定写个换系统控件的库。

项目地址,项目的具体使用,可以看README

首先需要确定,LayoutInflater对于Android自带的view读入的名字是没有全名的,具体创建的时候是通过写上前缀,然后借助反射进行实例化的

举例:

...

/>

作为xml读入以后,是只有TextView的

....

/>

作为xml读入后,是整个名字存在的,即dove.flyer.xu.mineView,具体细节[前面文章]()已经叙述了,此处不重复了

明确,Factory如果可以构建view对象的话,后面的view实例化操作是不会被进行的。

首先定位到createViewFromTag。

源码中,以Factory为例子,如果Factory为空的时候,是不会执行里面代码的,如果设置了,则会执行。而执行后,如果view不为空,则下面的view创建都会失效,也就是说,如果Factory创建成功了view,那么后面创建view部分的代码并不会执行。Facory2也同理。

而Factory和Factory2在一开始就是空的,只需要设置好这个Factory,那具体的view创建就会被它俩其中一个接手。

View createViewFromTag(View parent, String name, AttributeSet attrs, boolean inheritContext){

....

if (mFactory2 != null) {

view = mFactory2.onCreateView(parent, name, viewContext, attrs);

} else if (mFactory != null) {

view = mFactory.onCreateView(name, viewContext, attrs);

} else {

view = null;

}

if(view == null ...){

...

}

if(view == null ...){

...

}

....

}

明确Factory是可以被set进去的

调用getLayoutInflater().setFactory(factory)即可

剩下的就是考虑Activity会在何时才会创建view,自然是setContentView(R.layout_aa.xml),该方法会触发整个对应layout.xml的inflate

所以剩下的就是在onCreate的时候,在setContentView之前,把自己的Factory给设置进去,把传进来的名字,修改成自己的view就可以了。

以上三点拼在一起就可以进行系统控件的同意替换,具体Factory重写的细节请参考源码。

android layout 替换,LayoutInflater 后记--替换系统控件相关推荐

  1. android layout 对齐,安卓利用TableLayout实现控件列对齐

    背景 有时以列表形式展示控件时,需要保持上下控件对齐. 效果图 "用户账号:"和"密码:"居左或居右对齐,同时后面的输入框也对齐. 实现方案 利用TableLa ...

  2. Android游戏开发系统控件-Dialog

    Android游戏开发系统控件-Dialog Dialog(对话框)在Android应用开发中经常用到,下面是学习<Android游戏编程从零开始>一书,关于Dialog的初步学习. 创建 ...

  3. Android游戏开发系统控件-CheckBox

    Android游戏开发系统控件-CheckBox 2012/5/11 星期五 CheckBox是Android系统最普通的UI控件,继承了Button按钮 下面通过一个实例来学习 作者:wwj 功能: ...

  4. Android UI 统一修改Button控件的样式,以及其它系统控件的默认样式

    先介绍下修改原理:首先打开位于android.widget包下面的Button.java文件,这里有一句关键的代码如下: public Button(Context context, Attribut ...

  5. Android系统控件获取自定义属性

    我们如果想在ImageView,Button,TextView等系统控件中在XML中配置自定义属性该如何实现呢?例如我们有一个scrollView,在ScrollView里面有上述的一些控件的自定义属 ...

  6. Android基础学习(二)—— 常用控件

    TextView 显示文本内容 Button 按钮 EditText 输入框 ImageView 显示图片 ProgressBar 进度条 ToolBar 自定义标题栏 AlertDialog 对话框 ...

  7. php支付密码控件,Android高仿微信支付密码输入控件实例代码

    这篇文章主要为大家详细介绍了Android高仿微信支付密码输入控件的具体实现代码,供大家参考,具体内容如下 像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现 ...

  8. Android横向滑动加载更多的控件的实现---HorizontalScrollSlideView

    Android横向滑动加载更多的控件的实现-HorizontalScrollSlideView 需求 之前公司业务要求做一个横向滑动的,可以加载更多的控件,第一时间想到的就是 RecyclerView ...

  9. Android技术分享| 【Android 自定义View】多人视频通话控件

    [Android 自定义View]多人视频通话控件 *以上图片截自微信等待中界面 等待中界面 上图是微信多人视频通话时未接通的界面状态,可见每个人的 View 中大致需包含了以下元素. 头像 昵称 L ...

最新文章

  1. 模拟打字机,文字逐个出现
  2. 如何将低频内容应用转化为高频应用?
  3. 的union_C语言“隐秘的角落”——union没那么简单
  4. 设计模式:装饰模式(Decorator)
  5. 「递归」第6集 | 是鹅厂技术青年的模样
  6. javap(反汇编命令)详解
  7. “约见”面试官系列之常见面试题第二十篇之vuex得理解(建议收藏)
  8. Python集合(set)类型的操作
  9. 在stackoverflow上使用markdown
  10. Windows应用程序组成及编程步骤
  11. 【ASP.NET Web API教程】1 ASP.NET Web API入门
  12. 基于Java+SSM+MySQL的高校后勤综合管理系统
  13. (分享)视频压缩Free Video Compressor 汉化版/中文版【全网唯一】
  14. 恒天餐饮管理系统服务器代码,恒天餐饮管理软件使用教程.doc
  15. Unity SKFramework框架(二十四)、Avatar Controller 第三人称控制
  16. 如何在Docker容器中运行Docker [3种方法]
  17. python绘制时间节点事件图_在节点上绘制带有时间标签的图形
  18. AVAIO流学习总结
  19. 考研政治和数学的思维导图(2020)
  20. 学习笔记(10):C#急速入门-变量类型-数字类型

热门文章

  1. Flask中的HttpResponse Redirect 和Render
  2. 【Flask】Flask常用信号
  3. 跨浏览器检测某个节点是不是另一个节点的后代
  4. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...
  5. 28个Java常用的工具类
  6. Android 屏幕适配攻略(一)
  7. Django分页器和自定义分页器
  8. Python--网络编程-----传输层tcp/udp协议
  9. python-文件操作(1)
  10. 不一样的结果,不一样的人生