android插件式换肤,Android学习之插件化换肤
做好计划,定期复盘,感知责任,提高执行力换肤有好几种方式,今天主要来看看插件化换肤的相关知识,本文主要涉及到的知识点:
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学习之插件化换肤相关推荐
- 插件式架构设计实践一:插件式系统架构设计简介
本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...
- 从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用
标题:从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用. 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/1171 ...
- android 沉浸式开源库,Android沉浸式状态栏
关于Android沉浸式状态栏, 网上已经有很多开源库, 虽然开源库可以解决某些特定布局下的沉浸式状态栏问题, 但是遇到比较特殊的布局就无法解决了, 所以了解一下沉浸式状态栏如何实现是有必要的. 无论 ...
- android 沉浸式状态栏 19,Android 沉浸式状态栏 以及 伪沉浸式状态栏
小菜最近在调整页面状态栏的效果,主要包括沉浸式状态栏和伪沉浸状态栏(同事唠嗑给定义的玩的). 前段时间整理过一篇 Android 沉浸式状态栏的多种样式,现在小菜在稍微的补充一下,都是在日常应用中测试 ...
- android沉浸式状态栏白色,Android沉浸式状态栏
手把手教你实现 首选: android在4.4版本上添加了WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS 和 WindowManager.Layo ...
- android 流式布局官方,Android 流式布局
FlowLayoutManager 这是一个自定义实现流式布局的LayoutManager,配合RecyclerView使用,可实现标签效果:目前的问题是没有实现View的缓存,以后再补吧. 代码示例 ...
- Android沉浸式模式状态栏(二)
其实说到沉浸式状态栏这个名字,真不知道这种叫法是谁先发起的.因为Android官方从来没有给出过沉浸式状态栏这样的命名,只有沉浸式模式(Immersive Mode)这种说法.而有些人在没有完全了解清 ...
- Android 沉浸式模式
郭霖的专栏 每当你在感叹,如果有这样一个东西就好了的时候,请注意,其实这是你的机会 Android状态栏微技巧,带你真正理解沉浸式模式 目录(?)[+] 什么是沉浸式 隐藏状态栏 隐藏导航栏 真正的沉 ...
- Android沉浸式模式
转载至:http://blog.csdn.net/guolin_blog/article/details/51763825 什么是沉浸式? 根据百度百科上的定义,沉浸式就是要给用户提供完全沉浸的体验, ...
- 高大上的Android沉浸式状态栏?
背景 之前做过Android沉浸式状态栏的相关需求,但是一直忙于工作,没时间系统的整理下沉浸式相关的知识,所以今天抽出时间,写一篇 Android沉浸式状态栏的文章. 何为沉浸式 沉浸式就是要给用户提 ...
最新文章
- Java自然语言处理
- 5.3.1 TCP协议特点和TCP报文段格式
- LeetCode Majority Element II(Moore Voting Algorithm即Majority Voting Algorithm)
- wps怎么投递简历发到boss直聘_BOSS直聘情色招聘:洗脑传销广告漫天飞,还陷虚假招聘...
- boost::log模块实现多线程异步日志记录示例
- mysql node null_node-mysql中防止SQL注入的方法总结
- 微信开发学习日记(一):快速阅读5本书,掌握整体背景
- 全员学习低代码,一汽大众领跑数智化转型背后的秘密
- Protobuf3教程
- easyExcel实现Excel导出功能
- 伪指令endp告诉汇编程序_第2章 指令系统及汇编语言程序设计 题库和答案
- 201509-2-日期计算
- 分析:微软最终将赢得平板电脑市场的5个理由
- git stash 和还原某个文件版本
- soapui使用教程2-属性与脚本
- ArcGIS Pro中的回归分析浅析(下)地理加权回归工具(GWR)使用小结
- 2799元即可畅享12GB+256GB超大存储,荣耀60 SE新版本正式发布
- 万圣节html代码大全,《方舟 生存进化》万圣节代码大全一览
- CE修改器修改游戏数据实例
- c语言输出字符太阳,〖作业〗 C语言程序设计
热门文章
- 启明云端分享|乐鑫 ESP-NOW 无线通信方案主要特点、应用以及NOW一对一模式下通信速率
- android sha1是签名么,Android获取SHA1和MD5签名
- python链表翻转_Python数据结构之旋转链表
- 均值归一化_超越BN和GN!谷歌提出新的归一化层:FRN
- LIN总线接口静电保护专用器件:DW24DLC-B-S和DW24D-B-S
- java模块是什么6_Java 9 揭秘(6. 封装模块)
- 百度Create2021:百度地图日均位置服务请求次数突破1300亿
- 实时音频抗弱网技术揭秘
- php 验证微信token_php之微信公众号验证token获取access_token
- wifi分析仪怎么看哪个信道好_游戏工作室用什么路由器好?合理选择组建手机工作室网络...