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

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群英传》

5a7a6f248b6e

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会变动啊,可能某个时候这就不适用了。

5a7a6f248b6e

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世界的坐标系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一个自制的计算子网划分的小工具

使用 javascirpt 写的&#xff0c;因此可以使用浏览器浏览即可 code: <meta charset"utf-8">输入划分网段的数量&#xff1a; <input id"inp_netCount" /> <input type"button" οnclick"createElem()" value"sta…

每个Java开发人员应拥有的持久断点

当开发人员使用Java进行工作时&#xff0c;即使您尝试调试其他内容&#xff0c;也总是会遇到一些失败的情况。 这是应该在每个IDE中启用的持久断点的列表。 &#xff08;恕我直言&#xff09; 是的&#xff0c;从理论上讲&#xff0c;您应该能够从良好的日志记录实现中获得此信…

tmux颜色高亮跟vim不一致的情况

安装完tmux之后&#xff0c;按照网上大神的配置&#xff0c;稍微配置了下~/.tmux.conf&#xff1a; # 改变快捷键前缀 unbind C-b set -g prefix C-a # 绑定配置加载按键 bind r source-file ~/.tmux.conf \; display-message "Config reloaded.."# 设置终端类型为2…

html5表白页面3d,七夕节表白3d相册制作(html5+css3)

七夕节表白3d相册制作涉及知识点定位阴影3d转换动画主要思路&#xff1a;通过定位将所有照片叠在一起&#xff0c;在设置默认的样式以及照片的布局&#xff0c;最后通过设置盒子以及照片的旋转动画来达到效果。代码如下&#xff1a;3d相册/* 使用单位将所有照片叠在一起 */img{…

(1)pandas 基础教程

步骤1、环境准备 右击桌面上选择【Open in Terminal】 打开终端。在弹出的终端中输入【ipython】进入Python的解释器中&#xff0c;如图1所示。 图1 ipython解释器步骤2、导入所需要的包 导入实验常用的python包。如图2所示。【import pandas as pd】pandas用来做数据处理。【i…

使用Java WebSockets,JSR 356和JSON映射到POJO的

因此&#xff0c;我一直在研究Tyrus &#xff08;JSR 356 WebSocket for Java规范的参考实现&#xff09;。 因为我一直在寻找测试工具&#xff0c;所以我对在Java中同时运行客户端和服务器端感兴趣。 因此&#xff0c;恐怕此博客文章中没有HTML5。 在此示例中&#xff0c;我们…

CSS3效果:波浪效果

实现效果 如图所示&#xff1a; 首先得准备三张图&#xff0c;一张是浅黄色的背景图loading_bg.png&#xff0c;一张是深红色的图loading.png&#xff0c;最后一张为bolang.png。 css代码 body{background:#ffe894;}.loading_bg{width:113px; height:111px;background:url(lo…

集合、深浅拷贝、文件操作(读、写、追加)函数初识(参数)

小数据池#int比较数值is 比较内存地址id 测试内存地址#str不能含有特俗字符单个元素*数字&#xff0c;不能超过21i1 ‘a’*20i ‘a’*20id一样i1 ‘a’*21i ‘a’*21id不一样编码ascii 英文的数字&#xff0c;字母&#xff0c;特殊字符字节8位表示一个字节字符内容的最小…

html创建文件域的代码,word如何插入域代码

在word里怎么进行域代码的设置&#xff1f;如果知道要插入的域的域代码&#xff0c;可以将其直接键入在文档中。首先按 CtrlF9&#xff0c;然后在括号中键入代码就可以了。【Word插入域方法】1、Word2007中&#xff0c;在要插入域的位置单击。2、在“插入”选项卡上的“文字”组…

大学屌丝男

哈哈&#xff0c;来晚了呀转载于:https://www.cnblogs.com/wainiwann/p/7909765.html

前端页面适配的rem换算

为什么要使用rem 之前有些适配做法&#xff0c;是通过js动态计算viewport的缩放值&#xff08;initial-scale&#xff09;。 例如以屏幕320像素为基准&#xff0c;设置1&#xff0c;那屏幕375像素就是375/3201.18以此类推。 但直接这样强制页面缩放过于粗暴&#xff0c;会导致页…

lt form gt 在html,HTML lt;formgt; 标签的 accept

HTML <form> 标签的 accept2018-11-20在跨业务、跨网站发送数据或者业务升级的时候&#xff0c;我们有的时候需要指定发送数据的编码方式&#xff0c;比如页面表单的编码是UTF-8的&#xff0c;而提交到目标页面的编码是GBK编码时&#xff0c;会用到表单的accept-charset属…

使用Java ThreadLocals的意外递归保护

对于那些使用第三方工具来尝试扩展它们而又不完全了解它们的人来说&#xff0c;这是一个小技巧。 假定以下情况&#xff1a; 您想扩展一个公开分层数据模型的库&#xff08;假设您要扩展Apache Jackrabbit &#xff09; 该库在访问内容存储库的任何节点之前会内部检查访问权限…

今日头条竞价接口转发

一、代码 ①类名 public class TouTiao{public class model{public string site_id { get; set; }public string ad_id { get; set; }public List<Data> data { get; set; }}public class Data{public string label { get; set; }public string lable { get; set; }publi…

art-template辅助函数和子模板

art-template 前端使用 用途&#xff1a;主要用来处理数据和优化性能&#xff0c;与其他的一些模块化处理数据的插件相比&#xff0c;art-template处理性能好 不废话&#xff0c;上代码 1.art-template基本语法使用 <script src"template.js"></script&…

微处理器 微型计算机系统,作业答案11微处理器微型计算机和微型计算机系统三者之间.DOC...

作业答案11微处理器微型计算机和微型计算机系统三者之间第1章 作 业 答案1.1 微处理器、微型计算机和微型计算机系统三者之间有什么不同?把CPU(运算器和控制器)用大规模集成电路技术做在一个芯片上,即为微处理器。微处理器加上一定数量的存储器和外部设备(或外部设备的接口)构…

C# 对轻量级(IoC Container)依赖注入Unity的使用

概述 Unity是一个轻量级的可扩展的依赖注入容器&#xff0c;支持构造函数&#xff0c;属性和方法调用注入。Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题。构建一个成功应用程序的关键是实现非常松散的耦合设计。松散耦合的应用程序更灵活&#xff0c;更易于…

为什么同步的StringBuffer从来都不是一个好主意

介绍 StringBuffer是用于可变字符串的同步类。 使其同步的主要问题是 它通常用作局部变量&#xff0c;因此使其同步只会使其变慢。 以多线程方式使用它从来不是一个好主意。 这个问题是开发人员认为使用StringBuffer的方法在不使用时本身就是线程安全的。 StringBuffer的问题…

大工20秋计算机组成原理在线作业2,大工14秋《计算机组成原理》在线作业2答案...

大工14秋《计算机组成原理》在线作业2单选题 判断题一、单选题(共 10 道试题&#xff0c;共 50 分。)1. 存储周期是指( )。A. 存储器的读出时间B. 存储器的写入时间C. 存储器进行连续读或写操作所允许的最短时间间隔D. 存储器进行连续读或写操作所允许的最长时间间隔正确答案&a…

css清除浮动

css设计浮动属性的主要目的&#xff0c;是为了实现文本绕排图片的效果。 一.浮动 当浮动一张图片或者其他元素时&#xff0c;浏览器会将浮动元素往上方推&#xff0c;直到它碰到父元素的内边界。后面的元素不再认为浮动元素在文档流中位于它的前面了&#xff0c;因为它就会占…