疯狂Android讲义学习笔记_第1页
疯狂Android讲义学习笔记_第2页
疯狂Android讲义学习笔记_第3页
疯狂Android讲义学习笔记_第4页
疯狂Android讲义学习笔记_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理

每个Android应用程序都运行在单独的Dalvik虚拟机内(即每个Android应用程序对

应一条DaMk进程),Dalvik专门针对同时高效地运行多个虚拟机进行了优化,因此Android

系统以方便的实现对应用程序进行隔离。

Dalvik并未完全遵守JVM规范,两者也不兼容。实际上,JVM虚拟机运行的是Java字

节码(通常是.class文件),但Dalvik运行的是专有的dex(DalvikExecutable)文件。JVM直

接从.class文件或JAR包中加载字节码然后运行;而Dalvik则无法直接从.class文件或JAR

包中加载字节码,它需要通过DX工具将应用程序的所有.class文件编译成.dex文件,Dalvik

则运行该.dex文件。

Android安装APK的步骤

1,使用javac编译*java得到*.class文件。

2.通过DX工具对*.class文件进行转换,转换后通常得到一个*.dex文件。

3.通过AAPT工具打包所有的资源文件。打包后通常得到*.ap_文件。

4.通过apkbuilder工具把前两步得到的文件打包成APK包。

5.签名apk包

6.对签名后的.apk文件进行对齐处理。

7.通过ADB工具安装APK。

因为sdk更新3.0以后apkbuilder已经被删除了,官方建议使用sdklib.jar打包叩k,

sdklib.jar位于D:\Android\sdk\tools\lib下

Android应用界面编程

所有组件都提供两种方式来控制组件的行为:

1.在XML布局文件中通过XML属性进行控制

2.在Java程序代码中通过调用方法进行控制

可以混合XML布局文件和代码来控制UI界面

Context代表访问Android应用环境的全局信息API。

自定义View

当开发者打算派生自己的UI组件时,首先定义一个继承View基类的子类,然后重写View

类的一个或多个方法。在使用时,可以用Java代码来控制也可以用XML布局文件来控制。

布局管理器

可以根据运行平台来调整组件的大小,程序员要做的只是为容器选择合适的布局管理器。

1.线性布局LinearLayout

会将容器里的组件一个挨着一个排列起来,可以控制各组横向排列或纵向排列。它不会

换行,当组件一个挨着一个排列到头之后,剩下的组件将不会被显示出来。

android:layout_gravity:设置该子元素在父容器中的对齐方式。

android:gravity:控制它所包含的子元素的对齐方式。

2.表格布局TableLayout

继承了LinearLayout,本质依然是线性布局管理器。它采用行,列方式来管理UI组件,

不需要明确的声明包含多少行,多少列,而是通过添加TableRow,其他组件来控制表格的

行数和列数。

每次向表格布局其添加一个TableRow,该TableRow就是一个表格行,TableRow也是

容器,因此它也可以不断的添加其他组件,每添加一个子组件该表格就增加一列。

如果直接向TableLayout中添加组件,那么这个组件将占用一行。

在表格布局中,列的宽度由该列中的最宽的那个单元格决定,整个表格布局的宽度则取

决于父容器的宽度。

可以为单元格设置三种行为方式:

•Shrinkable收缩

•Stretchable拉伸

•Collapsed隐藏

3.帧布局FrameLayout

继承了ViewGroup组件,帧布局管理器为每个加入其中的组件创建一个空白区域(称

为一帧)。每个子组件占据一帧,这些帧都会根据gravity属性执行自动对齐。它都把组件一

个叠加在一起。

4,相对布局RelativeLayout

相对布局管理器内子组件的位置总是相对兄弟组件,父容器来决定的。

5.网格布局GridLayout

作用类似HTML中的table标签,它把整个容器划分为rows*columns个网格,每个网

格可以放置一个组件。除此之外,也可以设置一个组件横跨多少列,一个组件纵跨多少行。

6,绝对布局AbsoluteLayout

绝对布局由开发人员自己通过X,Y坐标来控制组件的位置。

Android常用的距离单位:

1.px(像素)

2.dip或dp(设备独立像素)

3.sp(比例像素)

4.in(英寸)

5.mm(毫米)

6.pt(磅)

Textview文本框

直接继承了View,它还是EditText和Button的父类,作用是在界面上显示文本。可指

定字体大小,改变文本框的所有字母大写,添加阴影,还可指定一个背景Drawable来添加

边框效果。

EditText

允许用户编辑文本框内容的文本框。

Checked!extView

增加了一个Checked状态,可通过setChecked(boolean)和isChecked()方法来改变,访

问该组件的checked状态。

Button

按钮类,可以供用户单击,当用户单击按钮时,会触发一个。nClick事件。

9Path图片

为了实现只缩放图片中某个部分的效果,可以借助9Path图片来实现。它是一种特殊的

PNG图片,它在原始图片四周添加了一个宽度为1像素的线条,这4条线决定了该图片的

缩放规则,内容显示规则。

