Android控件架构

1.什么是View?

View是Android中所有控件的基类。View是界面层的控件的一种抽象,它代表了一个控件。在Android中每个控件都会在界面中占得一块矩形的区域。在Android中控件被分为两类:View和ViewGroup。ViewGroup控件作为父控件可以包含多个View控件,并管理它包含的View控件。通过ViewGroup,整个界面上的控件形成了一个树形结构,这几件事我们常说的控件树,上层控件负责下层子控件的测量和绘制,并传递交互事件。

2.所谓的树结构

ViewGroup,顾名思义,它是控件组。但是,在Android的设计中,ViewGroup也是继承自View的,这也就意味着View本身就是可以是单个控件也可以是由多个控件组成的一组控件。通过这种关系就形成了View树的结构。-- Android开发艺术探索

3.findViewById()是如何找到元素的?

我们使用findViewById()方法,就是在控件树种以树的深度优先遍历来查找对应元素。在每个控件树的顶部都有一个ViewParent对象,它就是整棵树的控制核心,所有的交互管理事件都由它来统一调度和分配,从而可以对整个视图进行整体控制。

4.View树结构,和UI界面架构图

图来自《Android群英传》

View树结构&UI界面架构图.png

5.剖析UI界面架构图

正如图3.2所示,每个Activity都包含一个Window对象,在Android中Window对象通过由PhoneWindow 来实现。

PhoneWindow将一个DecorView设置为整个应用窗口的根View。

DecorView作为窗口界面的顶层视图,封装了一些窗口操作的通用方法。可以说,DecorView将要显示的具体内容呈现在了PhoneWindow上,这里面所有的View 监听事件,都通过WindowManagerService 来接收,并通过Activity对象来回调相应的onClickListener。

在显示上,一般情况下DecorView内部会包含一个垂直方向的LinearLayout,将屏幕分成两个部分,一个是TitleView,一个是ContentView,现在知道为啥子我们设置布局的时候是setContentView(R.layout.activity_main) 了吧。 这个我们非常亲密的布局——ContentView,它是一个ID为android.R.id.content的FrameLayout,我们的布局文件layout.activity_main就是设置在这样一个FrameLayout里面的。

知道了上面的这些之后,介绍一下标准视图树。

6.almost标准视图树

为什么是almost标准视图树,因为Android版本对AndroidUI会变动啊,可能某个时候这就不适用了。

almost标准视图树.png

上面的就是最常用的布局,上面TitleBar/ActionBar(这里先不说ToolBar的事),下面Content,(在TitleBar的情况下)如果用户使用requestWindowFeature(Window.FEATURE_NO_TITLE)设置全屏,那么就只剩下Content了。并且requestWindowFeature(Window.FEATURE_NO_TITLE)要早setContentView之前调用,为啥?因为Content要占用TitleBar的位置。

而在代码中,当程序在onCreate()中调用setContentView()方法后,ActivityManagerService会回调onResume()方法,此时系统才会把整个DecorView添加到PhoneWindow中,并让内容显示出来,从而完成界面的绘制。

8.补充知识:TitleBar和ActionBar的区别

因为之前的内容说道了TitleBar,TitleBar是个老旧的东西,所以这两年才学Android的朋友可能没听到这玩意。下面补充一下TitleBar的常用的问题。

主要是说说隐藏actionBar和titileBar的问题

隐藏ActionBar和TitleBar方式很多,想了解的看这位网友写的blog

先来看个例子:

public class MainActivity extends AppCompatActivity {

Button mBtn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

}

}

运行之后发现,上面的"TitleBar"没有消失,是不是很生气,是不是想骂我骗子。客官不可以,您息怒。听我娓娓道来。

我们来看看ActionBar来自何方。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

getSupportActionBar().hide();

// requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

}

// 我们command+点击 getSupportActionBar(),发现这个方法是AppCompatActivity类中的。

// 同样的方式你会发现requestWindowFeature()是Activity类的。

// 所以,现在你是不是该明白点什么。

下面说TitleBar与ActionBar的区别:

i. 两者activity继承的类不一样,actionbar继承AppCompatActivity, titlebar继承Activity,如果搞混了继承的类的话,会导致上述隐藏相应控件失效。

ii. TitleBar,也就是标题栏,它紧挨在状态栏的下面,正常情况下它的布局和主题样式都是使用系统定义好的,且默认情况下只显示图标和文本。

iii. ActionBar,也就是操作栏,它是Android3.0以后引入SDK的,通过它去取代之前标题栏,它和标题栏一样紧挨状态栏的下面,它可以放入按钮,或下拉式的按钮.可以有文字,logo等信息.还可以设置返回按钮等信息。

参考资料:

developer.android.com

Android群英传

Android开发艺术探索

