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类中。

  1. 标识
    每个控件对象都可以由一个整数型作为其标识。我们可以通过View.getId函数获取控件对象的标识,setId设定标识。或者使用View.findViewById函数从控件(包括子控件)寻找到第一个匹配给定标识的控件对象,其寻找方式采用了树的深度遍历。
  2. 尺寸每个控件对象都会占据一定的区域(矩形),该控件对象会处理与矩形区域相关的交互事件。所以通过长、宽来进行描述控件的尺寸。精确描述:具体数值,几像素,几毫米等;模糊描述:依赖于父控件或者控件中内容,来确定自身大小。除此之外,还有位置,距离等信息。
  3. 可见性使用View.setVisibility来改变控件的可见性。三种状态:可见状态View.VISIBLE、不可见状态View.INVISIBLE和消失状态View.GONE.
    不可见状态时,控件的位置不会有任何变化;而当控件处于消失状态时,它就不再占据任何界面区域,它的位置会被其他控件顶替。
  4. 焦点
    焦点指出了当前交互的控件,并可以将一些信息(比如说按键信息)传递给控件。焦点切换的计算模式具有很强的灵活性,开发者也可以通过View.setNextFocusDownId等来设置焦点。

三、Android的窗口机制

所谓窗口机制,是指Android采取了基于窗口注册的实现模式,将用户与界面的交互传递到对应的控件中去。使用过c++和java中界面开发可能会比较熟悉。

窗口机制的核心是窗口管理服务(WindowManagerService),它是Android系统的核心服务之一,运行在系统核心进程的一个独立线程中。它负责管理所以交互界面的控件树,并将用户操作转换成交互事件传递至当前界面。

  1. 界面组件和窗口
    界面组件是Android中最重要的交互单元,每个界面组件都有一个android.view.Window对象。每个Window对象都会负责构造和管理一棵控件树,它会为该控件树构造对应的ViewRoot对象建立与窗口管理服务的双向通信。界面组件的交互界面主要由标题区域和内容区域构成。其中,标题的格式比较固定,通常是由标题文字、进度条和组件图标等元素构成,开发者可以通过setTitle方法来改变标题的内容。而内容区域可以通过setContentView函数或者自定义来进行设定。当然,开发者往往不会满足于这样的基本界面框架,所以Android提供了很多接口帮助开发者突破基本的界面样式。
  2. 对话框
    对话框也是一个很重要的交互单元,它需要寄宿在某个界面组件中。与界面组件相比,对话框的构造更为轻量,生命周期更为简单,数据传输也更为快捷。所以常作为临时的辅助交互对象,将相关信息提示给用户。
    //在界面组件中构造并展现一个对话框对象
    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函数,开发者可以通过重载该函数动态地变更对话框对象中的内容。

  3. 弹出窗口
    派生自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的控件解析的更多相关文章

  1. android开发游记:meterial design 5.0 开源控件整套合集 及使用demo

    android 的5.0公布不光google官方给出了一些新控件,同一时候还给出了一套符合material design风格的设计标准,这套标准将未来将覆盖google全部产品包括pc端,站点,移动端 ...

  2. 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行

    前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行. 满足了自己的 ...

  3. Android开发学习之路--Annotation注解简化view控件之初体验

    一般我们在写android Activity的时候总是会在onCreate方法中加上setContentView方法来加载layout,通过findViewById来实现控件的绑定,每次写这么多代码总 ...

  4. Android开发中几种有用的的日历控件实现

    我们大家都知道,在Android平台3.0中才新增了日历视图控件,可以显示网格状的日历内容,那么对于3.0以下的版本要使用日历控件只能借助第三方,目前用的最多的是CalendarView. 先简单介绍 ...

  5. Android 开发学习进程0.15 adb cardview framelayout 控件设置状态获取焦点

    Android设备调试桥 即adb 使用adb进行无线调试的一些常用命令 adb tcpip 5555 设置调试端口为5555 防止冲突 adb shell ifconfig wlan0 查询局域网中 ...

  6. VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)

    上一节中鸡啄米讲了标签控件知识的上半部分,本节继续讲下半部分. 标签控件的创建 MFC为标签控件的操作提供了CTabCtrl类. 与之前的控件类似,创建标签控件可以在对话框模板中直接拖入Tab Con ...

  7. 【Android开发日记】之入门篇(十二)——Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...

  8. 【Android开发日记】之入门篇(七)——Android数据存储(上)

    在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...

  9. 【Android开发日记】之入门篇(九)——Android四大组件之ContentProvider

    数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供 ...

随机推荐

  1. Codeforces Round #345 Div.1 D.Zip-line 动态最长上升子序列

    题意概述: 给出一个长度为N的序列和M组询问,问假设把某个位置的值改成另一个给出的值之后,序列的最长上升子序列的长度. N,M<=400000. 分析: 考虑某个位置的值改动后这个位置和最长上升 ...

  2. MongoDB 存储日志数据

    MongoDB 存储日志数据 https://www.cnblogs.com/nongchaoer/archive/2017/01/11/6274242.html 线上运行的服务会产生大量的运行及访问 ...

  3. javascript中window.location.search方法简介

    window.location.search方法是截取当前url中"?"后面的字符串,示例如下: 例如:http://www.firefoxchina.cn/?ntab截取后的字符 ...

  4. 洛谷 P1607 [USACO09FEB]庙会班车Fair Shuttle 解题报告

    P1607 [USACO09FEB]庙会班车Fair Shuttle 题目描述 Although Farmer John has no problems walking around the fair ...

  5. taotao购物车2 解决购物车本地cookie和服务器redis不同步的问题

    下面的思路逻辑一定要理清楚,比较绕 思路; 前面已经实现了在cookie本地维护购物车的功能, 这次加入和服务器同步功能, 因为 购物车 操作比较频繁,所以,后台服务器 用redis存储用户的购物车信 ...

  6. WCF分布式开发步步为赢(14):WCF安全编程--基本概念

    WCF安全机制是个非常复杂的问题,因为涉及的知识点较多,所以今天这个文章,会分析进行WCF安全开发应该了解的哪些知识点.如何查看资料.为了更好地理解WCF安全相关知识,我把WCF安全机制主要知识点整理 ...

  7. Clevo P950系列拆机

    Clevo P950系列(包括神舟精盾T96/T97/T96C/T96E/T97E,炫龙耀9000,铁头人T800同模具机型)拆机 拆机恢复时间:20181203 12:28-14:58   一.普通 ...

  8. centos6上使用fpm打python2.7 rpm包并兼容python2.6

    centos6上使用fpm打python2.7 rpm包并兼容python2.6 作者 运维小兵_加油 关注 2016.09.22 00:28 字数 501 阅读 45评论 0喜欢 1 工作中我们常常 ...

  9. ansible 部署jdk

    playbook 剧本如下 [root@sz_fy_virt_encrypt_33_239 x]# cat jdk.yml - hosts: web remote_user: opsadmin bec ...

  10. 帮助小伙伴写的组装xml字符串类

    import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.uti ...