【Android开发日记】之入门篇(十三)——Android的控件解析

Android的控件都派生自android.view.View类,在android.widget包中定义了大量的系统控件供开发者使用,开发者也可以从View类及其子类中,派生出自定义的控件。

一、Android的控件结构

Android中有一类重要的控件,称为容器控件,它们派生自View的子类android.view.ViewGroup。每个容器控件都可以作为父控件存在,其中包含若干个子控件,每个子控件占据其父控件的一块区域,统一由父控件进行管理和支配。

【Android开发日记】之入门篇(十三)——Android的控件解析

交互界面中控件的关系直观上是极其复杂的,所以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系统的核心服务之一,运行在系统核心进程的一个独立线程中。它负责管理所以交互界面的控件树,并将用户操作转换成交互事件传递至当前界面。
【Android开发日记】之入门篇(十三)——Android的控件解析

  1. 界面组件和窗口
    界面组件是Android中最重要的交互单元,每个界面组件都有一个android.view.Window对象。每个Window对象都会负责构造和管理一棵控件树,它会为该控件树构造对应的ViewRoot对象建立与窗口管理服务的双向通信。界面组件的交互界面主要由标题区域和内容区域构成。其中,标题的格式比较固定,通常是由标题文字、进度条和组件图标等元素构成,开发者可以通过setTitle方法来改变标题的内容。而内容区域可以通过setContentView函数或者自定义来进行设定。当然,开发者往往不会满足于这样的基本界面框架,所以Android提供了很多接口帮助开发者突破基本的界面样式。
    【Android开发日记】之入门篇(十三)——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的控件解析

控件是构建界面的基本单元。为了帮助更好地进行界面的构造,Android提供了大量的基础控件。对于开发者而言,只有了解这些控件的实现特征和使用方式,才能够更快更好地进行交互界面的开发。那么接下来,我会为大家一个一个介绍Android中比较重要的控件,并附上简单的操作代码。

========================================

作者:cpacm
出处:(http://www.cpacm.net/2015/04/01/Android开发日记(十)——Android的控件解析/

上一篇:【Android开发日记】之入门篇(十一)——Android的Intent机制


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