下一篇文章准备写Android世界的坐标系

android让一个控件跟上面控件对其,学个明白--Android控件架构相关推荐

  1. Android自定义一个播放器控件

    介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...

  2. Android中自定义农历日历,CalendarView Android 上一个优雅、万能自定义 UI、性能高效的日历控件,热插拔!热插拔!热插拔!重要的事 @codeKK Android开源站...

    An elegant CalendarView on Android platform. Freely draw UI with canvas, fast.efficient and low memo ...

  3. Android控件人生第一站,小红书任意拖拽标签控件

    前言 工作三年有余,年纪大了专业技能到没长进,有时候闲的时候总想写点东西出来,由于自己的懒惰一直拖拖拉拉,好几次还没开始就放弃了,大家也都知道,学编程的大多数不善于表达,加上自己的专业技能确实不怎么样 ...

  4. android 父控件的背景_android控件拖动,移动、解决父布局重绘时控件回到原点

    /** * * @description 设置意见反馈,用以灰度发布 * @author zhongwr * @params * @update 2016年1月12日 下午5:36:07 */ pri ...

  5. android控件拖动,移动、解决父布局重绘时控件回到原点

    最近公司做小游戏开发,写倒计时加进度条 拖动问题private boolean isIntercept = false; /** 按下时的位置控件相对屏幕左上角的位置X */ private int ...

  6. 从零开始学Pyqt5之【控件介绍】(15):绘图类控件QPainter、QPen、QBrush、QPixMap

    从零开始学Pyqt5之[控件介绍](15):绘图类控件QPainter.QPen.QBrush.QPixMap QPainter控件 QPainter控件的作用 QPainter控件常用方法 QPai ...

  7. python gui控件案例_python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例...

    PyQt5布局控件QHBoxLayout简介 采用QBOXLayout类可以在水平和垂直方向上排列控件,QHBoxLayout和QVBoxLayout类继承自QBoxLayout 采用QHBoxLay ...

  8. 怎样不显示限制网页运行可访问计算机的脚本和active控件,Internet Explorer已限制此网页运行脚本或ActiveX控件...

    Internet Explorer已限制此网页运行脚本或ActiveX控件是控件安装错误造成的,解决方法为: 1.先关闭 Internet Explorer 浏览器,然后从开始菜单中找到 Intern ...

  9. 21、控件使用之滚字轮UIC文件的组态和控件设置

    控件使用之滚字轮UIC文件的组态和控件设置 1.准备滚字轮图片 2.创建组态图标字库项目 2.1.查看滚字轮图片的分辨率 2.2.创建工程 2.3.添加图片 2.4.设置控件属性 2.5.设置字体高度 ...

最新文章

  1. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...
  2. HNU 2015暑期新队员训练赛2 H Blanket
  3. 通过实例理解word2vec之Skip-gram
  4. mysql过程异常处理_mysql数据库存储过程异常处理
  5. Django模版(三)
  6. 分布式系列四: HTTP及HTTPS协议
  7. echart中拆线点的偏移_Qt中圆弧和扇形的绘制
  8. 新后缀再开放,投资者应谨慎对待!
  9. 对unicode数据进行部分replace
  10. Kafka : WARN Error while fetching metadata with correlation id xx : {=UNKNOWN_TOPIC_OR_PARTITION}
  11. Vue按需加载提升用户体验
  12. hadoop集群配置文件
  13. 将知网格式的.caj文件转换为.pdf文件
  14. 含参变量正常积分_含参变量的积分
  15. ReportMachine终于有更新了。
  16. FPGA实现cameralink解码
  17. excel vba 字典使用方法学习
  18. 计算机毕业设计Java新生报到管理(源码+系统+mysql数据库+lw文档)
  19. 基于真实电商的下单扣库存学习理解分布式事务解决方案
  20. 【资源分享】Undertale(传说之下)简体中文精品整合包

热门文章

  1. python教程自带数据库_python教程自带数据库 | Python学哪个数据库
  2. MFC利用控制台输出调试信息的方法
  3. 如何用Vue实现简易的富文本编辑器,并支持Markdown语法
  4. 从WEB应用的角度,一个应用都需要维护一些不同作用范围的状态, 请问下面哪些状态作用域是WEB应用特有的:( )
  5. 教你玩转CSS Float(浮动)
  6. md5 算法java实现_java实现MD5算法
  7. 第一个被赋予公明身份的机器人_一文读懂机器人的“眼睛”
  8. c语言指针自定义函数,c语言函数指针定义,指针函数和函数指针的区别
  9. 马秀丽C语言程序设计答案pdf,C语言程序设计清华大学马秀丽刘志妩科后习题9答案.doc...
  10. 怎么改字段名称_精装房这么改!换门框,封阳台,效果出来比毛坯房还好