做好计划,定期复盘,感知责任,提高执行力换肤有好几种方式,今天主要来看看插件化换肤的相关知识,本文主要涉及到的知识点:

setContentView实现源码分析、LayoutInflater中的inflate解析、

Observer与Observable、 Application的onCreate的妙用

1.setContentView实现源码分析

setContentView源码分析流程.png上图为setContentView的一个调用流程,具体可以参考源码做详细分析

布局层级结构.png2.LayoutInflater中的inflate解析

2.1 对于inflate其主要做以下说明:

public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {

//此处代码省略

}

主要是一般在使用是会正常传入root参数,并且attachToRoot为false,如果attachToRoot为ture,有可能会出现设置layout_width参数生效问题(此部分可作为后面的一个补充点做说明)。

另外,会调用createViewFromTag对XML布局进行解析,下面会介绍个这个接口;

2.2 createViewFromTag解析:

View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,

boolean ignoreThemeAttr) {

if (name.equals("view")) {

name = attrs.getAttributeValue(null, "class");

}

// Apply a theme wrapper, if allowed and one is specified.

if (!ignoreThemeAttr) {

final TypedArray ta = context.obtainStyledAttributes(attrs, ATTRS_THEME);

final int themeResId = ta.getResourceId(0, 0);

if (themeResId != 0) {

context = new ContextThemeWrapper(context, themeResId);

}

ta.recycle();

}

if (name.equals(TAG_1995)) {

// Let's party like it's 1995!

return new BlinkLayout(context, attrs);

}

try {

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;

}

if (view == null && mPrivateFactory != null) {

view = mPrivateFactory.onCreateView(parent, name, context, attrs);

}

if (view == null) {

final Object lastContext = mConstructorArgs[0];

mConstructorArgs[0] = context;

try {

if (-1 == name.indexOf('.')) {

view = onCreateView(parent, name, attrs);

} else {

view = createView(name, null, attrs);

}

} finally {

mConstructorArgs[0] = lastContext;

}

}

return view;

} catch (InflateException e) {

throw e;

} catch (ClassNotFoundException e) {

final InflateException ie = new InflateException(attrs.getPositionDescription()

+ ": Error inflating class " + name, e);

ie.setStackTrace(EMPTY_STACK_TRACE);

throw ie;

} catch (Exception e) {

final InflateException ie = new InflateException(attrs.getPositionDescription()

+ ": Error inflating class " + name, e);

ie.setStackTrace(EMPTY_STACK_TRACE);

throw ie;

}

}

从代码看首先会判断mFactory2 ,mFactory 来进行createView即创建view,这两个可谓是作用很大会用来做拦截view的创建过程,从而可以做本文将的重点换肤。心静1秒。。。

3. Observer与Observable

Observer作为被观察者,在换肤中可以用来检测每个Activity的换肤需求,而用来接管系统的View的生产过程的类(SkinLayoutInflaterFactory)即可作为观察者,当当前Activity需要换肤时,通过setChanged()和notifyObservers接口即可通知观察类通过update() 接口进行更新换肤;

4. Application的onCreate的妙用

Application的onCreate()方法调用是早于Anctivity的onCreate(),此点在换肤中的应用是Factory的设置,由自定义Factory来接管,以及会走后面的onCreatView进行新皮肤的加载;另外,比如Gride在第一次调用时会出现加载图片很慢的情况,因为在第一次是Gride会做一些初始化的动作,所以如果出现这种问题,可以考虑在Application的onCreate()中简单做一个Gride的一个初始化init,可以优化此问题。。。。

