用户界面
在一个Android应用程序中,用户界面使用View和ViewGroup对象建立。view和view group有很多种,均为View类的子类。view对象是用户界面的基本单元。View类是widget的父类,widget为系统内置ui对象,如文本框和按钮等等。ViewGroup类为layout类的父类,layout为不同种类的布局结构,例如线型、表格型和相对型。
一个View对象是一个储存屏幕上的一块矩形的布局参数和内容的数据结构。一个View对象处理它自己的测量、布局、绘画、焦点变化、卷屏以及它所处的矩形区域内的键盘/手势交互。作为UI中的一个对象,View也是一个和用户交互信息的地方。
View Hierarchy
在Android平台上,使用一个View和ViewGroup组成的层次结构来定义的一个Activity的UI,如下图所示。这个层次树可以简单也可以复杂,你可以使用Android预定义的widget和layout,也可以用你自己自定义的View来构建它。
为将View层次树显示在屏幕上,你的Activity需要使用setContentView()方法,并将根节点对象传递给他。Android系统接收到这个引用并用它来清除、测量和绘制这个树。根节点要求它的子节点能够绘制自己——每个组节点负责它自己的子view来绘制自己。子View可能会从父View处获得大小和位置,但父对象最后决定子对象的大小。Android解析layout,初始化View并把它们加入它们的父View。由于它们按顺序绘制,如果这些元素相互重叠,最后一个被绘制的元素将位于最上层。"How Android Draws Views"介绍了绘制的细节。
Layout
最常见的定义layout和表示view结构的方法就是使用一个xml layout文件。xml提供了一个人类可读的结构。xml的每个元素是一个View或者ViewGroup对象。View对象为树中的树叶,ViewGroup对象为树中的树枝。
xml元素的名称和它的java类相对应。因此一个<TextView>元素创建一个TextView对象,一个<LinearLayout>元素创建一个LinearLayout的view group。当你加载一个layout资源时,Android系统会基于layout中的元素来初始化这些运行时对象。
例如,一个简单的竖排布局,中间有一个text view和一个按钮,像这样:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView" />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button" />
</LinearLayout>注意LinearLayout元素包含TextView和Button。你可以在这个LinearLayout中使用另一个LinearLayout,来创建更复杂的布局。
提示:你也可以在Java代码中绘制View和ViewGroup,使用addView(View)方法来动态插入View和ViewGroup对象。
有很多方法来布局你的view。使用不同的View group,你可以让View和viewgroup组织为任意的形式。一些预定义的Viewgroup有:LinearLayout, RelativeLayout, TableLayout, GridLayout等。
Widgets
widget是一个View对象,它作为一个和用户交互的接口。Android提供了一系列已经定义好的widget,例如按钮,复选框以及文本框等。还有一些更复杂的widget,例如日期选择器,始终以及缩放控制器等。你也可以定义自己的widget。
UI Events
一旦你在UI中加入View和widget,你可能希望知道用户对他们的操作,这样你就可以进行一些动作。为了得到UI事件,有下列两种方法:
- 定义一个event listener并在View中注册它。通常这是你监听事件的方法。View类包含一系列嵌套的on<xxx>Listener接口,每个都有一个on<xxx>()回调函数。例如View.OnClickListener(处理View上的点击事件),View.OnTouchListener(处理触摸屏事件),View.OnKeyListener(处理键盘事件)。因此如果你希望你的View处理点击事件,则定义OnClickListener的onClick()方法并使用setOnClickListener()来注册它。
- 重定义View的一个已有的回调函数。当你实现自己的View类并希望监听某些事件时采用这种方法。
Menus
应用程序菜单是UI的另一个重要部分。菜单提供了一个显示程序功能和设置的可靠接口。最常见的菜单是使用设备上的MENU键呼出的。你也可以使用长按屏幕上某个元素的方式来呼叫出上下文菜单(Context Menu)。
菜单也是用View层次来组织的,但是不要自己定义这个结构。使用onCreateOptionsMenu()和onCreateContextMenu()回调函数并定义菜单的内容。Android会自动建立需要的View结构并绘制其内容。
菜单也需要处理他们的事件,因此不需要注册事件监听器(event listeners)。当菜单项被选择时,onOptionsItemSelected() 或 onContextItemSelected()方法会被调用。
你也可以在xml中定义菜单的项。
Advanced Topics
Adapters
有时候你希望给view group加入动态元素,这些元素不能硬编码,而是需要和外部数据相绑定。为了实现这一点,你需要用AdapterView作为view group,每一个子view使用adapter来进行初始化。
The AdapterView object is an implementation of ViewGroup that determines its child views based on a given Adapter object. The Adapter acts like a courier between your data source (perhaps an array of external strings) and the AdapterView, which displays it. There are several implementations of the Adapter class, for specific tasks, such as the CursorAdapter for reading database data from a Cursor, or an ArrayAdapter for reading from an arbitrary array.
AdapterView 是ViewGroup的一个实现,该view group使用一个给定的Adapter对象来确定它的子View。Adapter作为数据源(例如一个字符串数组)和AdapterView(负责显示)中的一个联系人。有好几种特殊的Adapter实现,例如CursorAdapter(用于从一个Cursor读取数据库数据)和ArrayAdapter(用来从任意数组中读取数据)。
Styles and Themes
可以用样式和主题来自定义标准widget的外观。
- 一个样式是一个或多个格式属性的集合,这些格式属性可以被作为独立的元素放在layout中。例如你可以定义一个样式,该样式制定了某种字体大小和颜色,并将它制定给某几个View元素。
- A theme is a set of one or more formatting attributes that you can apply as a unit to all activities in an application, or just a single activity. For example, you could define a theme that sets specific colors for the window frame and the panel background, and sets text sizes and colors for menus. This theme can then be applied to specific activities or the entire application.
- 一个主题是一个或多个格式属性的集合。这些属性可以对一个应用程序中所有的或一个activity使用。例如,你可以定义一个主题,制定了窗口框的颜色和面板北京颜色,以及菜单的字体字号等。一个主题可以被应用于某些activity或者整个应用程序。
主题和样式是资源。Android提供了一些默认的样式和主题资源给你使用,你也可以定义自己的主题和样式。