左侧和上侧的直线决定了图片的缩放区域;右侧和下侧的直线决定了图片内容显示区域。

RadioButton和CheckBox

RadioButton单选按钮,一组RadioButton只能选中其中一个,通常要与RadioGroup—

起使用。

CheckBox复选框

ToggleButton状态开关按钮和Switch开关

用于切换程序中的某种状态。

AnalogClock和DigitalClock时钟

DigitalClock显示内容总是当前时间。

AnalogClock继承View组件,重写了View的OnDraw方法,它会在View上绘制模拟时钟。

区别在于DigitalClock显示数字时钟,可以显示当前秒数。AnalogClock显示模拟时钟,

不会显示当前秒数。

Chronometer计时器

并不显示当前时间,它显示的是从某个起始时间开始,一共过去了多长时间。

ImageView及其子类

主要功能是显示图片,任何Drawable对象都可以使用ImageView来显示。

ImageButton图片按钮

与Button不同的是Button生成的按钮上显示文字,而ImageButton上则显示图片。可

以指定android:src属性设置静态图片,也可以使用自定义Drawable对象来开发处随用户动

作改变图片的按钮。

QuickContactBadge关联联系人

继承了ImageView,因此它本质也是图片,可以通过android:src属性指定它显示的图

片,额外增加的功能是该图片可以关联到手机中指定的联系人,当用户单击图片时,系统将

会打开相应联系人的联系方式界面。

AdapterView及子类

具有如下特征:

1.继承了ViewGroup,本质是容器。

2.可以包括多个列表项,并将多个列表项以合适的形式显示出来。

3.显示的多个列表项由Adapter提供。

ListView和ListActivity

ListView以垂直列表的形式显示所有列表项。创建ListView有两种方式:

1.直接使用ListView进行创建。

2,让Activity继承ListActivity□

一旦获得ListView之后,就需要为ListView设置它要显示的列表项,通过

setAdapter(Adapter)方法为之提供Adapter,并由Adapter提供列表项即可。

Adapter接口及其实现类

Adapter是一个接口,派生与ListAdapter和SpinnerAdapter两个子接口。

Adaptei■常用的实现类如下:

1.ArrayAdapter:用于数组或List集合的多个值包装成多个列表项。

2.SimpleAdapter:用于将List集合的多个对象包装成多个列表项。

3.SimpleCursorAdapter:用于包装Cursor提供的数据。

4.BaseAdapter:通常用于扩展。可以对各项列表项进行最大限度的定制。

•创建ArrayAdapter时必须指定3个参数:

1.Context:代表访问整个Android应用的接口。

2.textViewResourceld:一个资源ID,代表一个TextView,该组件将作为ArrayAdapter

的列表项组件。

3.数组或List:负责为多个列表项提供数据。

•创建SimpleAdapter时需要5个参数

1.Context

2.一个List<?extendsMap<String,?>>类型的集合对象,该集合中的每个

Map<String,?>对象生成一个列表项。

3.一个界面布局ID,该界面将作为列表项组件。

4.一个String口类型的参数,该参数决定提取Map<String,?>对象中哪些key对应value

来生成列表项。

5.一个int[]类型的参数,该参数决定填充哪些组件。

如果需要监听用户单击,选中某个列表项事件,可通过Ad叩terView的

setOnltemClickListener()方法为单击事件添加监听器,或通过

setOnltemSelectedListener()方法为列表项的选中事件添加监听器。

•通过扩展BaseAdapter来实现Adapter,可以取得对Adapter最大的控制权:程序

要创建多少个列表项,每个列表项的组件由开发者决定。创建一个BaseAdapter对

象,扩展该对象需要重写如下4个方法:

1.getCount():该方法的返回值控制该Adapter将会包含多少个列表项。

2.getltem(intposition):该方法的返回值决定第position处的列表项内容。

3.getltemld(intposition):该方法的返回值决定第position处的列表项ID0

4.getView(intposition.ViewconvertView,ViewGroupparent):该方法的返回值决定第

position处的列表项组件。

自动完成文本框AutoCompleteTextView

当用户输入一定字符之后,自动完成文本框会显示一个下拉菜单,供用户选择,当用户

选择某个菜单项之后,它按用户选择自动填写该文本框。它还派生了一个子类:

MultiAutoCompleteTextView,该子类允许输入多个提示项,多个提示项以分隔符分隔。

使用方法:

1.在布局文件中定义自动完成文本框组件。

2.为它们绑定一个Adapter。

3.可以为MultiAutoCompleteTextView设置分隔符。

网格视图GridView

用于在界面上按行,列分布的方式来显示多个组件。它和ListView不同在于,ListView

只显示一列,而GridView可以显示多列,同样需要通过Adapter来提供显示数据。

可展开的列表组件ExpandableListView

它把应用中的列表项分成几组,每组里又可包含多个列表项。所显示的列表项应该由

ExpandableListAdapter提供。

实现ExpandableListAdapter也有如下3种常用方式:

