【Android开发日记】之入门篇(十三)——Android的控件解析
Android的控件都派生自android.view.View类,在android.widget包中定义了大量的系统控件供开发者使用,开发者也可以从View类及其子类中,派生出自定义的控件。
一、Android的控件结构
Android中有一类重要的控件,称为容器控件,它们派生自View的子类android.view.ViewGroup。每个容器控件都可以作为父控件存在,其中包含若干个子控件,每个子控件占据其父控件的一块区域,统一由父控件进行管理和支配。

交互界面中控件的关系直观上是极其复杂的,所以Android将控件对象之间的联系抽象为树形结构,从而简化了控件之间的关系——每个控件只会受其父控件的控制,而不会被其他控件影响。为了保证保证调控的整体性,Android为控件树增加了一个统一的交互事件管理对象ViewParent,它可以从整体上对控件树的变化进行调度,避免了控件对象彼此间的局部通信,从而大大降低控件对象间的耦合性。
在Android控件中,交互事件都是沿着控件树自顶向下传播的。父控件接受到交互事件后,会先判断事件的目标控件对象,如果是自己需要的,就会截获事件进行处理,否则就尝试将事件向下分发给对应的子控件,并递推地逐级向下传播事件,直至该事件被处理或者忽略。而在Android中,View定义了一系列事件函数用来接收和处理各类交互事件,比如通过View.onKeyDown函数可以接收到用户的按键操作,onTouchEvent可以获取用户触摸屏幕的相关事件,等等。每个View类的子控件都可以重载这些函数,来处理自己所需的事件。
二、Android的控件属性
每个Android控件都有一定的属性,用于表示控件对象的基本特征。这些属性都定义在View类中。
- 标识
每个控件对象都可以由一个整数型作为其标识。我们可以通过View.getId函数获取控件对象的标识,setId设定标识。或者使用View.findViewById函数从控件(包括子控件)寻找到第一个匹配给定标识的控件对象,其寻找方式采用了树的深度遍历。 - 尺寸每个控件对象都会占据一定的区域(矩形),该控件对象会处理与矩形区域相关的交互事件。所以通过长、宽来进行描述控件的尺寸。精确描述:具体数值,几像素,几毫米等;模糊描述:依赖于父控件或者控件中内容,来确定自身大小。除此之外,还有位置,距离等信息。
- 可见性使用View.setVisibility来改变控件的可见性。三种状态:可见状态View.VISIBLE、不可见状态View.INVISIBLE和消失状态View.GONE.
不可见状态时,控件的位置不会有任何变化;而当控件处于消失状态时,它就不再占据任何界面区域,它的位置会被其他控件顶替。 - 焦点
焦点指出了当前交互的控件,并可以将一些信息(比如说按键信息)传递给控件。焦点切换的计算模式具有很强的灵活性,开发者也可以通过View.setNextFocusDownId等来设置焦点。
三、Android的窗口机制
所谓窗口机制,是指Android采取了基于窗口注册的实现模式,将用户与界面的交互传递到对应的控件中去。使用过c++和java中界面开发可能会比较熟悉。
窗口机制的核心是窗口管理服务(WindowManagerService),它是Android系统的核心服务之一,运行在系统核心进程的一个独立线程中。它负责管理所以交互界面的控件树,并将用户操作转换成交互事件传递至当前界面。
- 界面组件和窗口
界面组件是Android中最重要的交互单元,每个界面组件都有一个android.view.Window对象。每个Window对象都会负责构造和管理一棵控件树,它会为该控件树构造对应的ViewRoot对象建立与窗口管理服务的双向通信。界面组件的交互界面主要由标题区域和内容区域构成。其中,标题的格式比较固定,通常是由标题文字、进度条和组件图标等元素构成,开发者可以通过setTitle方法来改变标题的内容。而内容区域可以通过setContentView函数或者自定义来进行设定。当然,开发者往往不会满足于这样的基本界面框架,所以Android提供了很多接口帮助开发者突破基本的界面样式。
- 对话框
对话框也是一个很重要的交互单元,它需要寄宿在某个界面组件中。与界面组件相比,对话框的构造更为轻量,生命周期更为简单,数据传输也更为快捷。所以常作为临时的辅助交互对象,将相关信息提示给用户。//在界面组件中构造并展现一个对话框对象
new AlertDialog.Bulider(this)
.setTitle("对话框标题") //设置标题
.setMessage("对话框内容")//设置提示信息
.setPositiveButton("关闭",new OnClickListener(){
//相关处理
})
.show();其内容区域用于设置提示信息,或接受用户输入信息。AlertDialog.Builder对象提供了大量的便捷接口供开发者使用,比如可以通过AlertDialog.Bulider.setMessage设置提醒的文字信息,也可以通过AlertDialog.Bulider.setItems函数设置选择列表亦或可以通过AlertDialog.Bulider.setView自定义内容区域的样式。
在界面组件中,可以通过Activity.showDialog函数来弹出指定的对话框对象,开发者需要在Activity.onCreateDialog函数中对其进行构造。对话框一旦被构造,就会被缓存下来。开发者可以通过Activity.dismissDialog函数消隐该对话框,可以通过Activity.removeDialog函数删除缓存的对话框对象。每次对话框呈现之前,都会调用Activity.onPrepareDialog函数,开发者可以通过重载该函数动态地变更对话框对象中的内容。 - 弹出窗口
派生自android.widget.Popup.Window的对象。作用也是在界面组件中用于构造临时交互界面。从使用上来看,PopWindow不像对话框那样从屏幕的固定位置弹出,而是依赖于描点控件对象的位置。PopWindow的展示盒功能都是以它为核心,作为描点控件的扩展交互界面,以增强控件的功能。
如:自动完成文本控件 android.widget.AutoCompleteTextView是PopWindow的一个应用实例。它有一个文本输入控件和与之绑定的PopWindow共同构成。
四、Android的基本控件

