android layout 替换,LayoutInflater 后记--替换系统控件
之前记录了自己走通 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 后记--替换系统控件相关推荐
- android layout 对齐,安卓利用TableLayout实现控件列对齐
背景 有时以列表形式展示控件时,需要保持上下控件对齐. 效果图 "用户账号:"和"密码:"居左或居右对齐,同时后面的输入框也对齐. 实现方案 利用TableLa ...
- Android游戏开发系统控件-Dialog
Android游戏开发系统控件-Dialog Dialog(对话框)在Android应用开发中经常用到,下面是学习<Android游戏编程从零开始>一书,关于Dialog的初步学习. 创建 ...
- Android游戏开发系统控件-CheckBox
Android游戏开发系统控件-CheckBox 2012/5/11 星期五 CheckBox是Android系统最普通的UI控件,继承了Button按钮 下面通过一个实例来学习 作者:wwj 功能: ...
- Android UI 统一修改Button控件的样式,以及其它系统控件的默认样式
先介绍下修改原理:首先打开位于android.widget包下面的Button.java文件,这里有一句关键的代码如下: public Button(Context context, Attribut ...
- Android系统控件获取自定义属性
我们如果想在ImageView,Button,TextView等系统控件中在XML中配置自定义属性该如何实现呢?例如我们有一个scrollView,在ScrollView里面有上述的一些控件的自定义属 ...
- Android基础学习(二)—— 常用控件
TextView 显示文本内容 Button 按钮 EditText 输入框 ImageView 显示图片 ProgressBar 进度条 ToolBar 自定义标题栏 AlertDialog 对话框 ...
- php支付密码控件,Android高仿微信支付密码输入控件实例代码
这篇文章主要为大家详细介绍了Android高仿微信支付密码输入控件的具体实现代码,供大家参考,具体内容如下 像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现 ...
- Android横向滑动加载更多的控件的实现---HorizontalScrollSlideView
Android横向滑动加载更多的控件的实现-HorizontalScrollSlideView 需求 之前公司业务要求做一个横向滑动的,可以加载更多的控件,第一时间想到的就是 RecyclerView ...
- Android技术分享| 【Android 自定义View】多人视频通话控件
[Android 自定义View]多人视频通话控件 *以上图片截自微信等待中界面 等待中界面 上图是微信多人视频通话时未接通的界面状态,可见每个人的 View 中大致需包含了以下元素. 头像 昵称 L ...
最新文章
- 模拟打字机,文字逐个出现
- 如何将低频内容应用转化为高频应用?
- 的union_C语言“隐秘的角落”——union没那么简单
- 设计模式:装饰模式(Decorator)
- 「递归」第6集 | 是鹅厂技术青年的模样
- javap(反汇编命令)详解
- “约见”面试官系列之常见面试题第二十篇之vuex得理解(建议收藏)
- Python集合(set)类型的操作
- 在stackoverflow上使用markdown
- Windows应用程序组成及编程步骤
- 【ASP.NET Web API教程】1 ASP.NET Web API入门
- 基于Java+SSM+MySQL的高校后勤综合管理系统
- (分享)视频压缩Free Video Compressor 汉化版/中文版【全网唯一】
- 恒天餐饮管理系统服务器代码,恒天餐饮管理软件使用教程.doc
- Unity SKFramework框架(二十四)、Avatar Controller 第三人称控制
- 如何在Docker容器中运行Docker [3种方法]
- python绘制时间节点事件图_在节点上绘制带有时间标签的图形
- AVAIO流学习总结
- 考研政治和数学的思维导图(2020)
- 学习笔记(10):C#急速入门-变量类型-数字类型
热门文章
- Flask中的HttpResponse Redirect 和Render
- 【Flask】Flask常用信号
- 跨浏览器检测某个节点是不是另一个节点的后代
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...
- 28个Java常用的工具类
- Android 屏幕适配攻略(一)
- Django分页器和自定义分页器
- Python--网络编程-----传输层tcp/udp协议
- python-文件操作(1)
- 不一样的结果,不一样的人生