1.扩展BaseExpandableListAdapter实现ExpandableListAdapter,关键是实现如下4

个方法:

•getGroupCount。返回包含的组列表项的数量。

•getGroupView。返回的View对象将作为组列表项。

•getChildrenCount()返回特定组所包含的子列表项的数量。

•getChildView()返回的View对象将作为特定组,特定位置的子列表项。

2.使用SimpleExpandableListAdapter将两个List集合包装成ExpandableListAdapter0

3,使用SimpleCursorTreeAdapter将Cursor种数据包装成SimpleCursorTreeAdaptero

Spinner的功能与用法

一个列表选择框,并不是需要显示下拉列表,而是相当于弹出一个菜单供用户选择。可

以指定android:entries属性来提供显示数据,或用Adapter的方式来提供显示数据。

画廊视图Grllery

显示的是一个水平的列表选择框。允许用户通过拖动来查看上一个,下一个列表项。只

要为它提供一个内容Adapter即可,该Adapter的getView()方法所返回的View将作为

Gallery列表的列表项。

Ad叩terViewFlipper的功能与用法

继承了AdapterViewAnimator,它也会显示Adapter提供的多个View组件,但它每次

只能显示一个View组件,程序可以控制该组件显示上一个,下一个组件,可以在多个View

切换过程中使用渐隐渐显的动画效果。

StackView的功能与用法

它用于显示Adapter提供的系列View,它将会以堆叠的方式来显示多个列表项。它提

供了如下两种控制方式:

1.拖走StackView中处于顶端的View,下一个View将会显示出来。将上一个View拖进

StackView,将使之显示出来。

2,通过调用StackView的showNext(),showPrevious()控制显示下一个,上一^组件。

ProgressBar的功能与用法

Android支持多种风格的进度条,通过style属性可以为其指定风格。还提供如下方法

来操作进度:

1.setProgress(int)设置进度条的完成百分比。

2.incrementPorgressBy(int)设置进度条进度增加或减少。当参数为正数时进度增加,当参

数为负数时进度减少。

还有一种进度条,可以直接在窗口标题上显示,需要如下两个步骤:

1.调用Activity的requestWindowFeature。方法,该方法根据传入的参数可启用特定

的窗口特征,传入Window.FEATUREJNDETERMINATE_PROGRESS在窗口标题上显

示不带进度的进度条,传入Window.FEATURE_PROGRESS则显示带进度的进度条。

2.调用Activity的setProgressBarVisibility(Boolean)或

setProgressBarlndeterminateVisibility(Boolean)方法即可控制进度条的显示与隐藏。

拖动条SeekBar的功能与用法

可以拖动滑块来改变值,通常用于对系统的某种数值进行调节。可以通过指定

android:thumb的属性来改变拖动条的滑块外观

星级评分条RatingBar的功能与用法

通过星星来表示进度的特殊进度条。

Viewswitcher的功能与用法

是一个视图切换组件,继承FrameLayout,可以将多个View层叠在一起,每次只显示

一个组件。当程序控制从一个View切换到另一个View时,可以支持指定动画效果。为了给

ViewSwitcher添加多个组件,一般通过调用setFactory(ViewSwticher.ViewFactory)方法为之

设置ViewFactory,并由该ViewFactory为之创建View即可。

图像切换器ImageSwitcher

继承ViewSwitcher,可以切换View组件时使用动画效果。使用它只需要2步:

1.为ImageSwitcher提供一个ViewFactory,该ViewFactory生成的View组件必须是

ImageVieWo

2,需要切换图片时,只要调用ImageSwitcher的setlmageDrawable(Drawabledrawable),

setlmageResource(intresid)和setlmageURI(Uriuir)方法更换图片即可。

文本切换器TextSwitcher

继承ViewSwitcher,可以切换View组件时使用动画效果,也要设置一个ViewFactory,

该ViewFactory的makeView。方法必须返回一个TextView。

ViewFilpper功能与用法

继承ViewAnimator,可以调用addView(Viewv)添加多个组件,可以使用动画控制多个

组件的切换效果。它与AdapterViewFlipper的区别是ViewFlipper需要开发者通过addView()

添加多个View,而AdapterViewFlipper则只要传入一个Adapter,adapter将会负责提供多

个Viewo

使用Toast显示提示信息框

它具有如下特征:

1.提示信息不会获得焦点

2.提示信息过一段时间会自动消失

使用步骤:

1.调用Toast的构造器或makeText()静态方法创建一个Toast对象。

2.调用Toast的方法来设置该消息提示的对齐方式,页边距等。

3,调用Toast的show。方法将它显示出来。

如果需要显示诸如图片,列表之类的复杂提示,则调用Toast构造器创建实例,再调用

setView()方法设置该Toast显示的View组件。

日历视图CalendarView

可用于显示和选择日期,用户既可以选择一个日期,也可通过触摸来滚动曰历。可以调

用该组件的setOnDateChangeListener。方法为此组件添加点击事件监听器。

日期,时间选择器DatePicker和TimePicker

