Android学习路线指南
http://blog.csdn.net/singwhatiwanna/article/details/49560409?utm_source=tuicool&utm_medium=referral
1 开发环境搭建
1.1 Mac下AndroidStudio环境搭建
Android开发~Android Studio环境篇(Mac环境)
http://m.blog.csdn.net/blog/zfpp25_/40947791
2 Android应用层程序的开发模式
2.1 应用程序开发的结构
Android 应用程序开发是Android 开发中最上面的一个层次,它们构建在Android 系统提供的API 之上。Android 应用程序的基础是Android 提供的各个Java 类,这些类组成了Android 系统级的API。
Android应用程序可以基于两种环境来开发:Android SDK和Android 源代码。Android 系统本身内置了一部分标准应用(也包括内容提供者),在仿真器(包括SDK 环境和源代码环境)中已经包含这些内置的程序。用户自行开发的应用程序和Android 内置的应用层程序包位于同一个层次,_都是基于Android 框架层的API 来构建的,它们的区别仅仅在于他们是否被包含在默认的Android 系统中。
2.2 API参考文档的使用
在开发Android应用程序时可以参考SDK中提供的参考文档,其内容包含在Reference标签中。参考文档分成两种索引方式:
1、Package Index(包索引);
2、Class Index(类索引)。
包索引根据字母顺序列出Android的各个包,每个包中包含若干个类、接口等内容;类索引按照字母顺序列出了所有的类(也包括接口等内容)。在查找一个类的帮助信息时,如果不知道其属于哪个包,则可以先根据类索引进行查找,打开类的帮助后,可以反向得知它属于哪个包。
根据包索引,每一个包中包含的主要内容大致如下所示:
1、Interfaces(接口类);
2、Classes(类);
3、Enums(枚举值);
4、Exceptions(异常)。
每个包中包含的内容,基本上是Java语言中标准的内容。
Android的参考文档中的类是Android系统API的主要组成部分,主要参考的内容包括了以下的内容。根据类索引,每一个类中包含的主要内容大致如下所示:
1、扩展和实现的内容;
2、按包名的继承(扩展)关系(可用于反向查找这个类所在的包);
3、Overview(概览);
4、XML Attributes(XML属性);
5、Constants(常量);
6、Constructors(构造方法);
7、Methods(方法)。
在这些帮助内容中,大部分是Java语言的基本语法内容,只有XML Attributes(XML属性)一项是Android专用的。某些重要的类还包含对于类的详细介绍的图表。
3 工程结构
3.1 eclipse源文件目录结构
SkeletonApp工程的源文件的结构按照目录树的方式如下所示:
3.1.1 Android.mk文件
Android.mk文件是Android的工程管理文件,这个文件只在源代码开发的时候使用,在SDK的开发中不需要使用,它包含在工程的根目录中,其内容如下所示:
Android.mk文件是Android编译过程中通用的工程管理文件,本地程序、本地库和Java程序包都使用这个文件。这个文件仅仅在基于源代码开发的情况中使用,在Java应用程序工程的管理中,该文件不用定义过多的内容,其中关键的内容是使用include $(BUILD_PACKAGE)表示从当前目录编译Java应用程序包。LOCAL_PACKAGE_ NAME定义的是这个程序的APK包的名称。LOCAL_MODULE_TAGS表示这个包的类型。
这个包的LOCAL_MODULE_TAGS定义成了samples,这将编译APK包,但是不安装在系统中。使用不同的值,可以决定是否编译和安装,例如使用eng,将安装到目标系统中。
最后一行的include$(call all-makefiles-under,$(LOCAL_PATH)),表示包含本目录的子目录中的Android.mk文件,本例中也就是tests目录中的内容。
3.1.2 AndroidManifest.xml文件
AndroidManifest.xml文件是这个Android应用程序的工程描述文件,包含了宏观上的内容,如下所示:
application(表示应用程序)标签中包含了一个activity(表示活动)。活动是应用程序中的一个组件,一个应用程序中也可以包含若干个组件:
包名定义为com.example.android.helloactivity,表示将从src目录的com/example/android/helloactivity 中寻找程序中的Java源代码。
Activity名称将被定义为HelloActivity,表示活动的代码是上述源代码目录中的HelloActivity.java文件。
intent-filter中的内容指定了程序的启动方式,这里category中的android.intent.category.LAUNCHER表示活动将在Android的桌面(Android默认的桌面程序名称也是LAUNCHER)上出现。
这里指定application的android:label为"Hello,Activity!",这和桌面图标下面的文字以及活动启动后上面的标题文字是一致的。本例没有指定图标,所以桌面上的图标使用的是默认图标。
在AndroidManifest.xml文件中为一个活动指定label(标签)和icon(图标)的方法 如下所示:
android:label指定为字符串、android:icon指定为图标后,将使用res/drawable中对应名称的图片文件作为图标(本例中将使用icon_name.png)。activity和application都具有android:label和android:icon等属性,由于活动是程序的单元,且应用可以包含多个活动,因此程序首先将使用activity中的这些标签,如果没有则使用上一级的application中标签的定义。
3.1.3 源代码文件
HelloActivity工程只有一个源代码文件HelloActivity.java,位于这个工程src目录下的com/example/android/helloactivity中,内容如下所示:
这里的类HelloActivity继承实现了Android系统API提供的活动类(Activity),使用setContentView(R.layout.hello_activity)指定了当前活动的布局,这里表示将从res/layout目录中找到hello_activity.xml文件作为本例的布局文件使用。
3.1.4 布局文件
hello_activity.xml是本程序中的布局文件,在Java源文件中使用了此文件。本文件在res/layout目录中,其内容如下所示:
在这个布局文件中,只定义了一个UI元素——EditText,就是在界面上出现的占据全屏的可编辑文本框。在这里定义了这个可编辑文本框的初始化字符串为"@string/hello_activity_text_text",这个值在另外的资源文件中被定义,本例就是string.xml。
3.1.5 其他资源文件
string.xml是本例中的一个资源文件,其内容如下所示:
这里定义了名称为“hello_activity_text_text”的字符串的内容为Hello,World!,这就是出现在屏幕上的字符串。
资源目录res中的values目录中除了strings.xml 文件,还可以包含colors.xml和styles.xml文件,这两种文件也是Android中的标准资源文件。
资源目录res还可包含drawable目录,表示可以绘制的内容,这里的violet.jpg是一个jpeg的文件。在布局文件skeleton_activity.xml中的部分内容引用了以上的资源。
JAVA源代码SkeletonActivity.java中构建了菜单、按钮的动作等功能。
3.2 工程的编译结构
在Android的SDK环境开发中,工程经过编译后,SDK环境下开发生成的所有目标文件均在当前工程目录中,包含了assets、bin、gen等目录。
在gen目录中,包含了以类的层次关系为结构的资源文件。例如,gen/com/ example/android/helloactivity目录中的R.java就是HelloActivity中的资源文件。
在bin目录中,目录结构按照类的关系组织,com/example/android/helloactivity子目录包含了经过编译后的各个Java类,以.class为后缀。
在bin目录中包含的classes.dex文件是编译后的,可以在Dalvik虚拟机上运行的Java的字节码文件,生成的HelloActivity.apk文件是最终的APK文件,可以在兼容的Android API的目标系统中安装,进而运行程序。HelloActivity.apk经过解压缩后,包含了下面的一些内容:
在这里drawable中图片文件保持原状,layout中的布局文件经过aapt处理成为压缩的文本文件,其他的资源文件在最终的程序包中,不再单独存在。
3.3 Android Studio工程目录结构
Project 结构类型:
第一,把这么多文件先分成这么三块
1. 编译系统(Gradle)
2. 配置文件
3. 应用模块
3.3.1 Gradle模块
Gradle是Google推荐使用的一套基于Groovy的编译系统脚本(当然,你也可以使用ant),具体的介绍和文档可以参考这个传送门:https://developer.android.com/tools/building/plugin-for-gradle.html
如果你学会之后,会对Android项目的编译了如指掌(总之非常爽~),它的缺点目前是效率不高,然后因为有功夫网的存在,所以在bintray上下载依赖会比较慢。
上面那个图中出现gradle字眼的就是gradle相关的一些文件。
Android中使用Gradle Wrapper对Gradle进行了一层包装,我猜测这么做的原因是因为gradle更新速度实在太快,为了兼容性着想,才出了这么一套方案。(如果觉得这个猜想有问题请指正)gradlew相关的文件就是和Gradle Wrapper有关。我们对除了app文件夹以外的文件列一下。
3.3.2 App模块
app模块里的文件
这是app模块下的文件目录结构,介绍下他们的用途
以上就是对Android Studio目录结构的简单介绍~
Android Studio目录结构浅析
https://segmentfault.com/a/1190000002963895
4 Android应用程序的内容
4.1 Android应用程序的概念性描述
Android应用程序包含了工程文件、代码和各种资源,主要由Java语言编写,每一个应用程序将被编译成Android的一个Java应用程序包(*.apk)。由于Android系统本身是基于Linux操作系统运行的,因此Android应用程序也运行于Linux环境中,它们具有以下的特点:
1、在默认情况下,每一个应用程序运行于它们的Linux进程中;
2、每个进程具有自己的虚拟机(VM),所以每个应用程序运行于独立的环境中;
3、在默认情况下,每一个应用程序具有唯一的Linux用户ID。通过设置权限让应用程序只对用户和应用程序本身可见,也有一些方法可以把它们暴露给其他的应用程序。
4.1.1 应用程序的组成部分
一般情况下,Android应用程序由以下4种组件构成:
1、活动(Activity);
2、广播接收器(BroadcastReceiver);
3、服务(Service);
4、内容提供者(Content Provider)。
一个Android应用程序是一个包(Package),包中可能包含一个或者多个Android组件(component)。
(1)活动(Activity)
活动是最基本的Android应用程序组件,在应用程序中,一个活动通常就是一个单独的用户界面。每一个活动都被实现为一个独立的类,并且从活动(Activity)基类中继承而来,活动类将会显示由视图(View)控件组成的用户接口,并对事件(Event)做出响应。大多数的应用程序都会有多个用户界面,因此便会有多个相应的活动。
Android的一个活动一般对应界面中的一个屏幕显示,可以理解成一个界面,每一个活动在界面上可以包含按钮、文本框等多种可视的UI元素。
(2)广播接收器(BroadcastReceiver)
广播接收器用于让应用程序对一个外部事件做出响应。例如:电话呼入事件、数据网络可用通知或者到了晚上时进行通知。
(3)服务(Service)
一个服务是一个具有一段较长生命周期但没有用户界面的程序。例如:一个正在从播放列表中播放歌曲的媒体播放器在后台运行。
(4)内容提供者(Content Provider)
应用程序能够将它们的数据保存到文件或SQLite数据库中,甚至是任何有效的设备中。当需要将数据与其他的应用共享时,内容提供者将会很有用。一个内容提供者类实现了一组标准的方法,从而能够让其他应用程序保存或读取此内容提供者处理的各种数据类型。
4.1.2 应用程序的生命周期
Android系统中的不同组件具有不同的生命周期。Android 根据每个进程中运行的组件以及组件的状态把进程放入一个重要性分级(importance hierarchy)中。Android进程的重要性分级,可以理解成执行的优先级。Android进程的类型包括(按重要性分级排序):
(1)前台(Foreground)进程
与用户当前正在做的事情密切相关,不同的应用程序组件能够通过不同的方法使它的宿主进程移到前台。当下面任何一个条件满足时,都可以考虑将进程移到前台。
1、进程正在屏幕的最前端运行一个与用户交互的Activity(它的onResume()方法被调用);
2、进程有一个正在运行的BroadcastReceiver(它的BroadcastReceiver.onReceive()方法正在执行);
3、进程有一个Service,并且在Service的某个方法(Service.onCreate()、Service.onStart()或者Service.onDestroy())内有正在执行的代码。
(2)可见(Visible)进程
它有一个可以被用户从屏幕上看到的Activity,但不在前台——其onPause()方法被调用。例如:如果前台的Activity是一个对话框,以前的Activity隐藏在对话框之后,就可能出现这种进程。这样的进程很重要,一般不允许被杀死,除非为了保证前台进程的运行不得不这样做。
(3)服务(Service)进程
有一个已经用startService() 方法启动的Service,虽然这些进程用户无法直接看到,但它们做的事情却是用户所关心的(例如:后台MP3回放或后台网络数据的上传/下载)。因此,系统将一直运行这些进程,除非内存不足以维持所有的前台进程和可见进程。
(4)后台(Background)进程
拥有一个当前用户看不到的Activity(它的onStop()方法被调用),这些进程对用户体验没有直接的影响。如果它们正确执行了Activity生命周期,系统可以在任意时刻杀死进程来回收内存,并提供给前面3种类型的进程使用。系统中通常有很多这样的进程在运行,因此要将这些进程保存在LRU 列表中,以确保当内存不足时用户最近看到的进程最后一个被杀死。
(5)空(Empty)进程
不包含任何处于活动状态的应用程序组件。保留这种进程的唯一原因是,当下次应用程序的某个组件需要运行时,不需要重新创建进程,这样可以提高启动速度。
以上所说的“进程”是从系统运行的角度考虑的,各种不同的进程可以理解成Android的各种组件的不同状态机(state machine)。如果从应用程序的代码以及运行情况考虑,可以关注Android的各种组件相对应的生命周期。
1.活动Activity的生命周期
Activity是Android中最重要、最基础的组件,用户在界面上看到的一个个可以切换的屏幕界面就是Android中的Activity。Activity的生命周期如图1所示。
a. 运行Activity的情景:当一个Activity被启动时,Activity中的onCreate()、onStart()和onResume()这3个方法被依次调用,Activity对应的界面出现在屏幕上。
b. Activity被“覆盖”的情景:Android的Activity一般都占据一个完整的屏幕,从当前Activity启动另外一个Activity时,另一个Activity将被启动到前台(Foreground),当前Activity转入后台(Background),这时Activity的onPasuse()方法将被调用,Activity转入后台运行。如果Activity变为不可见,还将调用onStop()方法。在转入后台时,onStop()是否被调用取决于Activity是否被完全覆盖,在新的Activity有透明部分时,转入后台的Activity依然“可见”,其他情况下(较多数的情况)Activity均进入不可见状态(被完全覆盖)。
c. Activity被恢复的情景:当界面上最前面的Activity退出后,它所覆盖的Activity将被恢复,这时onResume()方法将被调用,Activity重新转入前台运行。
d. Activity完全退出的情景:当使用回退(Back)按钮退出Activity时,onDestroy()方法将被调用,Activity关闭。如果系统缺少内存时,也会杀死(kill)后台的Activity,其中优先杀死不可见的Activity,可见的Activity一般不会被杀死。
2. 服务的生命周期服务
可以长时间运行,它的特点是没有可视化界面,服务的生命周期如图2所示。
使用StartService运行服务的情景:使用这种方法启动服务,服务的onCreate()和onStart()这两个方法将被调用,服务会在后台运行直到退出,退出时将调用onDestroy()方法。
使用bindService运行服务的情景:使用这种方法启动服务,调用者(也就是服务的客户端)将获得和服务交互的类,通过其调用时服务的相关内容会处于活动状态。
3.广播接收器的生命周期
广播接收器有一个单一的回调方法onReceive(),当广播消息到达接收器时,Android将调用这个方法,并传递给包含在这个消息中的Intent 对象。
广播接收器只有在这个方法的执行过程中才处于活动状态,当onReceive()返回后,广播接收器将不再处于活动状态。广播接收器的功能类似于一个回调函数,只是单次运行时处于活动状态。
4.2 应用程序包含的各个文件
Android应用程序一般包含在一个单一的文件夹中,即每一个Android应用程序是一个独立的工程,包含了以下文件:
1. Android.mk:统一工程文件,在SDK开发中可以不需要;
2. AndroidManifest.xml:工程描述文件,在其中定义了各种组件;
3. Java源代码:按照Java包的方式来组织目录结构,包括各个Java类的源代码;
4. 资源文件:包含XML文件、图片、原始数据文件等,其中表示界面情况的布局(Layout)文件比较重要。
在编译Android应用程序的过程中,Java源代码使用Sun JDK将Java源程序编译成Java字节码文件(多个后缀名为.class的文件),这一步骤和标准的Java一致,然后通过Android自带的工具软件dex把所有的字节码文件转成dex文件(单一文件classes.dex)。
AndroidManifest.xml文件经过Android打包工具(aapt)处理后形成二进制格式AndroidManifest.xml文件,实质的内容与以前相同。
各个资源文件也经过aapt处理,其中布局等文本文件处理成二进制文件,图片等文件保持不变。
最后将这三个部分组合成一个应用程序包(*.apk)。AndroidManifest.xml描述文件、Java源文件、资源文件是Android应用程序的三个部分;在编译之前的工程中是这三个部分,在编译之后APK包依然是由这三个部分组成的。
Android应用程序的编译过程如图所示:
在运行时,APK 包将首先进行“安装”,也就是将其中的dex 文件进行优化,优化后的文件被保存到缓存区域,生成格式为dey 的优化文件,然后Dalvik虚拟机将运行这些dey 文件。如果应用程序包文件不发生变化,dey 文件不会被重新生成;在应用程序包发生更新的情况下,将重新由dex 生成dey。
Android 和标准JAVA 开发的JAR 包最大的不同在于,标准JAVA 字节码是每个文件一个Clash 文件,而Android 中的一个包将生成一个Dex 文件。
4.3 使用am工具启动Android应用程序
除了在GUI界面中启动应用程序之外,在Android的命令行终端(可以使用adb shell进行连接)也可以使用am工具启动应用程序。
启动Android摄像机程序的命令如下所示:
5 UI的基本外形和控制
对于一个GUI系统地使用,首先是由应用程序来控制屏幕上元素的外观和行为,这在各个GUI 系统中是不相同的,但是也具有相通性。Android 系统在这方面,包含了基本的控件控制,键盘事件响应,窗口间跳转、对话框、菜单、样式等内容,这是GUI 系统所具有的通用内容。
5.1 控制和基本事件的响应
在任何一个GUI 系统中,控制界面上的控件(通常称为控件)都是一个基本的内容。对于Android 应用程序,控件称为View。在Android中,在处理UI中的各种元素的时候,两个程序中的要点为:
1. 得到布局文件(XML)中的控件句柄
2. 设置控件的行为
5.1.1 第一种事件响应方法——新建接口实例
根据以上的布局文件中定义的两个按钮和一个文本框,这个布局文件被活动设置为View后,显示的内容就如上图所示,只是行为还没有实现。
行为将在源代码文件TestEvent1.java中实现,这部分的代码如下所示:
在创建的过程中,通过findViewById获得各个屏幕上面的控件(控件)的背景,这里使用的R.id.button1等和布局文件中各个元素的id是对应的。
根据Button 控件的setOnClickListener()设置了其中的点击行为,这个方法的参数实际上是一个View.OnClickListener类型的接口,这个接口需要被实现才能够使用,因此在本例的设置中,实现了其中的onClick()函数。这样既可实现点击的时候实现相应的功能,在点击的函数中,将通过Text的句柄对其进行控制。
在Android的控件使用方面,这两个编程方面要点是:
1. 使用findViewById()获取布局文件(XML)中控件的句柄;
2. 使用setOnXXXListener()设置事件处理函数。
在获取句柄时需要转换成相应的控件类型,findViewById()函数的参数是一个整数,返回值是一个android.view.View类型。通过R.id.XXX找到布局文件中定义的ID,然后通过将基础类转换成其实际的类获得真正的句柄。注意:所转换类必须和布局文件中描述的控件一致。
SetOnXXXListener()等函数是android.view.View类的函数,各种控件(包括Button、EditText)都扩展这个类,同族的函数包括:
5.1.2 第二种事件响应方法——通过实现接口
这个例子的主要变化是让活动实现(implements)了OnClickListener()这个进口,也就是需要实现其中的onClick()方法。然后通过setOnClickListener()将其设置到按钮中的参数就是this,表示了当前的活动。通过这种方式的设置,如果程序中有多个控件需要设置,那么所设置的也都是一个函数。为了保证对不同控件具有不同的处理,可以由onClick()函数的参数进行判断,参数是一个View类型,通过getId()获得它们的ID,使用switch…case分别进行处理。
5.1.3 第三种响应方法——自定义实现OnClickListener接口
本例通过定义实现活动类中的2个子类,来实现View.OnClickListener这个接口,这种方式是一种最为直接的方式,即为不同的控件单独实现它的相应类。
5.2 键盘事件的响应
本例需要实现的内容是通过键盘来控制屏幕上的一个图片的Alpha值,使用上键和右键增加图片的Alpha值,使用下键和左键减少图片的Alpha值。显示内容如下所示:
本例子使用onKeyDown()函数来获得按键的事件,同类的函数还包括onKeyUp()函数,其参数int keyCode为按键码,KeyEvent msg表示按键事件的消息(其中包含了更详细的内容)。
基本上通过keyCode可以获得是哪一个按键响应,而通过msg除了按键码之外,可以获得按键的动作(抬起、按下)、重复信息,扫描码等内容。KeyEvent主要包含以下一些接口:
5.3 运动事件的处理
触摸屏(TouchScreen)和滚动球(TrackBall)是Android中除了键盘之外的主要输入设备。如果需要使用触摸屏和滚动球,主要可以通过使用运动事件(MotionEvent)用于接收它们的信息。触摸屏和滚动球事件主要通过实现以下2个函数来接收:
本例介绍另外触摸屏事件的程序,这个程序在UI的界面中,显示当前的MotionEvent的动作和位置。
5.4 屏幕间的跳转和事件的传递
在一般情况下,Android的每一个屏幕基本上就是一个活动(Activity),屏幕之间的切换实际上就是在活动间互相调用的过程,Android使用Intent完成这个动作。Android屏幕跳转的关系和方式如下图所示:
5.4.1 Intent跳转方法
本示例是一个简单的屏幕之间的跳转,从一个屏幕跳转到另一个屏幕,在启动第二个屏幕后,前一个屏幕消失。
参考示例程序:Forward(ApiDemo => App=_>_Activity=_>_Forward)
源代码:com/example/android/apis/app/Forward.javacom/example/android/apis/app/ForwardTarget.java
布局资源代码:forward_target.xml和forwarding.xml
本示例包含了两个活动,在UI 上它们就是两个屏幕,分别为跳转的源和目的,因此在AndroidManifest.xml 中分别定义。
两个活动的名称分别为Forwarding和ForwardTarget,由于第二个活动没有intent-filter,因此在程序中只能由第一个活动来启动。Forward程序的运行结果如图所示:
点击“Go”按钮从Forward跳转到ForwardTarget,这个内容在Java源文件Forward.java的以下片段中处理:
启动第二个活动需要使用Intent,在其setClass()函数中设置源和返回的内容,Intent 是android.content包中的类,用于启动活动、服务或者消息接收器。
这里使用的Intent的setClass()的方法的原型如下所示:
第一个参数是当前的上下文类型Context,因此把当前的活动设置过去即可(Activity本身继承了Context),第二个是Intent所包含的JAVA类,直接设置ForwardTarget.class类即可。
本例中使用了finish()函数表示当前的活动结束,这样在第二个活动(ForwardTarget)启动时,第一个活动(Forward)已经不存在了。如果没有调用finish()函数,第二个活动启动时,第一个活动就处于OnPause状态,当第二个活动退出后,第一个活动重新出现,也就是会调用活动的onResume()函数。
5.4.2 带有返回值的跳转
在某些时候,从跳转的对象返回时,跳转源头需要得到其返回的结果,这样两个屏幕才可实现一些交互。
参考示例程序:ReceiveResult(ApiDemo => App=>Activity=>ReceiveResult)
源代码:com/example/android/apis/app/ReceiveResult.javacom/example/android/apis/app/SendResult.java
布局资源代码:receive_result.xml和send_result.xml
ReceiveResult程序的运行结果如图所示:
被跳转的目标的Java源文件SendResult.java的代码片段如下所示:
被跳转的目标程序将返回值返回,这里使用的依然是Intent作为交互的信息,通过setAction()设置不同的活动。
由于被跳转的目标程序,是被显示Intent调用起来的。因此,返回后继续由ReceiveResult.java对返回值进行处理。返回的信息通过扩展Activity的onActivityResult()函数来实现,两个整数类型的参数requestCode和resultCode分别代表请求代码和结果码,第三个参数Intent(类型data)表示活动间交互附加的数据信息。
这里onActivityResult()是一个被继承的函数,其参数data就是这个活动作为返回值接受到,data.getAction()可以从返回的Intent中取回内容。这里的参数requestCode也是根据当时的在调用startActivityForResult()的时候指定的返回值。
Android中使用Intent并使用startActivity()和startActivityForResult()调用一个新的活动,实现屏幕的跳转功能,调用者可以获得跳转对象的返回信息。
5.5 菜单的使用
在Android中具有单独接口,用于在活动中使用菜单。本例使用一个菜单来控制按钮的背景颜色,从其中可以了解如何在应用程序中使用菜单。
onCreateOptionsMenu()用于在建立菜单时进行设置,建立时为每一个按钮设置ID,菜单项被选择时调用onOptionsItemSelected(),通过MenuItem类的getItemId()函数获得这个菜单的ID,继续进行处理。
菜单类在Android中表示为android.view.Menu类。使用这个类可以进行一些更为细节的设置和操作。
5.6 弹出对话框
对话框的父类是android.app.Dialog,通过构建类android.app.AlertDialog来实现弹出式对话框,可以使用AlertDialog.Builder和不同的参数来构建对话框。
参考示例程序:Dialog(ApiDemo => App=_>_Dialog)
源代码:com/example/android/apis/app/AlertDialogSamples.java
布局文件:alert_dialog.xml Dialog程序的运行结果如图所示:
通过点击屏幕上的不同按钮(第4个按钮除外)将会启动不同的对话框。实现方法是继承onCreateDialog()函数,返回一个Dialog类型:
5.6.1 提示信息和两个按钮的对话框
第1个按钮(OK Cancel dialog with a message)启动一个提示信息和两个按钮的对话框,如图所示:
其中,setPositiveButton表示设置的左面的按钮,setNegativeButton表示设置的右面的按钮,这两个按钮是确定的,但是可以设置其显示的字符和点击后的行为函数。
5.6.2 提示信息和三个按钮的对话框
第2个按钮(OK Cancel dialog with a long message)启动一个提示信息和三个按钮的对话框,如图所示:
5.6.3 列表项对话框
第3个按钮(List dialog)启动一个列表项对话框,如图所示;
5.6.4 单选项和按钮对话框
第5个按钮(Single choice list)启动一个单选项和按钮对话框;
5.6.5 复选项和按钮对话框
第6个按钮(Repeat alarm)启动一个复选项和按钮对话框;
5.6.6 文本的按键对话框(使用布局文件)
第7个按钮(Text Entry dialog)启动一个包含文本的按键对话框。Dialog程序中调用各个对话框的效果如图所示:
编辑文本,这就是显示在屏幕上的内容,由此根据这种模式,也可以在弹出的对话框中使用布局文件。
对话框可以设置标题、图标、提示信息、最多3个按钮、单选项、复选项,甚至可以设置一个View。最后一个对话框是通过设置一个View来实现的,设置的内容在布局文件alert_dialog_text_entry.xml中。对话框的类为android.app.Dialog,通过android.app.AlertDialog.Builder类来建立,在建立的过程中可以进行多项设置。
1. setIcon()和setTitle():用于设置图标和标题;
2. setMessage():用于设置提示信息;
3. setPositiveButton()、setNeutralButton()和setNegativeButton():用于设置左、中、右按钮;
4. setSingleChoiceItems()和setMultiChoiceItems():用于设置单选项和复选项;
5. setView():用于设置一个View作为对话框的内容。
以上函数的返回类型均为android.app.AlertDialog.Builder,也就是这个类本身,因此可以使用如下的方式进行连续调用来设置更多的内容。
设置完成后调用create()函数返回android.app.AlertDialog类,这个类表示一个可以使用的对话框。
在Android中使用对话框,可以在没有Activity的情况下建立一个比较简易的窗体,基本界面可以通过直接设置得到,通过setView()可以获得任意内容的界面。
5.7 样式的设置
在Android中,应用程序所呈现的样子不完全由布局文件和源代码决定。通过在AndroidManifest.xml中设置样式,也可以控制活动的外观,所设置的样式可以基于预定的样式,也可以自定义样式。
5.7.1 预定样式对话框
在Android中,定义了一些具体的样式,它们可以在应用程序中被使用。本示例介绍如何使用Android中的预定义样式。
参考示例程序:DialogActivity(ApiDemo=>App=>Activity=>Dialog)
源代码:com/example/android/apis/app/DialogActivity.java
布局文件:custom_dialog_activity.xml
AndroidManifest.xml中的定义如下所示:
Theme.Dialog是Android中的预定义样式。
6 参考资料
6.1 较好地参考书目
Android入门到精通详解
Android开发权威指南.李宁.扫描版
Android移动开发一本就够
Android 4.X应用与开发实战手册 适用Android 4.X-2.X
6.2 参考链接
Mac下Android Studio简单使用
http://blog.sina.com.cn/s/blog_75992b660101kb7z.html
(Good)最全面的AndroidStudio使用教程
http://www.open-open.com/lib/view/open1416883124753.html