android插件式换肤,Android学习之插件化换肤相关推荐

  1. 插件式架构设计实践一:插件式系统架构设计简介

    本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...

  2. 从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用

    标题:从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用. 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/1171 ...

  3. android 沉浸式开源库,Android沉浸式状态栏

    关于Android沉浸式状态栏, 网上已经有很多开源库, 虽然开源库可以解决某些特定布局下的沉浸式状态栏问题, 但是遇到比较特殊的布局就无法解决了, 所以了解一下沉浸式状态栏如何实现是有必要的. 无论 ...

  4. android 沉浸式状态栏 19,Android 沉浸式状态栏 以及 伪沉浸式状态栏

    小菜最近在调整页面状态栏的效果,主要包括沉浸式状态栏和伪沉浸状态栏(同事唠嗑给定义的玩的). 前段时间整理过一篇 Android 沉浸式状态栏的多种样式,现在小菜在稍微的补充一下,都是在日常应用中测试 ...

  5. android沉浸式状态栏白色,Android沉浸式状态栏

    手把手教你实现 首选: android在4.4版本上添加了WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS 和 WindowManager.Layo ...

  6. android 流式布局官方,Android 流式布局

    FlowLayoutManager 这是一个自定义实现流式布局的LayoutManager,配合RecyclerView使用,可实现标签效果:目前的问题是没有实现View的缓存,以后再补吧. 代码示例 ...

  7. Android沉浸式模式状态栏(二)

    其实说到沉浸式状态栏这个名字,真不知道这种叫法是谁先发起的.因为Android官方从来没有给出过沉浸式状态栏这样的命名,只有沉浸式模式(Immersive Mode)这种说法.而有些人在没有完全了解清 ...

  8. Android 沉浸式模式

    郭霖的专栏 每当你在感叹,如果有这样一个东西就好了的时候,请注意,其实这是你的机会 Android状态栏微技巧,带你真正理解沉浸式模式 目录(?)[+] 什么是沉浸式 隐藏状态栏 隐藏导航栏 真正的沉 ...

  9. Android沉浸式模式

    转载至:http://blog.csdn.net/guolin_blog/article/details/51763825 什么是沉浸式? 根据百度百科上的定义,沉浸式就是要给用户提供完全沉浸的体验, ...

  10. 高大上的Android沉浸式状态栏?

    背景 之前做过Android沉浸式状态栏的相关需求,但是一直忙于工作,没时间系统的整理下沉浸式相关的知识,所以今天抽出时间,写一篇 Android沉浸式状态栏的文章. 何为沉浸式 沉浸式就是要给用户提 ...

最新文章

  1. Java自然语言处理
  2. 5.3.1 TCP协议特点和TCP报文段格式
  3. LeetCode Majority Element II(Moore Voting Algorithm即Majority Voting Algorithm)
  4. wps怎么投递简历发到boss直聘_BOSS直聘情色招聘:洗脑传销广告漫天飞,还陷虚假招聘...
  5. boost::log模块实现多线程异步日志记录示例
  6. mysql node null_node-mysql中防止SQL注入的方法总结
  7. 微信开发学习日记(一):快速阅读5本书,掌握整体背景
  8. 全员学习低代码,一汽大众领跑数智化转型背后的秘密
  9. Protobuf3教程
  10. easyExcel实现Excel导出功能
  11. 伪指令endp告诉汇编程序_第2章 指令系统及汇编语言程序设计 题库和答案
  12. 201509-2-日期计算
  13. 分析:微软最终将赢得平板电脑市场的5个理由
  14. git stash 和还原某个文件版本
  15. soapui使用教程2-属性与脚本
  16. ArcGIS Pro中的回归分析浅析(下)地理加权回归工具(GWR)使用小结
  17. 2799元即可畅享12GB+256GB超大存储,荣耀60 SE新版本正式发布
  18. 万圣节html代码大全,《方舟 生存进化》万圣节代码大全一览
  19. CE修改器修改游戏数据实例
  20. c语言输出字符太阳,〖作业〗 C语言程序设计

热门文章

  1. 启明云端分享|乐鑫 ESP-NOW 无线通信方案主要特点、应用以及NOW一对一模式下通信速率
  2. android sha1是签名么,Android获取SHA1和MD5签名
  3. python链表翻转_Python数据结构之旋转链表
  4. 均值归一化_超越BN和GN!谷歌提出新的归一化层:FRN
  5. LIN总线接口静电保护专用器件:DW24DLC-B-S和DW24D-B-S
  6. java模块是什么6_Java 9 揭秘(6. 封装模块)
  7. 百度Create2021:百度地图日均位置服务请求次数突破1300亿
  8. 实时音频抗弱网技术揭秘
  9. php 验证微信token_php之微信公众号验证token获取access_token
  10. wifi分析仪怎么看哪个信道好_游戏工作室用什么路由器好?合理选择组建手机工作室网络...