DatePicker可用于选择日期,TimePicker可用于选择时间。

数值选择器NumberPicker

用于让用户输入数值,用户既可以通过键盘输入数值,也可以通过拖动来选择数值。

搜索框SearchView

可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当用户输入完成后

提交搜索时,也可以通过监听器执行实际搜索。

选项卡TabHost

可以很方便地在窗口上放置多个标签页,每个标签页相当于获得一个与外部容器相同大

小的组件摆放区域。通过这种方式,就可以在一个容器里放置更多组件。

与TabHost结合使用的还有如下组件:

1.TabWidget:选项卡的标签条

2.TabSpec:选项卡的一个Tab页面

TabHost仅仅是个容器,它提供如下两个方法创建,添加选项卡

1.newTabSpec:创建选项卡

2.addTab(TabHost.TabSpectabSpec):添力口选项卡

使用TabHost的一般步骤如下:

1.在界面布局中定义TabHost组件,并为组件定义该选项卡的内容。

应该继承

2.ActivityTabActivityo

3,调用TabActivity的getTabHost()方法获取TabHost对象。

4.通过TabHost对象的方法创建,添加选项卡。

滚动视图ScrollView

用于为普通组件添加滚动条的组件,该组件里最多只能包含一个组件,而它的作用就是

为该组件添加垂直滚动条。默认是垂直的滚动条,如果要使用水平滚动条则要使用

HorizontalScrollVieWo

Notification的功能与用法

是显示在手机状态栏的通知。程序一般通过NotificationManager服务来发送

Notification。发送Notification需要按如下步骤:

1,调用getSystemSerive(NCTnFICATION_SERVICE)方法获取系统的NotificationManager月艮

务。

2.通过构造器创建一个Notification对象。

3,为Notification设置各种属性。

4.通过NotificationManager发送Notification。

对话框

Android提供了4种常用对话框

1.AlertDialog:实际应用最广的对话框

2.ProgressDialog:进度对话框

3.DatePickerDialog:日期选择对话框

4.TimePickerDialog:时间选择对话框

使用AlertDialog对话框的几个步骤:

1,使用创建AlertDialog.Builder对象。

2.调用AlertDialog.Builder的setTitle。或setCustomTitle。方法设置标题。

3,调用AlertDialog.Builder的setlcon。方法设置图标。

4.调用AlertDialog.Builder的相关设置方法设置对话框内容。

5.调用AlertDialog.Builder的setPositiveButton(),setNegativeButton或

setNeutralButton()方法添加多个按钮。

6.调用AlertDialog.Builder的create。方法创建AlertDialog对象,再调用AlertDialog

对象的show()方法将该对话框显示出来。

其中第4步中的设置方法有如下6种:

1.setMessage()设置对话内容为简单文本内容。

2.setltems()设置对话框内容为简单列表项。

3.setSingleChoiceltems。设置对话框内容为单选列表项。

4.setM3tiChoiceltems()设置对话框内容为多选列表项。

5.setAdapter。设置对话框内容为自定义列表项。

6.setView()设置对话框内容为自定义View。

PopupWindow

可以创建类似对话框风格的窗口,只要如下两步即可:

1.调用PopupWindow的构造器创建对象。

2,调用PopupWindow的showAsDropDown(Viewv)将PopupWindow作为v的组件的下

拉组件显示出来,或调用showAtLocation。方法将PopupWindow在指定位置显示出来。

使用DatePickerDialog,TimeTickerDialog

使用它们只需2步:

1.通过new关键字创建DatePickerDialog,TimePickerDialog实例,调用它们的show。方

法即可将日期选择对话框,时间选择对话框显示出来。

2.为DatePickerDialog,TimePickerDialog绑定监听器。

使用ProgressDialog创建进度对话框

创建进度对话框有如下两种方式:

1.如果只是创建简单的进度对话框,调用ProgressDialog提供的show()方法显示对话框

即可。

2.创建ProgressDialog,然后调用方法对对话框里的进度条进行设置,设置完成后将对话

框显示出来。

菜单

Menu接口只是一个父接口,它有如下两个子接口:

1.SubMenu:代表一个子菜单。

2.ContextMenu:代表一•"上下文菜单。

添加菜单或子菜单的步骤如下:

1.重写Activity的onCreateOptionsMenu(Menumenu)的方法,在该方法里调用Menu对

象的方法来添加菜单项或子菜单。

2.如果希望应用程序能响应菜单项的点击事件,重写Activity的

onOptionltemSelected(Menultemmi)方法即可。

使用监听器来监听菜单事件

可以为不同菜单分别绑定监听器,使用

setOnMenultemClickListener(Menultem.OnMenultemClickListenermenultemClickListener)来

绑定监听器。但通过为每个菜单绑定监听器会使代码更为臃肿,因此一般不推荐为每个惨淡

分别绑定监听器。

创建复选菜单项和单选菜单项

setCheckable(Booleancheckable)设置该菜单项是否可以勾选。

setGroupCheckable(intgroup,booleancheckable,booleanexclusive)设置group组里的所有