控件是构建界面的基本单元。为了帮助更好地进行界面的构造,Android提供了大量的基础控件。对于开发者而言,只有了解这些控件的实现特征和使用方式,才能够更快更好地进行交互界面的开发。那么接下来,我会为大家一个一个介绍Android中比较重要的控件,并附上简单的操作代码。
========================================
作者:cpacm
出处:(http://www.cpacm.net/2015/04/01/Android开发日记(十)——Android的控件解析/)
【Android开发日记】之入门篇(十三)——Android的控件解析的更多相关文章
- android开发游记:meterial design 5.0 开源控件整套合集 及使用demo
android 的5.0公布不光google官方给出了一些新控件,同一时候还给出了一套符合material design风格的设计标准,这套标准将未来将覆盖google全部产品包括pc端,站点,移动端 ...
- 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行
前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行. 满足了自己的 ...
- Android开发学习之路--Annotation注解简化view控件之初体验
一般我们在写android Activity的时候总是会在onCreate方法中加上setContentView方法来加载layout,通过findViewById来实现控件的绑定,每次写这么多代码总 ...
- Android开发中几种有用的的日历控件实现
我们大家都知道,在Android平台3.0中才新增了日历视图控件,可以显示网格状的日历内容,那么对于3.0以下的版本要使用日历控件只能借助第三方,目前用的最多的是CalendarView. 先简单介绍 ...
- Android 开发学习进程0.15 adb cardview framelayout 控件设置状态获取焦点
Android设备调试桥 即adb 使用adb进行无线调试的一些常用命令 adb tcpip 5555 设置调试端口为5555 防止冲突 adb shell ifconfig wlan0 查询局域网中 ...
- VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)
上一节中鸡啄米讲了标签控件知识的上半部分,本节继续讲下半部分. 标签控件的创建 MFC为标签控件的操作提供了CTabCtrl类. 与之前的控件类似,创建标签控件可以在对话框模板中直接拖入Tab Con ...
- 【Android开发日记】之入门篇(十二)——Android组件间的数据传输
组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...
- 【Android开发日记】之入门篇(七)——Android数据存储(上)
在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...
- 【Android开发日记】之入门篇(九)——Android四大组件之ContentProvider
数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供 ...
随机推荐
- 在 C/C++ 中使用 TensorFlow 预训练好的模型—— 间接调用 Python 实现
现在的深度学习框架一般都是基于 Python 来实现,构建.训练.保存和调用模型都可以很容易地在 Python 下完成.但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将通过 ...
- deeplearning.ai课程学习(1)
本系列主要是我对吴恩达的deeplearning.ai课程的理解和记录,完整的课程笔记已经有很多了,因此只记录我认为重要的东西和自己的一些理解. 第一门课 神经网络和深度学习(Neural Netwo ...
- Drools 7.4.1.Final参考手册(六) 用户手册
用户手册 基础 无状态的知识Session Drools规则引擎拥有大量的用例和功能,我们要如何开始?你无须担心,这些复杂性是分层的,你可以用简单的用例来逐步入门. 无状态Session,无须使用推理 ...
- docker基础-虚拟化与容器介绍
正如所有关心docker技术的人所知道的那样,docker是以容器虚拟化为技术为基础的软件,因此在学习docker具体的内容之前,有必要讨论一下虚拟化和容器技术. 虚拟化技术: 在了解虚拟化技术时,各 ...
- lintcode-63-搜索旋转排序数组 II
63-搜索旋转排序数组 II 跟进"搜索旋转排序数组",假如有重复元素又将如何? 是否会影响运行时间复杂度? 如何影响? 为何会影响? 写出一个函数判断给定的目标值是否出现在数组中 ...
- SSH整合主要XML代码
web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...
- 51nod 1779逆序对统计(状压DP)
按照插入数的大小排序, 然后依次进行dp. 用一个状态表示n个数是否被选了 10110 就是表示第1.3.4个位置都选了 那么如果此时这个数该填到5这个位置,那么必定会造成一个逆序(因为下一个数会填到 ...
- NS产品演进
NS产品演进 Citrix产品体系================ Citrix产品类别================ NS产品演进================ 产品联系方式========== ...
- 十个迅速提升JQuery性能的技巧
本文提供即刻提升你的脚本性能的十个步骤.不用担心,这并不是什么高深的技巧.人人皆可运用!这些技巧包括: 使用最新版本 合并.最小化脚本 用for替代each 用ID替代class选择器 给选择器指定前 ...
- CI框架浅析
CI框架浅析(全篇) 业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本. CI是一个很 ...