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对象相关推荐

  1. python 绘图类_关于创建自定义绘图对象-python中的类,有很好的教程吗? - python...

    我想创建一个用于自定义绘图的对象类.我正在寻找有关如何创建自己的绘图对象的面向对象入门的好教程((可能仍在使用像matplotlib这样的库)? 例如. class myplot: def __ini ...

  2. cultureinfo 类 java_为国家,语言组合创建自定义CultureInfo

    我正在开发一个.net 4.5应用程序,需要多语言支持多文化等 . 以下是国家/语言的示例列表 俄罗斯/俄罗斯 比利时/法国 比利时/荷兰 对于上述所有内容,可以根据上述文化名称创建CultureIn ...

  3. Android官方开发文档Training系列课程中文版:创建自定义View之View的绘制

    原文地址:http://android.xsoftlab.net/training/custom-views/custom-drawing.html#draw 自定义View最重要的部分就是它的样子了 ...

  4. Android官方开发文档Training系列课程中文版:创建自定义View之View的创建

    原文地址:http://android.xsoftlab.net/training/custom-views/index.html 引言 Android框架含有大量的View类,这些类用来显示各式各样 ...

  5. linux创建自定义组件qt,QT中的元对象系统:创建自定义的QT类型

    原创文章,转载请注明出处,谢谢! 作者:清林,博客名:飞空静渡 QVariant可以表示QT中的大部分类型,它和pascal中的variant类型或c中的void类型有点相似,不过它的使用和c中的un ...

  6. [置顶] 深入浅出Javascript(三)创建自定义对象以及属性、方法

    怎么样创建一个对象? 利用Object创建自定义对象 JavaScript能够自定义对象来扩展程序的功能,不仅如此,它还能扩展JavaScript提供的内置对象,新增内置对象的属性或方法 例如下面代码 ...

  7. JavaScript实现创建自定义对象的常用方式总结

    2019独角兽企业重金招聘Python工程师标准>>> 1. 对象字面量方式 对象字面量方式是创建自定义对象的首选模式,简单方便. var per = { name:'zhangsa ...

  8. JS 创建自定义对象的方法

    工厂模式 优点:接受参数,可以无数次的调用这个函数,创建Person对象,而每次他都可以返回一个包含三个属性一个方法的对象. 缺点:虽然解决了创建多个相似对象的问题,但是没有解决对象识别的问题(即怎么 ...

  9. JavaScript学习笔记:创建自定义对象

    文章目录 一.利用构造函数模式创建自定义对象 二.采用原型模式创建自定义对象 三.采用混合模式创建自定义对象 四.采用动态原型模式创建自定义对象 一.利用构造函数模式创建自定义对象 使用构造函数可以创 ...

  10. STL 的 std::set 创建自定义结构体的对象,定义严格弱序的比较函数

    文章目录 正文 Ref 系列地址 简 述: 对于 STL 中 std::set 创建自定义结构体的对象,发现使用 "函数对象" 和 "定义普通函数 + decltype& ...

最新文章

  1. 【UGV】Mec 麦轮版小车结合角度传感器实现直线行走示例
  2. Java 集合系列(2): ArrayList源码深入解析和使用示例
  3. QT的QDesignerWidgetBoxInterface类的使用
  4. UE4学习-鼠标事件(按下、释放、物体抓取、计算重量、触发开门)
  5. centos5.8上安装git server
  6. element走马灯自动_详细element-ui的走马灯carousel轻松实现自适应全屏banner详细过程...
  7. Hibernate 修改数据
  8. G面经prepare: Straight Partition of A Deck of Cards
  9. Docker学习总结(60)——Docker-Compose 基础知识回顾总结
  10. python+selenium笔记(一):元素定位方法
  11. 面试题(Qt + 函数指针)
  12. 原创Android开发文章集合贴
  13. HttpClient读取数据乱码的解决方案
  14. 从mysql随机抽取数据_mysql随机抽取一定数量的记录实例讲解
  15. JAVA环境配置详细教程
  16. 网管软件的致命伤及其合理利用的小技巧(转)
  17. 字节跳动常见算法面试题top50整理
  18. eXosip注册函数与使用说明
  19. 服务器显卡驱动重装系统,GPU显卡驱动重装
  20. 信念就是一种观念对不对_思路决定出路 观念决定方向 性格决定命运 要改变命运 先确立信念...

热门文章

  1. git maven 一键部署_jenkins+git+maven搭建自动化部署项目环境
  2. 在linux中cd god,Linux基础/Linux基础和命令.md · kelekele/God-Of-BigData - Gitee.com
  3. 安装oracle创建的数据库实例,oracle创建数据库实例
  4. h5是什么 www.php.cn,html5是什么?html5有什么用?
  5. swagger2 配置访问路径_有了Swagger2 再也不用担心API文档的维护了
  6. nginx限制请求数(ngx_http_limit_req_module)模块
  7. 伸缩Kubernetes到2500个节点中遇到的问题和解决方法
  8. android 导出数据库文件
  9. BZOJ2330:[SCOI2011]糖果(差分约束)
  10. C#数组和list集合的区别