菜单项是否可勾选,如果exclusive为true,那么它们将是一组单选菜单项。

设置于菜单项关联的Activity

只要调用Menuitem的setlntent(lntentintent)方法即可,该方法把菜单项与指定Intent

关联到一起,当用户单击该菜单项时,该Intent所代表的组件将会启动。

上下文菜单

开发上下文菜单的步骤如下:

1.重写Activity的OnCreateContextMenu(ContextMenumenu,View

source,ContextMenu.ContextMenuInfomenuinf。)方法。

2.调用Activity的registerForContextMenu(Viewview)方法为view组件注册上下文菜单。

3.如果希望应用程序能为菜单项提供响应,可以重写onContextltemSelected(Menultem

mi)方法,或为指定菜单项绑定监听器。

使用XML文件定义菜单

菜单资源通常应该放在/res/menu目录下,菜单资源的根元素通常是〈menu…/>元素,

〈menu…/>元素无须指定任何属性。〈menu…/>元素内可包含如下元素:

1.〈item…/>:定义菜单项,(item…/>元素又可包含〈menu…/>元素,位于〈item…/>元素

内部的〈menu…/>就代表了子菜单。

2.〈group…/>:将多个〈item…/>定义的菜单包装成一个菜单组,它用于控制整组菜单的

行为。

在程序中定义了资源后,接下来重写onCreateOptionsMenu(用于创建选项菜单),

onCreateContextMenu(用于创建上下文菜单)方法,在这些方法种调用Menulnflater对象的

inflate方法装载指定资源对应的菜单即可。

使用XML资源定义菜单的好处:

1.XML资源文件不仅负责定义界面,也负责定义菜单,这样可把所有界面相关的内容交

给XML文件管理,而Java代码的功能更集中。

2.后期更新,维护应用时,如果需要更新,维护菜单,打开,编辑XML文件即可,避免

对Java文件的修改。

使用PopuoMenu创建弹出式菜单

它会在指定组件上弹出PopupMenu,默认情况下,PopupMenu会显示在该组件的下方

或上方。可增加多个菜单项,并可为菜单项添加子菜单。

创建PopupMneu菜单的步骤如下:

1.调用newPopupMenu(Contextcontext,Viewanchor)创建下拉菜单,anchor代表要激发

该弹出菜单的组件。

2,调用Menulnflater的inflate。方法将菜单资源填充到PopupMenu中。

3.调用PopupMenu的show。方法显示弹出式菜单。

使用活动条ActionBar

位于传统标题栏的位置,也就是显示的屏幕的顶部。它可显示应用的图标和Activity标

题,也就是前面应用程序的顶部显示的内容,除此之外,ActionBar的右边还可以显示活动

项。归纳起来,ActionBar提供如下功能:

1.显示选项菜单的菜单项(将菜单项显示成ActionItem)。

2.使用程序图标作为返回HOME主屏或向上的导肮操作。

3.提供交互式View作为ActionView。

4.提供基于Tab的导航方式,可用于切换多个Fragment。

5.提供基于下拉的导航方式。

Android3.0版本已经默认启用了ActionBar,只要在AndroidManifest.xml文件的SDK配

置中指定了该应用的目标版本高于11,那么默认就会启用ActionBaro

使用ActionBar显示选项菜单

为了解决手机不再强制提供MENU按键,导致用户无法打开选项菜单的问题,Android

提供了ActionBar作为解决方案,ActionBar可以将选项菜单显示成Actionitem。Android3.0

开始,Menuitem新增了如下方法:

setShowAsAction(intactionEnum):该方法设置是否将该菜单项显示在ActionBar上,作为

Actionitemo该方法支持如下参数值:

1.SHOW_AS_ACTION_ALWAYS:总是将该Menuitem显示在ActionBar上。

2.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW:将该ActionView折叠成普通菜单项。

3.SHOW_AS_ACTION_IF_ROOM:当ActionBar位置足够时才显示Menuitem。

4.SH0W_AS_ACTI0N_NEVER:不将该Menuitem显示在ActionBar上。

5.SHOW_AS_ACTION_WITH_TEXT:将该Menuitem显示在ActionBar上,并显示该菜单

项的文本。

允许在XML菜单资源文件中为〈item…/>元素指定如下属性:

android:showAsAction:该属性值的作为类似于setShowAsAction(intactionEnum)。

启动程序图标导航

为了将应用程序图标转换为可点击的图标,可调用ActionBar的如下方法:

1.setDisplayHomeAsUpEnabled(BooleanshowHomeAsUp):设置是否将应用程序图标转

变成可点击的图标,并在图标上添加一个向左箭头。

2.setDisplayOptions(intoptions)通过传入int类型常量来控制该ActionBar的显示选项。

3.setDispl;ayShowHomeEnabled(BooleanshowHome):设置是否显示应用程序的图标。

4.setHomeButtonEnabled(Boolear)enabled):设置是否将应用程序图标转变成可点击的按

钮。

添加ActionView

