LayoutInflater拦截View创建,自定义Resource对象
2019独角兽企业重金招聘Python工程师标准>>>
场景:
1.统一设计Activity风格
2.加载外部资源,替换应用风格
3.不重启Activity的情况下,替换应用风格
4.应用使用系统默认View,开发者进行代码重构,想要增加view的功能,使用自定义View代替,却不想更改布局文件。例如:AppcomptActivity在factory使用新的View替换,实现风格的变换
原理:
1.拦截view创建
1.1创建自定义View
1.2穿件默认View,加载新的资源文件,设置View的属性
class SkinFactory implements LayoutInflater.Factory {private Context context;Resources resources;ArrayList<WeakReference<SkinAttr>> skinAttrs = new ArrayList<WeakReference<SkinAttr>>();public SkinFactory(Context context, Resources resources) {this.resources = resources;this.context = context;}@Overridepublic View onCreateView(String name, Context context, AttributeSet attrs) {
// 创建View-----------------------startView view = null;try {if (-1 == name.indexOf('.')) {if ("View".equals(name)) {view = LayoutInflater.from(context).createView(name,"android.view.", attrs);}if (view == null) {view = LayoutInflater.from(context).createView(name,"android.widget.", attrs);}if (view == null) {view = LayoutInflater.from(context).createView(name,"android.webkit.", attrs);}} else {view = LayoutInflater.from(context).createView(name, null,attrs);}} catch (Exception e) {e.printStackTrace();view = null;}
// 创建View-----------------------endif (view == null) {return null;}for (int i = 0; i < attrs.getAttributeCount(); i++) {String attributeName = attrs.getAttributeName(i);String attributeValue = attrs.getAttributeValue(i);TODO: 2/17/2017 find attr that can be change and set new attrif (resources != null)applyResource(resources, new SkinAttr(view, attributeName, attributeValue));}return view;}public void resotreDefault() {for (WeakReference<SkinAttr> skinAttrWeakReference : skinAttrs) {SkinAttr skinAttr = skinAttrWeakReference.get();if (skinAttr != null && skinAttr.getView() != null) {applyResource(context.getResources(), skinAttr);}}}public void applyResource(Resources resource, SkinAttr skinAttr) {}class SkinAttr {View view;String attributeName;String attributeValue;public SkinAttr(View view, String attributeName, String attributeValue) {this.view = view;this.attributeName = attributeName;this.attributeValue = attributeValue;}public String getAttributeName() {return attributeName;}public View getView() {return view;}public String getAttributeValue() {return attributeValue;}public String getAttributeValueType() {return attributeValue.split("/")[0];}public String getAttributeValueName() {return attributeValue.split("/")[1];}}
}
转载于:https://my.oschina.net/leonardtang/blog/840617
LayoutInflater拦截View创建,自定义Resource对象相关推荐
- python 绘图类_关于创建自定义绘图对象-python中的类,有很好的教程吗? - python...
我想创建一个用于自定义绘图的对象类.我正在寻找有关如何创建自己的绘图对象的面向对象入门的好教程((可能仍在使用像matplotlib这样的库)? 例如. class myplot: def __ini ...
- cultureinfo 类 java_为国家,语言组合创建自定义CultureInfo
我正在开发一个.net 4.5应用程序,需要多语言支持多文化等 . 以下是国家/语言的示例列表 俄罗斯/俄罗斯 比利时/法国 比利时/荷兰 对于上述所有内容,可以根据上述文化名称创建CultureIn ...
- Android官方开发文档Training系列课程中文版:创建自定义View之View的绘制
原文地址:http://android.xsoftlab.net/training/custom-views/custom-drawing.html#draw 自定义View最重要的部分就是它的样子了 ...
- Android官方开发文档Training系列课程中文版:创建自定义View之View的创建
原文地址:http://android.xsoftlab.net/training/custom-views/index.html 引言 Android框架含有大量的View类,这些类用来显示各式各样 ...
- linux创建自定义组件qt,QT中的元对象系统:创建自定义的QT类型
原创文章,转载请注明出处,谢谢! 作者:清林,博客名:飞空静渡 QVariant可以表示QT中的大部分类型,它和pascal中的variant类型或c中的void类型有点相似,不过它的使用和c中的un ...
- [置顶] 深入浅出Javascript(三)创建自定义对象以及属性、方法
怎么样创建一个对象? 利用Object创建自定义对象 JavaScript能够自定义对象来扩展程序的功能,不仅如此,它还能扩展JavaScript提供的内置对象,新增内置对象的属性或方法 例如下面代码 ...
- JavaScript实现创建自定义对象的常用方式总结
2019独角兽企业重金招聘Python工程师标准>>> 1. 对象字面量方式 对象字面量方式是创建自定义对象的首选模式,简单方便. var per = { name:'zhangsa ...
- JS 创建自定义对象的方法
工厂模式 优点:接受参数,可以无数次的调用这个函数,创建Person对象,而每次他都可以返回一个包含三个属性一个方法的对象. 缺点:虽然解决了创建多个相似对象的问题,但是没有解决对象识别的问题(即怎么 ...
- JavaScript学习笔记:创建自定义对象
文章目录 一.利用构造函数模式创建自定义对象 二.采用原型模式创建自定义对象 三.采用混合模式创建自定义对象 四.采用动态原型模式创建自定义对象 一.利用构造函数模式创建自定义对象 使用构造函数可以创 ...
- STL 的 std::set 创建自定义结构体的对象,定义严格弱序的比较函数
文章目录 正文 Ref 系列地址 简 述: 对于 STL 中 std::set 创建自定义结构体的对象,发现使用 "函数对象" 和 "定义普通函数 + decltype& ...
最新文章
- 【UGV】Mec 麦轮版小车结合角度传感器实现直线行走示例
- Java 集合系列(2): ArrayList源码深入解析和使用示例
- QT的QDesignerWidgetBoxInterface类的使用
- UE4学习-鼠标事件(按下、释放、物体抓取、计算重量、触发开门)
- centos5.8上安装git server
- element走马灯自动_详细element-ui的走马灯carousel轻松实现自适应全屏banner详细过程...
- Hibernate 修改数据
- G面经prepare: Straight Partition of A Deck of Cards
- Docker学习总结(60)——Docker-Compose 基础知识回顾总结
- python+selenium笔记(一):元素定位方法
- 面试题(Qt + 函数指针)
- 原创Android开发文章集合贴
- HttpClient读取数据乱码的解决方案
- 从mysql随机抽取数据_mysql随机抽取一定数量的记录实例讲解
- JAVA环境配置详细教程
- 网管软件的致命伤及其合理利用的小技巧(转)
- 字节跳动常见算法面试题top50整理
- eXosip注册函数与使用说明
- 服务器显卡驱动重装系统,GPU显卡驱动重装
- 信念就是一种观念对不对_思路决定出路 观念决定方向 性格决定命运 要改变命运 先确立信念...
热门文章
- git maven 一键部署_jenkins+git+maven搭建自动化部署项目环境
- 在linux中cd god,Linux基础/Linux基础和命令.md · kelekele/God-Of-BigData - Gitee.com
- 安装oracle创建的数据库实例,oracle创建数据库实例
- h5是什么 www.php.cn,html5是什么?html5有什么用?
- swagger2 配置访问路径_有了Swagger2 再也不用担心API文档的维护了
- nginx限制请求数(ngx_http_limit_req_module)模块
- 伸缩Kubernetes到2500个节点中遇到的问题和解决方法
- android 导出数据库文件
- BZOJ2330:[SCOI2011]糖果(差分约束)
- C#数组和list集合的区别