【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形式,供 ...
随机推荐
- [译]Python - socket.error: Cannot assign requested address
原文来源: https://stackoverflow.com/questions/48306528/python-socket-error-cannot-assign-requested-addre ...
- chromium源码阅读--V8 Embbeding
V8是google提供高性能JavaScript解释器,嵌入在chromium里执行JavaScript代码. V8本身是C++实现的,所有嵌入本身毫无压力,一起编译即可,不过作为一个动态语言解释器, ...
- springMVC js等文件找不到解决方法
<mvc:resources mapping="/javascript/**" location="/static_resources/javascript/&qu ...
- HashSet如何判定两个元素相同
在介绍java的集合时,我们提到,set是一个"罐子".我们可以向其中放入各式各样的元素,这些元素没有顺序,但不能相同.其中,HashSet是最常用的一个实现类. 首先,我们看下H ...
- SSH面试集锦——不看后悔哦!
1. 谈谈你mvc的理解 MVC是Model-View-Controler的简称.即模型-视图-控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开. MVC中的模型 ...
- [STL] STL各容器实现原理
STL共有六大组件1.容器 2.算法 3.迭代器 4.仿函数 6.适配器 STL容器的实现原理 STL来管理数据十分方便,省去了我们自己构建数据结构的时间.其实,STL的实现也是基于我们常见的数据结构 ...
- Delphi 之 编辑框控件(TEdit)
TEdit 组件主要用于数据的输入和显示和编辑等操作. AutoSelect 获取组件焦点.该属性只能在单行文本组件使用.值为True为选中.false则不选中. BorderStyle 设置编辑框控 ...
- springMVC笔记一
第一章 回顾JavaWeb中的MVC设计模式 1)MVC这种设计模式,不光运用于Web领域,而且也能用于非Web领域 2)今天说的MVC特指一种表现层设计模式,不限于Java语言 第二章 回顾stru ...
- 安装与配置JDK
第一步:下载jdk-7-linux-i586.tar.gzwget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586. ...
- 【C++ 拾遗】Function-like Macros
Macro expansion is done by the C preprocessor at the beginning of compilation. The C preprocessor is ...