ActionBar除了可以显示普通的ActionItem外,还可以显示普通的UI组件。为了在

ActionBar上添加ActionView,可以用如下两种方式:

1,定义ActionItem时使用android:actionViewClass属性指定ActionView的实现类。

2,定义ActionItem时使用android:actionLayout属性指定ActionView对应的视图资源。

使用ActionBar实现Tab导航

ActionBar在顶端生成多个Tab标签,当用户点击某个Tab标签时,系统根据用户点击

事件导航指定Tab页面。按如下步骤进行即可:

1,调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法设置

使用tab导航方式。

2.调用ActionBar的addTab()方法添加多个tab标签,并为每个标签添加事件监听器。

Fragment简介

Fragment相当于Activity片段,通常单独的Activity组合多个Fragment,这样即可在一

个Activity创建多个用户界面。除此之外,也可以多个Activity复用同一个Fragment。总之

Fragment相当于Activity的模拟区域。

使用ActonBar实现下拉式导航

ActionBar除可提供Tab导航支持之外,还提供了下拉式导航方式。下拉式导航的

ActionBar在顶端生成下拉列表框,当用户单击某个列表项时,系统根据用户单击事件导航

指定的Fragmento实现它按如下步骤即可:

1.调用ActionBar的actionBar.setNavigationMode(ActionBar.NAVIGACTON_MODE_LIST)

方法设置使用下拉列表的导航方式。

2.调用ActionBar的setListNavigationCallbacks(SpinnerAdapter

adapter,ActionBar.onNavigationListenercallback)。添加多个列表项,并为每个列表项设

置监听器。

Android的事件处理

目录

Android的事件处理13

基于监听的事件处理13

基于回调的事件处理14

响应系统设置的事件15

Handler消息传递机制15

异步任务(AsyncTask)16

两套事件处理机制:

1.基于监听的事件处理

可以在界面布局文件中android:onClick属性指定事件监听方法。

2.基于回调的事件处理

主要是重写组件特定的回调方法,或重写Activity的回调方法。

基于监听的事件处理

在事件监听的处理模型中,主要涉及如下三类对象:

1.Eventsource事件源:事件发生的场所,通常是各个组件。

2.Event事件:事件封装了界面组件上发生的特定事情。如果程序需要获得界面组件上所

发生事件的相关信息,一般通过Event对象来取得。

3.EventListener事件监听器:负责监听事件源所发生的事件,并对各种事件做出相应的响

应。

Android的事件处理机制是一种委派式事件处理方式:普通组件(事件源)将整个事件

处理委托给特定的对象(事件监听器);当该事件源发生特定的事件时,就通知所委托的事

件监听器,由事件监听器来处理这个事件。

基于监听的事件处理模型的编程步骤如下:

1,获取普通界面组件(事件源),也就是被监听的对象。

2.实现事件监听器类,该监听器类是一个特殊的Java类,必须实现一个xxxListener接口。

3.调用事件源的setXxxListener方法将事件监听器对象注册给普通组件(事件源)。

事件与事件监听器

如果事件源触发的事件足够简单,事件里封装的信息比较有限,那就无须封装事件对象,

将事件对象传入事件监听器。但对于键盘事件,触摸事件等,此时程序需要获取事件发生的

详细信息,对于这种包含更多信息的事件,Android同样会将事件信息封装成XxxEvent对

象,并把该对象作为参数传入事件处理器。

在程序中实现事件监听器,通常有如下几种形式:

1.内部类形式:将事件监听器类定义成当前类的内部类。

2.外部类形式:将事件监听器定义为一个外部类。

3.Activity本身作为事件监听器:让Activity本身实现监听器接口,并实现事件处理方

法。

4.匿名内部类形式:使用匿名内部类创建事件监听器对象。

内部类作为事件监听器类

使用内部类可以在当前类中复用该监听器;因为监听器是外部类的内部类,所以可以自

由访问外部类的所有界面组件。

外部类作为事件监听器类

使用外部类定义事件监听器类的形式比较少见,主要因为如下两个原因:

1.事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性.

2.外部类形式的事件监听器不能自由访问创建GUI界面的类中的组件,编程不够简洁。

但如果某个事件监听器确实需要被多个GUI界面所共享,而且主要是完成某种业务逻

辑的实现,则可以考虑使用外部类的形式来定义事件监听器类。

Activity本身作为监听器

这种形式非常简洁,但这种做法有两个缺点:

1.这种形式可能造成程序结构混乱,Activity的主要职责应该是完成界面初始化工作,但

此时还需包含事件处理器方法,从而引起混乱。

2.如果Activity界面类需要实现监听器接口,让人感觉比较怪异。

匿名内部类作为事件监听器类

因大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适。

直接绑定到标签

直接在界面布局文件中指定标签绑定事件处理方法。许多组件都支持。nClick属性,该

属性的属性值就是一个形如xxx(Viewsource)的方法的方法名。

基于回调的事件处理

如果说事件监听机制是一种委托式的事件处理,那么回调机制则恰好与之相反。对于基

