1、让IT教学更简单,让IT学习更有效Android程序设计教程第4章 Android用户界面程序设计目录 4.1 View基础 4.2 界面布局 4.3 Widget简单组件 4.4 Android事件处理 4.5 对话框 4.6 Android常用高级控件 4.7 Fragment基础 68 4.8 资源管理 80学习目标 了解Android中的基本UI元素 能够使用布局管理器对界面进行管理 掌握界面交互事件处理机制及实现步骤 能够熟练使用常用的Widget简单控件 掌握对话框的使用 掌握Android控件控件的使用 能够使用Android系统的资源管理 掌握Fragment控件的使用4.1
2、View基础4.2 界面布局 Android中提供了两种创建布局的方式:(1)在XML布局文件中声明(2)在程序中直接实例化布局及其控件 常见的Android布局方式有:线性布局(LinearLayout)相对布局(RelativeLayout)表格布局(TableLayout)网格布局(GridLayout)绝对布局(AbsoluteLayout)框架布局(FrameLayout)扁平化布局(ConstraintLayout)4.2.1 线性布局 LinearLayout是一种线性排列的布局,布局中的控件按照水平(horizontal)或垂直(vertical)两种方向排列。4.2.2 相对
3、布局 RelativeLayout是一组相对排列的布局方式,在相对布局容器中子控件的位置总是相对于兄弟控件或父容器4.2.3 表格布局 TableLayout类似于表格形式,以行和列的方式来布局子控件。在TableLayout布局中,可以通过以下三种方式对单元格进行设置。(1)Shrinkable:如果某个列被设置为Shrinkable,那么该列中所有单元格的宽度都可以被收缩,以保证表格能适应父容器的宽度。(2)Stretchable:如果某个列被设置为Stretchable,那么该列中所有单元格的宽度都可以被拉伸,以保证控件能够完全填满表格的空余空间。(3)Collapsed:如果某个列被设
4、置为Collapsed,那么该列中所有单元格都会被隐藏。4.2.4 绝对布局 绝对布局是通过指定x、y坐标来控制每一个控件的位置,放入该布局的控件需要通过android:layout_x和android:layout_y两个属性指定其在屏幕上确切的位置。把屏幕看作一个坐标轴,左上角为(0,0),往屏幕下方为y正半轴,右方为x正半轴。4.2.5 框架布局 框架布局(FrameLayout)又称帧布局,是Android布局中最简单的一种,框架布局为每个加入其中的控件创建了一块空白区域。采用框架布局的方式设计界面时,只能在屏幕左上角显示一个控件,如果添加多个控件,这些会依次重叠在屏幕左上角显示,且会
5、透明显示之前的文本。4.2.6 网格布局 网格布局(GridLayout),是Android4.0新增的布局管理器,因此需要在4.0之后的版本才能使用。它的作用类似于table(表格),它把整个容器划分为rowscolumns个网格,每个网格可以放置一个组件。GridLayout提供了setRowCount(int)和setColumnCount(int)方法来控制该网格的行数量和列数量。4.3 Widget简单组件4.3.1 文本文本控件控件 文本控件主要包括TextView控件和EditText控件。其中TextView控件继承自View类,其主要功能是向用户显示文本内容,同时可选择性地让
6、用户编辑文本。从功能上来说,一个TextView就是一个完整的文本编辑器,只不过其本身被设置为不允许编辑,其子类EditText被设置为允许用户对内容进行编辑。4.3.2 Button和开关和开关控件控件 Button是常用的普通按钮控件,用户能够在该控件上点击,引发相应的响应事件。ToggleButton和Switch都是选择类型的按钮,具有选中和未选中两种状态。4.3.3 ImageButton和ImageView控件 ImageView继承自View组件,它的主要功能是用于显示图片,除此之外,ImageView还派生了ImageButton、ZoomButton等组件,因此ImageVi
7、ew支持的XML属性、方法,基本上也可以应用于ImageButton,ZoomButton等组件。4.3.4 RadioButton和RadioGroup控件 RadioGroup是单选按钮组,是一个允许容纳多个RadioButton的容器。在没有RadioGroup的情况下,RadioButton可以分别被选中;当多个RadioButton同一个RadioGroup按钮组中,RadioButton只允许选择其中之一。RadioButton和RadioGroup的关系如下:(1)RadioButton表示单个圆形单选框,RadioGroup是一个可以容纳多个RadioButton的容器。(2)
8、同一个RadioGroup中,只能有一个RadioButton被选中;不同的RadioGroup中,RadioButton互不影响。(3)通常情况下,一个RadioGroup中至少有2个RadioButton。一般一个RadioGroup组中,会默认有一个RadioButton被选中,并将其放置在RadioGroup的起始位置。4.3.5 CheckBox复选框 CheckBox复选框是一种具有双状态的按钮,具有选中或者未选中两种状态。CheckBox和RadioButton的主要区别如下:(1)RadioButton单选按钮被选中后,再次单击时无法改变其状态;而CheckBox复选框被选中后
9、,可以通过单击来改变其状态。(2)在RadioButton单选按钮组中,只允许选中一个;而在CheckBox复选框组中,允许同时选中多个。(3)大部分UI框架中默认RadioButton以圆形表示,CheckBox都以正方形表示。4.4 Android事件处理 Android提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理。对于基于监听器的事件处理主要是为Android界面组件绑定特定的事件监听器;对于基于回调的事件处理,主要是重写Android构件特定的回调函数,Android大部分界面组件都提供了事件响应的回调函数,只需要重写就可以。4.4.1 基于监听的事件处理 Andr
10、oid系统中引用了Java事件处理机制,包括事件、事件源和事件监听器三个事件模型,与基于回调的事件处理相比,更具有“面向对象”性质的事件处理方式。事件(Event):这是一个描述事件源状态改变的对象,事件对象不是通过new运算符创建的,而是在用户触发事件时由系统生成的对象。事件包括键盘事件、触摸事件等,一般作为事件处理方法的参数,以便从中获取事件的相关信息。事件源(Event Source):产生事件的来源,通常是各种组件,如按钮等。事件监听器(Event Listener):负责监听事件源发生的事件,并对不同的事件做相应的处理。在程序中实现事件监听器,通常有以下四种形式:(1)Activit
11、y本身作为事件监听器:通过Activity实现监听器接口,并实现事件处理方法。(2)匿名内部类形式:使用匿名内部类创建事件监听器对象。(3)内部类或外部类形式:将事件监听类定义为当前类的内部类或普通的外部类。(4)绑定标签:在布局文件中为指定标签绑定事件处理方法。通常实现基于监听的事件处理步骤如下:(1)创建事件监听器。(2)在事件处理方法中编写事件处理代码。(3)在相应的组件上注册监听器。4.4.2基于回调机制的事件处理 基于回调机制的事件主要有onKeyDown()方法、onKeyUp()方法、onTouchEvent()方法、onTrackBallEvent()方法、onFocusCha
12、nged()方法。onKeyDown()方法是接口KeyEvent.Callback中的抽象方法,所有的View全部实现了该接口并重写了该方法,该方法用来捕捉手机键盘被按下的事件。方法的声明格式如下所示:public boolean onKeyDown(int keyCode,KeyEvent event)onKeyUp()同样是接口KeyEvent.Callback中的一个抽象方法,并且所有的View同样全部实现了该接口并重写了该方法,onKeyUp()方法用来捕捉手机键盘按键抬起的事件,方法的声明格式如下所示:public boolean onKeyUp(int keyCode,KeyEv
13、ent event)onTouchEvent()方法是手机屏幕事件的处理方法。该方法在View类中定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件。该方法的声明格式如下所示:public boolean onTouchEvent(MotionEvent event)onTrackBallEvent是手机中轨迹球的处理方法。所有的View同样全部实现了该方法。该方法的声明格式如下:public boolean onTrackballEvent(MotionEvent event)onFocusChanged()方法只能在View中重写,该方法是焦点改变的
14、回调方法,当某个控件重写了该方法后,当焦点发生变化时,会自动调用该方法来处理焦点改变的事件。该方法的声明格式如下。protected void onFocusChanged(boolean gainFocus,int direction,Rect previously FocusedRect)4.5 对话框 1、提示对话框AlertDialog AlertDialog对话框可以包含若干按钮(04个不等)和一些可选的选项,一般包括普通对话框、列表对话框、单选按钮和复选框对话框。一般来说,AlertDialog的功能能够满足常见的对话框用户界面的需求。2、进度对话框ProgressDialog P
15、rogressDialog可以显示进度轮(wheel)和进度条(bar),由于ProgressDialog继承自AlertDialog,所以在进度对话框中也可以添加按钮。3、日期选择对话框DatePickerDialog DatePickerDialog对话框可以显示并允许用户选择日期。4、时间选择对话框TimePickerDialog TimePickerDialog对话框可以显示并允许用户选择时间。普通对话框中只显示提示信息、“确定”按钮和一个“取消”按钮,通过AlertDialog来实现。实现日期选择对话框和时间选择对话框的开发分别需要使用DatePickerDialog类和TimePi
16、ckerDialog类。4.6 Android常用高级控件 4.6.1 AutoCompleteTextView控件 所谓“自动完成”就是在文本框中输入文字信息时,会显示与之相似的关键字让你来选择。AutoCompleteTextView类继承自EditView类,位于android.widget包下。自动完成文本框控件的外观与图片文本框几乎相同,只是当用户输入某些文字信息时,会自动出现下拉菜单显示与用户输入文字相关的信息,用户直接点击需要的文字便可自动填写到文本控件中。4.6.2 ScrollView控件 滚动视图控件ScrollView类继承自FrameLayout类,因此,实际上它是一个
17、帧布局,同样位于android.widget包下。ScrollView控件是当需要显示的信息在一个屏幕内显示不下时,在屏幕上会自动生成一个滚动条,以达到用户可以对其进行滚动,显示更多信息的目的。4.6.3 Listview控件 Listview类位于android.widget包下,是一种列表视图控件,将ListAdapter所提供的各个控件显示在一个垂直且可滚动的列表中。该类的使用方法非常简单,只需先初始化所需要的数据,然后创建适配器并将其设置给ListView,ListView便将信息以列表的形式显示到页面中。BaseAdapter是最基础的Adapter类,该类实现了ListAdapte
18、r接口,是最实用最常用的一个类。学会BaseAdapter需要掌握getCount()、getItem()、getItemId()和getView()四个方法。getCount():要绑定的条目的数目,比如格子的数量 getItem():根据一个索引(位置)获得该位置的对象 getItemId():获取条目的id getView():获取该条目要显示的界面4.6.4 ProgressBar与SeekBar控件 滑块类似于声音控制条,主要完成与用户的简单交互,而进度条则是需要长时间加载某些资源时用户显示加载进度的控件。ProgressBar类同样位于android.widget包下,但其继承自V
19、iew,主要用于显示一些操作的进度。应用程序可以修改其长度表示当前后台操作的完成情况。SeekBar继承自ProgressBar,是用来接收用户输入的控件。SeekBar类似于拖动条,可以直观地显示用户需要的数据,常用于声音调节等场合。RatingBar是另一种滑块控件,一般用于星级评分的场合,其位于android.widget包下,外观是5个星星,可以通过拖动来改变进度,除图片形式外,还有较小的以及较大的两种表现形式。4.6.5 Gallery控件 画廊控件(Gallery)是Android中一种较为常见的高级控件,其效果酷炫且使用方式简单,是设计相册或者图片选择器的首选控件。Gallery
20、组件可以横向显示一个图像列表,当单击当前图像的后一个图像时,这个图像列表会向左移动一格,当单击当前图像的前一个图像时,这个图像列表会向右移动一样,也可以通过拖动的方式来向左和向右移动图像列表。4.6.6 Toast控件 Toast向用户提供比较快速的即时消息,当Toast被显示时,虽然其悬浮于应用程序的最上方,但是Toast从不获取焦点。Toast对象的创建是通过Toast类的静态方法makeText()来实现的,该方法有两个重载实现,主要的不同是一个接收字符串,而另一个接收字符串的资源标识符作为参数。4.6.7 Notification控件 Notification是另外一种消息提示的方式,
21、位于手机的状态栏(Status Bar)。状态栏位于手机屏幕的最上层,通常显示电池电量、信号强度等信息,在Android手机中,用手指按住状态栏并往下拉可以打开状态栏查看系统的提示消息。4.6.8 Spinner控件 下拉列表控件(Spinner)是最常用的高级控件之一,一般用来从多个选项中选择一个需要的,例如出生日期的选择、居住城市的选择等。Spinner控件位于android.widget包下,是View类的一个子类。每次只显示用户选中的元素,当用户再次点击时,会出现选择列表供用户选择,而选择列表中的元素同样来自适配器。需要注意的是,Android中的下拉列表并不象其他系统中直接下拉显示选
22、项,而是相当于弹出菜单供用户选择。4.6.9 TabHost控件 选项卡(TabHost)类位于android.widget包下,是选项卡的封装类,用于创建选项卡窗口。TabHost类继承自FrameLayout,是帧布局的一种,其中可以包含多个布局,用户可以根据自己的选择显示不同的界面。4.6.10 GridView网格控件 GridView(网格视图控件)用于在界面上按行、列分布的方法显示多个组件。GridView与ListView有相同的父类,因此它们具有相似的特性。它们的主要区别在于:ListView是在一个方向上分布,而GridView是在两个方向上分布。4.7 Fragment基础
23、 Fragment翻译为中文就是“碎片”的意思,它是一种嵌入到Activity中使用的UI片段。一个Activity中可以包含一个或多个Fragment,而且一个Activity可以同时展示多个Fragment。4.7.2 Fragment生命周期 Fragment的生命周期与Activity的生命周期类似,也具有以下几个状态:活动状态当前Fragment位于前台时,用户可见并且可以获取焦点。暂停状态其他Activity位于前台,该Fragment仍然可见或部分可见,但不能获取焦点。停止状态该Fragment不可见,失去焦点。销毁状态该Fragment被完全删除或该Fragment所在的Act
24、ivity结束。4.7.3 Fragment的创建 Fragment的创建与Activity的创建类似,要创建一个Fragment必须要创建一个类继承自Fragment。Android系统提供了两个Fragment类,分别是android.app.Fragment和android.support.v4.app.Fragment。动态添加碎片主要分为如下5个步骤:(1)创建待添加的碎片实例。(2)获取到FragmentManager,在活动中可以直接调用getFragmentManager()方法得到。(3)开启一个事务,通过调用beginTransaction()方法开启。(4)向容器内加入碎
25、片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例。(5)提交事务,调用commit()方法来完成。4.7.4 Fragment与Activity之间的通信 1.在Activity中获取Fragment实例 为了实现Fragment和Activity之间的通信,FragmentManager提供了一个findFragmentById()的方法,专门用于从布局文件中获取Fragment实例的。该方法有一个参数,它代表Fragment在Activty布局中的id。例如在布局文件中指定SecondFragment的id为R.id.second_fragmnet,这时就可以使
26、用getFragmentManager().findRagmentById(R.id.second_fragmnet)方法得到SecondFragment的实例 2.在Fragment中获取Activity实例 在Fragment中获取Activity实例对象,可以通过在Fragment中调用getActivity()方法来获取到与当前Fragment相关联的Activity实例对象。例如在MainActivity中添加了SecondFragment,那么就可以通过在Fragment中调用getActivity()来获取MainActivity实例对象。4.8 资源管理 所谓资源就是在代码中使
27、用的外部文件,包括图片、音频、动画和字符串等。在传统的程序开发过程中,需要用到很多常量、字符串等资源。在Android应用程序中,除了res目录外,assets目录也用于存放资源,这两个目录的区别是:通常在assets目录中存放应用程序无法直接访问的原生资源,应用程序需要通过AssetManager类以二进制流的形式来读取资源;而对于res目录中的资源,Android SDK在编译时会自动在R.java文件中为这些资源创建索引,程序可以通过资源清单类R.java对资源进行访问。4.8.1 资源分类 Android的资源可分为两大类:(1)原生资源。指无法通过由R类进行索引的原生资源(如MP3文
28、件等),该类资源保存在assets目录下,且Android程序不能直接访问,必须通过android.content.res.AssetManager类以二进制流的形式进行读取和使用。(2)索引资源。指可以通过R类进行自动索引的资源(如字符串),该类资源保存在res目录下,在应用程序编译时索引资源通常被编译到应用程序中。4.8.2 资源访问方式 1.Java代码访问res资源 每个res资源都会在项目的R类中自动生成一个代表资源编号的静态常量,在Java代码中通过R类可以访问这些res资源,其语法格式如下所示。packageName.R.resourceType.resourceName 2.J
29、ava代码访问assets原生资源 通过Resources类的getAssets()方法可获得android.content.res.AssetManager对象,该对象的open()方法可以打开指定路径的assets资源的输入流,从而读取到对应的原生资源。在Android Studio项目中不会自动创建assets文件夹,需要开发者手动创建。右击项目,选择NewFolderAssets Folder,在单击Finish按钮即可完成创建。3.在XML文件中使用资源 在XML文件中引用其他资源的语法格式如下所示。packageName:resourceType/resourceName 其中,packageName,resourceType,resourceName的含义与在Java代码中访问资源时相同,需要注意前面必须有一个符号。谢谢