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…

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…

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…

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

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

前端页面适配的rem换算

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

css清除浮动

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

gitlab搭建配置;ssh配置;

1.centos7上搭建gitlab&#xff0c;过程略&#xff1b; 命令&#xff1a;gitlab-ctl [start] [stop] [restart] [reconfigure] [tail] 查看gtilab日志 [status] 查看gitlab运行状态信息 2.修改默认ip端口&#xff1a; vim /etc/gitlab/gitlab.rb &#xff1b; external_url h…

家用计算机历史记录,教您如何查看电脑使用记录

很多朋友想查看自己之前使用过的文件或者文档来查询资料&#xff0c;或者是想看电脑是否被人使用过&#xff0c;但是&#xff0c;如何查看电脑使用记录呢&#xff1f;下面系统之家小编教大家查看电脑使用记录小技巧&#xff0c;不用担心找不到电脑使用记录。希望对大家有所帮助…

类的无参方法和Doc注释

一:Java Doc注释: 语法: /** *AccpSchool 类 *author JadeBird *version 1.0 2018/5/26 */ Java Doc是前Sun公司提供的一种技术,它能够从程序代码中抽取类,方法,成员等的注释,形成一个和源代码配套的API帮助文档(简答地说,就是介绍该类,类的方法和成员变量的文档). 因此只要在编…

Spring MVC,Ajax和JSON第3部分–客户端代码

如果您一直关注有关Spring&#xff0c;Ajax和JSON的简短博客系列&#xff0c;那么您会回想起我到目前为止已经创建了一个Spring MVC Web应用程序&#xff0c;该应用程序显示一个表单&#xff0c;该表单允许用户选择一堆项目并向服务器提交购买请求。 然后&#xff0c;服务器用一…

笔记36 Spring Web Flow——配置

Spring Web Flow是一个Web框架&#xff0c;它适用于元素按规定流程运行的程序。Spring Web Flow是Spring MVC的扩展&#xff0c;它支持开发基于流程的应用程 序。它将流程的定义与实现流程行为的类和视图分离开来。在介绍Spring Web Flow的时候&#xff0c;我们将暂时放下Spitt…

一些关于Viewport与device-width的东西~(转)

内容转自 http://www.cnblogs.com/koukouyifan/p/4066567.html 非常感谢 口口一凡 为我们提供的这篇文章&#xff0c;受益匪浅&#xff0c;特地转到自己的博客收藏起来。 以下是原文内容。 进行移动web开发已经有一年多的时间了&#xff0c;期间遇到了一些令人很困惑的东西。…

创建委托登录模块(用于JBoss EAP 6.1)

[如果只想查看代码&#xff0c;请向下滚动] 动机 在RHQ中&#xff0c;我们需要一个安全域&#xff0c;该域可用于通过容器管理的安全性来保护REST-api及其Web应用程序。 过去&#xff0c;我只是使用经典的DatabaseServerLoginModule对DatabaseServerLoginModule进行身份验证。 …

【C++】开源:FLTK图形界面库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍FLTK图形界面库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0…

蜗牛学院:中国人,努力获得了荣誉却要压抑克制

上周&#xff0c;在取得双11三连冠的佳绩之后&#xff0c;百雀羚顺势推出了一支视频广告《你应该骄傲》。 广告内容感动了无数人&#xff0c;并在广告圈和自媒体引发了持续刷屏。&#xff08;视频见文末&#xff09; 从《一九三一》到《韩梅梅快跑》&#xff0c;百雀羚今年多次…

学计算机专业独立显卡有必要吗,不玩游戏独立显卡有什么作用_如果不玩游戏需要选择独立显卡吗-系统城...

现在有些笔记本刚买来的时候会有自带的独立显卡和集成显卡&#xff0c;有些朋友在买了笔记本后并不想玩游戏&#xff0c;这时候他们就有了一个疑问不玩游戏独立显卡有什么作用呢&#xff1f;如果不玩游戏需要选择独立显卡吗&#xff1f;小编在这里就给大家带来电脑独立显卡的作…

Spring JMS,消息自动转换,JMS模板

在我的一个项目中&#xff0c;我应该创建一个消息路由器&#xff0c;就像所有路由器都应该从一个主题中提取JMS消息并将其放入另一个主题中一样。 该消息本身是JMS文本消息&#xff0c;实际上包含XML消息。 收到消息后&#xff0c;我还应该添加一些其他数据来丰富消息。 我们不…

前端人英语学习的那点事儿

小时候英语学得不好&#xff0c;这个不能怪老师。后来自己想&#xff1a;反正以后我也不出国&#xff0c;加之学习方法不对&#xff0c;英语水平比较差劲、工作之后才发现&#xff0c;英语真是重要、第一手资料几乎都是英文的&#xff0c;很多前端书籍翻译得都挺那啥的&#xf…