于回调的事件处理模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。

在用户在GUI组件上激发某个事件时,组件自定特定的方法将会负责处理该事件。

而Java又是一种静态语言,我们无法为某个对象动态的添加方法,因此只能继承GUI

组件类,并重写该类的事件处理方法来实现。

基于回调的事件传播

几乎所有基于回调的事件处理方法都有一个boolean类型的返回值,该返回值用于标

识该处理方法是否能完全处理该事件:

1.如果返回true,表明该处理方法已完全处理该事件,该事件不会传播出去。

2.如果返回false,表明该处理方法并未完全处理该事件,该事件会传播出去。

当该组件上发生某个按键被按下的事件时,系统最先触发的应该是该按键上绑定的事件

监听器,接着才触发该组件提供的事件回调方法,然后还会传播到该组件所在的Activityo

重写onTouchEvent方法响应触摸屏事件

基于回调的事件处理更适合应付那种事件处理逻辑比较固定的View。

响应系统设置的事件

Configruation类

专门用于描述手机设备上的配置信息,这些配置信息既包括用户特定的配置项,也包括

系统的动态设备配置。

重写onConfigurationChanged响应系统设置更改

如果需要监听系统设置的更改,则可以考虑重写

onConfigurationChanged(ConfigurationnewConfig)方法,该方法是一^基于回调的事件处

理方法:当系统设置发生更改时,该方法会被自动触发。

为了让Activity能监听设置更改事件,需要在配置该Activity时指定

anroid:configChanges属性,该属性可以支持很多设置属性值。

Handler消息传递机制

Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可

能导致线程安全问题,为了解决这个问题,Android制定了一条简单的规则:只允许UI线程

修改Activity里的UI组件。

Android的消息传递机制是另一种形式的“事件处理”,这种机制主要为了解决Android

应用的多线程问题,Android平台只允许UI线程修改Activity里的UI组件,这样就会导致

新启动的线程无法动态改变界面组件的属性值。但在实际Android应用开发中,尤其是涉及

动画的游戏开发中,需要让新启动的线程周期性地改变界面组件的属性值,这就需要借助

Handler的消息传递机制来实现了。

Handler的主要作用有两个:

1.在新启动的线程中发送消息。

2.在主线程中获取,处理消息。

为了让主线程适时地处理新启动的线程所发送的消息,显然只能通过回调的方式来实现,

开发者只要重写Handler类中的处理消息的方法,当新启动的线程发送消息时,消息会发送

到与之关联的消息队列,而Handler会不断地从消息队列中获取并处理消息,这就导致

Handler类中的处理消息的方法被回调。

Handler,Loop,MessageQueue的工作原理

与Handler一起工作的几个组件:

1.Message:Handler接收和处理的消息对象。

2.Looper:每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的

消息,读到信息后就把消息交给发送该消息的Handler进行处理。

3.MessageQueue:消息队列,它采用先进先出的方式来管理Message。程序创建Looper

对象时会在它的构造器中创建Looper对象。

Handler:它的作用是发送消息和处理消息,程序使用Handler发送消息,被Handler发

送的消息必须被送到指定的MessageQueue。也就是说,如果希望Handler正常工作,必须

在当前线程中有一个MessageQueue,否则消息就没有MessageQueue进行保存了。不过

MessageQueue是由Looper负责管理的,也就是说,如果希望Handler正常工作,必须在

当前线程中有一个Looper对象。为了保证当前线程中有Looper对象,可以分如下两种情

况处理:

1.主UI线程中,系统已经初始化了一个Looper对象,因此程序直接创建Handler即可,

然后就可通过Handler来发送消息,处理消息。

2.程序员自己启动的子线程,程序员必须自己创建Looper对象,并启动它。创建Looper

对象调用它的prepare。方法即可。

在线程中使用Handler的步骤如下:

1.调用Looper的prepare。方法为当前线程创建Looper对象,创建Looper对象时,它的

构造器会创建与之配套的MessageQueue。

2,有了Looper之后,创建Handler子类的实例,重写handleMessage。方法,该方法负责

处理来自于其他线程的消息。

3.调用Looper的loop。方法启动Looper。

异步任务(AsyncTask)

为了解决新线程不能更新UI组件的问题,Android提供如下几种解决方案:

1.使用Handler实现线程之间的通信。

2.Activity.runOnUiThread(Runnable)

3.View.post(Runnable)

4.View.postDelayed(RunnableJong)

2,3,4的方式可能导致编程比较繁琐,而异步任务则可进一步简化这种操作。

一个抽象类,通常用于被继承,继承AsyncTask是需要指定如下三个泛型参

数:

•Params:启动任务执行的输入参数类型。

•Progress:后台任务完成的进度值的类型。

•Result:后台执行任务完成后返回结果的类型。

使用AsyncTask只要如下3步即可:

1.创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类

型,可将它指定为void。

2.根据需要,实现AsyncTask的如下方法:

•dolnBackgroud(Params--)

•onProgressUpdate(Progress-values)

•onPreExecute()

