- 浏览: 138444 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
python135:
...
Android自学笔记:分析onXXX事件监听器中的两个参数position和id -
gsp100:
不错,讲得真详细,谢谢了。
Android自学笔记:组件生命周期 -
r8HZGEmq:
LZ,刚开始学的时候就想到看源码了,大牛啊
Android自学笔记:Android2.3源码下载(针对Windows环境) -
YJ198910:
分析得不错,有图有真相呀
Android自学笔记:Tab控件源码剖析 -
zhongyuanceshi:
对象在使用前一定要先定义
Android自学笔记:开发常见问题总结
此篇主要以画图的方式剖析Tab控件的使用方式和实现原理,以便对Tab控件有更深的理解和掌握。其实主要由于我的文笔太次,因此以图代字,不是有那么一句话么:一图胜千言;这种写作方式对技术文章来说,最为合适不过了。要有图,要有文字;要有火锅,要有美屡(这个不是错别字,有人能看懂)~~~
一、Tab初印象
看图中画的框和椭圆,并对照着右边的文字说明,尽量看懂图中的包含关系。
首先非常感谢 icoo1985 的指正,下面图中紫色框代表着是应用程序的范畴,也就是Acitivty,而不包含系统的状态栏。
二、Tab相关类的介绍及它们之间的关系
在这一小节里,继续以图解的方式针对上一节中描述的包含关系和Tab构建过程进行阐述。
1.TabActivity
2.TabHost
3.TabHost.TabSpec
TabSpec主要负责去生成所需要添加进TabWidget和FrameLayout 布局当中的View,但是TabSpec不会直接与它们两个进行协作,而是只与TobHost来完成这一组装过程。按我的理解这个像是一个MVC模型,TabHost是控制器,TabSpec是模型,TabWidget和FrameLayout是视图展示层。
下面两幅图是组装的过程展示,整体过程均在TabHost.addTab()完成。
组装Indicator
组装Content
三、剖析Tab控件的源码实现
1.TabHost
在第二节提到过一个方法setup (LocalActivityManager), 按照API文档上所说,仅在以Intent方式构建TabSpec时,才要显示调用这个方法,前提是你未继承TabActivity;换个简单的说法,继承了TabActivity,我们就不需要显式地调用这个方法。
其实在setup (LocalActivityManager)版本中调用了它的重载版本setup(),也就是说真正的初始化工作是由setup来完成的。
两者有个共特点就是一般都不会显示的调用它们,当它们不是以getTabHost()方式来创建的或者说就根本没继承TabActivity的话,则需要显示调用。比如下面的代码示例:
造成这种繁琐细节的主要原因是在于继承与不继承TabActivity。那么TabActivity已经为我们完成了这么的繁琐工作,那我们为什么不领这个情呢?
2.TabHost.TabSpec
在第二节中提到了TabHost.TabSpec的用途,就是用来构建View的,并只与TabHost打交道。它负责构建两种View,一个是indicator view,另一个则是content view。观其源码,很容易地看出来针对这两种View,都采用了策略模式。
从实际用途的角度来考虑,创建Tab控件有共三种方式,这三种方式就对应着content view的三种策略,那么就先介绍它吧。
我不得不感叹TabHost.TabSpec中的策略模式设计得如此巧妙,仅仅通过重载方法就能够自由切换不同策略来构建View,继续往下看,我们回到TabHost. setCurrentTab(int index) 方法上,
接下来我们看下indicator策略,如下:
通过观察,indicator view策略与content view策略如出一辙,但后者更为实用一些。
我们回到TabHost.addTab()方法上,
四、总结
经过一番分析,可以看出Tab控件是由多个控件组合而成的,每个控件各司其职,共同完成整体上的功能。
个人感觉到分析的还是不太成熟,比较肤浅,思考的不够细致,怎么说呢,就是太感性了。今后会在分析问题上再多多下功夫,多多读源码,挖掘那些隐藏在表象之后的本质。
哦 这个我还真没深入研究过呢,我回头去好好看一下;因为我也是自学的,有的东西也是靠着其它领域的经验推断出来的,惭愧惭愧- -
一、Tab初印象
看图中画的框和椭圆,并对照着右边的文字说明,尽量看懂图中的包含关系。
首先非常感谢 icoo1985 的指正,下面图中紫色框代表着是应用程序的范畴,也就是Acitivty,而不包含系统的状态栏。
二、Tab相关类的介绍及它们之间的关系
在这一小节里,继续以图解的方式针对上一节中描述的包含关系和Tab构建过程进行阐述。
1.TabActivity
2.TabHost
3.TabHost.TabSpec
TabSpec主要负责去生成所需要添加进TabWidget和FrameLayout 布局当中的View,但是TabSpec不会直接与它们两个进行协作,而是只与TobHost来完成这一组装过程。按我的理解这个像是一个MVC模型,TabHost是控制器,TabSpec是模型,TabWidget和FrameLayout是视图展示层。
下面两幅图是组装的过程展示,整体过程均在TabHost.addTab()完成。
组装Indicator
组装Content
三、剖析Tab控件的源码实现
1.TabHost
在第二节提到过一个方法setup (LocalActivityManager), 按照API文档上所说,仅在以Intent方式构建TabSpec时,才要显示调用这个方法,前提是你未继承TabActivity;换个简单的说法,继承了TabActivity,我们就不需要显式地调用这个方法。
其实在setup (LocalActivityManager)版本中调用了它的重载版本setup(),也就是说真正的初始化工作是由setup来完成的。
两者有个共特点就是一般都不会显示的调用它们,当它们不是以getTabHost()方式来创建的或者说就根本没继承TabActivity的话,则需要显示调用。比如下面的代码示例:
TabHost mTabHost = (TabHost)findViewById(R.id.tabhost); mTabHost.setup();//或者setup (getLocalActivityManager()); mTabHost.addTab(…);
造成这种繁琐细节的主要原因是在于继承与不继承TabActivity。那么TabActivity已经为我们完成了这么的繁琐工作,那我们为什么不领这个情呢?
2.TabHost.TabSpec
在第二节中提到了TabHost.TabSpec的用途,就是用来构建View的,并只与TabHost打交道。它负责构建两种View,一个是indicator view,另一个则是content view。观其源码,很容易地看出来针对这两种View,都采用了策略模式。
从实际用途的角度来考虑,创建Tab控件有共三种方式,这三种方式就对应着content view的三种策略,那么就先介绍它吧。
//TabHost.TabSpec 部分源码 //content view 构建策略引用 private ContentStrategy mContentStrategy; //通过资源ID构建View public TabSpec setContent(int viewId) { //该策略直截了当地调用findViewById()方法返回指定的视图 mContentStrategy = new ViewIdContentStrategy(viewId); return this; } //通过资源Intent构建View public TabSpec setContent(Intent intent) { //该策略LocalActivityManager.startActivity(String tabName, Intent intent)方法返回的Window,并通过Window的getDecorView() 返回最终的视图。 mContentStrategy = new IntentContentStrategy(mTag, intent); return this; } //通过资源TabContentFactory构建View,它可以让你自由定制View public TabSpec setContent(TabContentFactory contentFactory) { // FactoryContentStrategy,其内部维护着一个TabContentFactory引用,并调用createTabContent(tagName)方法返回定制化的视图。 // 这个地方淋漓尽致地诠释了那句耳熟能详的名言,“将具体实现延迟到子类”,现在已经深有感触了。 // 就拿这个例子来说,一开始不要想模式,先根据业务需求来考虑,这个content view会跟根据indicator而变化,所以要做一些if else的处理;为了考虑代码的可维护性和健壮性,代码写的一定要优雅,慢慢地慢慢地就重构成非常满意的效果了,一看,嘿!这不是工厂模式么。 // 还有另外一种思考方式:当具备了一定的编码经验和设计经验之后,遇到该做活的地方一定要有一个意识,就好比提取出一个方法,我往这个方法传递各种参数已达到灵活的目的,慢慢地培养这种意识,代码就会越写越舒服了。 mContentStrategy = new FactoryContentStrategy(mTag, contentFactory); return this; }
我不得不感叹TabHost.TabSpec中的策略模式设计得如此巧妙,仅仅通过重载方法就能够自由切换不同策略来构建View,继续往下看,我们回到TabHost. setCurrentTab(int index) 方法上,
// 仅用一行代码就获取了content view,非常优雅。 // mCurrentView是TabHost的成员变量,意指当前的content view。 // spec是通过index获取到的TabHost.Tabspec。 // mContentStrategy就是上面看到的策略接口引用。 // spec.mContentStrategy内部类的特性。 mCurrentView = spec.mContentStrategy.getContentView();
接下来我们看下indicator策略,如下:
//TabHost.TabSpec 部分源码 //indicator view 构建策略引用 private IndicatorStrategy mIndicatorStrategy; //设置了indicator名,直接调用了TextView.setText() public TabSpec setIndicator(CharSequence label) { mIndicatorStrategy = new LabelIndicatorStrategy(label); return this; } //设置了indicator名和indicator图片,直接调用了TextView.setText()和ImageView. setImageDrawable(),图片是icon类型的。 public TabSpec setIndicator(CharSequence label, Drawable icon) { mIndicatorStrategy = new LabelAndIconIndicatorStrategy(label, icon); return this; } //设置定制化的indicator view,API没有明确说明个方法,而只提到了上面的两个策略,不过定制view的思想还是值得提倡的。 public TabSpec setIndicator(View view) { mIndicatorStrategy = new ViewIndicatorStrategy(view); return this; }
通过观察,indicator view策略与content view策略如出一辙,但后者更为实用一些。
我们回到TabHost.addTab()方法上,
//也是仅用一行代码完成了获取indicator view的操作。 //由此看出来,学习设计模式固然重要,但写出优雅的代码势在必行! View tabIndicator = tabSpec.mIndicatorStrategy.createIndicatorView();
四、总结
经过一番分析,可以看出Tab控件是由多个控件组合而成的,每个控件各司其职,共同完成整体上的功能。
个人感觉到分析的还是不太成熟,比较肤浅,思考的不够细致,怎么说呢,就是太感性了。今后会在分析问题上再多多下功夫,多多读源码,挖掘那些隐藏在表象之后的本质。
评论
5 楼
YJ198910
2012-11-01
分析得不错,有图有真相呀
4 楼
zhongyuanceshi
2012-05-28
楼主强呀, ,请问,每个spec的title和icon是放在哪里?是不是每个app的重新赋值给title和icon,是哪个函数设置的
3 楼
深夜未眠
2011-03-25
icoo1985 写道
tab的那张图里,紫色的框应该不包括系统的状态栏,应该是从Application那开始吧,博主的图画错了
哦 这个我还真没深入研究过呢,我回头去好好看一下;因为我也是自学的,有的东西也是靠着其它领域的经验推断出来的,惭愧惭愧- -
2 楼
icoo1985
2011-03-25
tab的那张图里,紫色的框应该不包括系统的状态栏,应该是从Application那开始吧,博主的图画错了
1 楼
renpeng301
2011-03-03
给力啊···
发表评论
-
Android自学笔记:Tasks and Back Stack原理
2011-04-05 23:50 7961一、参考文章 原文地址:Tasks and B ... -
Android自学笔记(番外篇):全面搭建Linux环境(八)——AOSP参与者工作流程图说明
2011-03-31 23:23 3879------------------------------- ... -
Android自学笔记(番外篇):全面搭建Linux环境(七)——JDK的安装与配置(手动版)
2011-03-30 23:18 3271------------------------------- ... -
Android自学笔记(番外篇):全面搭建Linux环境(六)——Android的安装与配置及2.3源码下载
2011-03-25 20:05 4423------------------------------- ... -
Android自学笔记(番外篇):全面搭建Linux环境(五)——Eclipse Helios(3.6.2)的安装与配置(零配置版)
2011-03-23 22:39 4834------------------------------- ... -
Android自学笔记(番外篇):全面搭建Linux环境(四)——JDK的安装与卸载(零配置版)
2011-03-21 10:58 3743------------------------------- ... -
Android自学笔记(番外篇):全面搭建Linux环境(三)——Ubuntu10.04(LTS)的安装与配置
2011-03-20 11:00 3453---------------- ... -
Android自学笔记(番外篇):全面搭建Linux环境(二)——VMware Workstation7.1.3的安装
2011-03-19 14:42 3473------------------------------- ... -
Android自学笔记(番外篇):全面搭建Linux环境(一)——前期准备工作
2011-03-19 12:41 2528本系列教程 ... -
Android自学笔记:开发常见问题总结
2011-02-22 08:31 13871.获取界面元件值时,不要忘了是要在事件监听器里面获取的。 原 ... -
Android自学笔记:分析onXXX事件监听器中的两个参数position和id
2011-01-30 09:35 11575Android API中有部分事件监听器的方法 ... -
Android自学笔记:Android2.3源码下载(针对Windows环境)
2011-01-27 08:36 10279我最近在自学Android,当遇到问题时也只能 ... -
Android学习笔记:怎样去测试?
2011-01-20 11:41 1369我们作为Android程序员,知道怎样去测试与 ... -
Android自学笔记:组件生命周期
2011-01-19 11:45 4230Android应用程序组件中有一个生命周期,贯 ... -
Android自学笔记:进程和线程
2011-01-18 11:39 1349一、进程(Processes) ... -
Android自学笔记:应用程序组件
2011-01-17 08:45 1508一、四个组件类型 Android中有四个重要的 ... -
Android自学笔记:架构体系
2011-01-14 17:18 21491.Android本身是一套软件堆栈(或称为软 ... -
Android自学笔记:应用程序基本原理
2011-01-14 08:58 22691.Android应用程序是要用Java来开发 ...
相关推荐
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、本项目仅用作交流学习参考,请切勿用于商业用途。
DATA: 可供参考的微博评论数据。 详见 /DATA/weibocommennts.csv CODE: apiGetSheet.py 调用百度API 获得 微博评论对应 文字的 情感得分, sheetGetvalue.py 根据情感得分进行标准化,获得实际倾向。
管理员 管理员信息管理 负责人管理 员工信息管理 公告信息管理 小型车收费标准设置(元/每公里) 大卡车收费标准设置(元/吨公里) 收费信息统计,统计小车和卡车收费,按月统计 负责人 个人资料修改 公告查看 小车收费统计(某员工某月统计) 大卡车收费统计(某员工某月统计) 员工 个人资料修改 公告查看 小型车收费登记(车牌号,车辆照片,行使公里数,收费金额,收费日期,收费员,按公里数可以自动计算费用 收费金额=收费标准*公里数) 大卡车金额设置(每吨/元)(车牌号,车辆照片,行使公里数,吨,收费金额,收费日期,收费员, 收费金额=收费标准*吨*公里数 ) 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
本套zabbix是基于6.0版本部署,内容涵盖zabbix的简介、zabbix server安装、zabbix基本概念、快速入门、zabbix进阶、zabbix实践、zabbix的高级监控使用。 =======知识领域 网络监控:监控网络设备、服务器和应用程序的运行状态。 系统监控:监控服务器性能,如CPU使用率、内存使用情况、网络流量等。 数据库监控:监控数据库性能和状态。 应用程序监控:监控应用程序的运行情况和性能指标。 云监控:监控云服务和虚拟机的健康状况
商品库存管理系统课程设计报告.docx
嘉兴智能卫浴项目建议书.docx
Java系统源码+夕阳红公寓管理系统 内容概要: 本资源包含了完整的Java前后端源码及说明文档,适用于想要快速搭建并部署Java Web应用程序的开发者、学习者。 技术栈: 后端:Java生态系统,包含Spring Boot、Shiro、MyBatis等,数据库使用Mysql 前端:Vue、Bootstrap、Jquery等 适用场景示例: 1、毕业生希望快速启动一个新的Java Web应用程序。 2、团队寻找一个稳定的模板来加速产品开发周期。 3、教育机构或个人学习者用于教学目的或自学练习。 4、创业公司需要一个可以立即投入使用的MVP(最小可行产品)。
(1)用户管理: 用户注册:新用户注册 用户登录:新用户登录 找回密码:忘记密码找回密码 用户评论:发表对新闻的评论 (2)管理员管理: 系统账号管理:管理员管理系统现有账号,进行删除停用等操作 系统公告管理:系统公告的发布和删除 新闻栏目管理:新闻栏目的新增和删除 ...
Java系统源码+计算机学院校友网 内容概要: 本资源包含了完整的Java前后端源码及说明文档,适用于想要快速搭建并部署Java Web应用程序的开发者、学习者。 技术栈: 后端:Java生态系统,包含Spring Boot、Shiro、MyBatis等,数据库使用Mysql 前端:Vue、Bootstrap、Jquery等 适用场景示例: 1、毕业生希望快速启动一个新的Java Web应用程序。 2、团队寻找一个稳定的模板来加速产品开发周期。 3、教育机构或个人学习者用于教学目的或自学练习。 4、创业公司需要一个可以立即投入使用的MVP(最小可行产品)。
四六级报名管理系统.pdf
C语言PTA-数组答案代码合集(湖工1-50)
YOLOv8 安全背心识别项目代码 项目详细介绍请看链接: https://blog.csdn.net/qq_53332949/article/details/144543625 数据集详细介绍请看:https://blog.csdn.net/qq_53332949/article/details/141503406 数据集下载请看:https://download.csdn.net/download/qq_53332949/89711610?spm=1001.2101.3001.9500 按文件中requirements.txt文件配置环境即可使用。
后后勤智能1.。1. 1. 1. 管理系统-...pdf后勤智能1.。1. 1. 管理系统-...pdf后勤智能1.。1. 管理系统-...pdf后勤智能1.。管理系统-...pdf勤智能管理系统-...pdf
瓶子、塑料袋检测70-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rarset1(拍摄照片)-V15 2023-08-09 3:43 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括133张图像。 汽车以可可格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 应用以下扩展来创建每个源图像的3个版本: * -24和+24度之间的随机旋转
管理员 个人密码修改 项目经理管理 员工管理(调试员,解决方案人员) 日志管理(用户登录日志) 系统设置 项目经理 个人信息管理,修改 项目模块管理 按项目分配调试员 调试员 个人信息管理,修改 BUG信息管理(各个环节的跟踪信息录入) 查看解决方案 解决方案人员 个人信息管理,修改 查看缺陷信息 提出解决方案 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
电路电压检测14-YOLO(v5至v9)、COCO、CreateML、Paligemma、VOC数据集合集.rar电路电压-V2释放 ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 它包括132张图像。 电路电压以可可格式注释。 将以下预处理应用于每个图像: 没有应用图像增强技术。
项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!
系统实现: 用户功能模块:用户点击进入到系统操作界面,可以对主页、个人中心、我的收藏管理、订单管理等功能模块,我的收藏管理:通过列表可以获取用户ID、收藏ID、表名、收藏名称、收藏图片信息并进行修改操作 管理员功能模块:管理员通过用户名和密码填写完成后进行登录。管理员登录成功后进入到系统操作界面,可以对主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等功能模块进行相对应操作。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。