・onPostExecute(Resultresult)

3.调用AsyncTask子类的实例execute(Params,params)开始执行耗时任务。

使用AsyncTask时必须遵守的规则:

1.必须在UI线程中创建AsyncTask的实例。

2.必须在UI线程中调用AsyncTask的execute。方法。

3.AsyncTask的onPreExecute(),onPostExecute(Resultresult),

dolBackground(Params--params),onProgressUpdate(Progress…values)方法,不应该由

程序员代码调用,而是由Android系统负责调用。

4.每个AsyncTask只能被执行一次,多次调用将会引发异常。

深入理解Activity与Fragment

目录

深入理解Activity与Fragment18

Activity是什么18

建立,配置和使用Activity18

启用,关闭Activity19

使用Bundle在Activity之间交换数据19

启动其他Activity并返回结果20

Activity的回调机制20

Activity的生命周期与加载模式20

Fragment详解22

Fragment与Activity通信23

Fragment管理与Fragment事务24

Fragment的生命周期24

Activity是什么

Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。

Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过

setContentView(View)来显示指定控件。

在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些

控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。

建立,配置和使用Activity

建立自己的Activity需要继承Activity基类,创建Activity需要实现一个或多个方法。

LauncherActivity开发启动Activity的列表

LauncherActivity继承了ListActivity,它开发出来的列表界面中每个列表项都对应一个

Intent,因此当用户单击不同的列表项时,应用程序会自动启动对应的Activity。需要为它设

置Adapter数据,重写IntentintentForPosition(int),该方法根据不同列表项返回不同的Intent

(用于启动不同的Activity)。

ExpandableListActivity:用于显示一个可展开的列表窗口。

PreferenceActivity:用于显示一个显示设置选项参数并进行保存的窗口。

创建PreferenceActivity它需要建立选项设置的布局文件。Android3.0建议将

PreferenceActivity与preferenceFragment结合使用,PreferenceActivity负责加载选项设置

列表的布局文件,preferenceFragment负责加载选项设置的布局文件。

当加载了选项布局文件并建立相应的Activity类后,还需要在AndroidManifest.xml清单

文件中配置Activity才能使用Activity类。

最后程序所设置的参数将会保存在/data/data/<应用程序包名〉/shared_prefs路径下,

文件名为〈应用程序包g>_preferences.xml。

启用,关闭Activity

一个Android应用通常都会包含多个Activity,但只有一个Activity会作为程序的入口,

当该Activity应用运行时将会自动启动并执行该Activity。至于应用中的其他Activity,通常

都由入口Activity启动,或由入口Activity启动的Activity启动。

Activity启动其他Activity有如下两个方法:

1.startActivity(Intentintent):启动其他Activity。

2.startActivityForResult(lntentintent,intrequestCode):以指定的请求码来启动Activity,

而且程序将会等到新启动Activity的结果(通过重写onActivityResult。方法来获取),

requestCode参数的值由开发者根据业务自行设置,用于标识请求来源。

关闭Activity也有如下两个方法:

1.finish():结束当前Activity

3.finishActivity(intrequestCode):结束以startActivityForResult(lntentintent,int

requestCode)方法启动的Activity0

使用Bundle在Activity之间交换数据

当一个Activity启动另一个Activity时,常常会有一些数据需要传过去。在Activity之间

进行数据交换更简单,因为两个Activity之间本来就有一个信使Intent,因此我们主要将需

要交换的数放入Intent即可。

Intent主要通过Bundle对象来携带数据。它主要提供了如下方法存取数据:

1.putXxx(Stringkey.Xxxdata)

2.putSerializable(Stringkey,Serializabledata)

3.getXxx(Stringkey)

4.getSerializable(Stringkey,Serializabledata)

启动其他Activity并返回结果

Activity提供了一个startActivityForResult(lntentintent,intrequestCode)方法来启动其他

Activity,,该方法用于启动指定Activity,而且期望获取指定Activity返回的结果。它也是通过

Bundle进行数据交换的,为了获取被启动的Activity所返回的结果,需要从两方面入手:

1.当前Activity需要重写onActivityResult(intrequestCode,intresultCode,Intentintent),当

被启动的Activity返回结果时,该方法将会被触发,其中requestCode代表请求码,而

resultcode代表Activity返回的结果码,这个结果码也是由开发者根据业务自行设定的。

2.被启动的Activity需要调用setResult。方法设置处理结果。

一个Activity中可能包含多个按钮,并调用多个startActivityForResult。方法来打开多个

不同的Activity处理不同的业务,当这些新的Activity关闭后,系统都将回调前面Activity的

onActivityResult(intrequestCode,intresultCode,Intentdata)方法。为了知道该方法时由哪个

请求的结果所触发的,可利用requestCode请求码;为了知道返回的数据来自于哪个新的

Activity,可利用resultCode结果码。

Activity的回调机制

当开发者开发一个组件时,如果开发者需要该组件能响应特定的事件,可以选择性实现

该组件的特定方法,当用户在该组件上激发

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论