描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302488675丛书名: 深入浅出系列规划教材
本书可作为普通高等学校计算机、通信、电子信息类本专科及各类培训机构Android软件开发课程的教材,也可作为Android程序设计爱好者的自学用书。
目录
第1章Android软件开发起步1
1.1智能移动设备及其操作系统1
1.2Android系统的体系结构3
1.2.1Android系统简介3
1.2.2Android系统的总体架构3
1.2.3Android SDK简介5
1.3Java语言与面向对象编程基础7
1.3.1配置Java开发环境7
1.3.2Java程序的开发过程8
1.3.3Java程序的结构10
1.3.4Java的数据类型和运算符12
1.3.5Java的流程控制语句14
1.3.6数组16
1.3.7泛型18
1.3.8面向对象的编程方法19
1.3.9异常处理23
1.4XML基础23
1.4.1XML简介23
1.4.2XML的用途26
1.4.3XML文档的结构26
1.4.4XML语法27
1.4.5XML命名空间31
1.5编写规范的Android代码33
1.6本章小结34
习题34
第2章创建个Android应用程序37
2.1搭建Android应用程序开发环境37
2.1.1Android Studio简介37
2.1.2Android Studio的安装38
2.1.3创建和启动Android虚拟设备41
2.1.4Android Studio的更新与设置44
2.2创建个Android应用程序51
2.2.1创建Android工程项目51
2.2.2编译和运行Android应用程序54
2.3Android Studio工程项目的文件构成56
2.3.1java文件夹56
2.3.2res文件夹58
2.3.3应用程序配置文件AndroidManifest.xml60
2.3.4Gradle文件62
2.4开发Android应用软件的一般流程64
2.4.1开发Android应用软件的一般流程64
2.4.2APK文件的签名和打包66
2.5程序调试的常用方法和调试工具68
2.5.1使用Android Studio的调试器68
2.5.2图形化调试工具DDMS70
2.5.3查看工程项目在运行过程中的日志信息71
2.6本章小结73
习题73
〖1〗〖2〗Android软件开发教程(第2版)〖1〗目录〖2〗第3章Activity的界面布局74
3.1Activity及其生命周期74
3.1.1Android应用的基本组件74
3.1.2什么是Activity75
3.1.3Activity的生命周期76
3.1.4Activity的启动模式80
3.1.5Context及其在Activity中的应用83
3.2布局文件及其加载83
3.2.1View类和ViewGroup类84
3.2.2XML布局及其加载85
3.2.3在Activity中定义和引用布局86
3.2.4资源的管理与使用87
3.3界面元素的常用属性93
3.3.1控件ID及其使用93
3.3.2布局尺寸参数及其使用94
3.3.3XML常用布局控件的标签及属性95
3.4常用的布局96
3.4.1线性布局LinearLayout96
3.4.2布局AbsoluteLayout99
3.4.3相对布局RelativeLayout100
3.4.4表格布局TableLayout102
3.4.5帧布局FrameLayout104
3.5本章小结107
习题107
第4章常用界面控件及其应用108
4.1Widget控件概述108
4.2Android的事件处理机制108
4.2.1基于监听接口的事件处理方式109
4.2.2基于回调机制的事件处理113
4.2.3直接绑定到XML标签的事件处理方法116
4.3文本的输入和输出118
4.3.1TextView118
4.3.2EditText119
4.3.3AutoCompleteTextView122
4.3.4Toast124
4.4单选按钮和复选框126
4.4.1RadioButton和RadioGroup126
4.4.2CheckBox129
4.5列表131
4.6下拉列表选择框138
4.7本章小结140
习题140
第5章对话框、菜单和状态栏消息142
5.1对话框142
5.1.1提示对话框AlterDialog143
5.1.2进度条对话框ProcessDialog149
5.1.3日期和时间选择对话框151
5.2菜单155
5.2.1使用XML资源定义菜单项156
5.2.2创建菜单157
5.2.3响应和处理菜单项的点击160
5.2.4上下文菜单161
5.3状态栏消息Notification163
5.4本章小结168
习题168
第6章Fragment及其应用169
6.1Fragment的基本概念169
6.1.1Fragment简介169
6.1.2Fragment的生命周期170
6.2创建和载入Fragment176
6.2.1创建Fragment176
6.2.2将Fragment加载到Activity中177
6.3利用Fragment实现界面的切换181
6.4利用Fragment实现侧滑菜单184
6.4.1主视图的布局184
6.4.2侧滑菜单的布局和菜单事件的响应185
6.4.3使用Android Studio提供的模板实现侧滑菜单189
6.5利用Fragment实现Tabbed
Activity192
6.6本章小结193
习题193
第7章线程与消息处理195
7.1基本概念195
7.1.1进程与线程195
7.1.2创建线程197
7.1.3操作线程199
7.1.4线程的状态和生命周期200
7.2Android的UI线程与非UI线程201
7.2.1单线程和多线程201
7.2.2非UI线程访问UI对象202
7.3Android多线程通信机制204
7.3.1线程间通信的常用类204
7.3.2使用Handler实现线程间通信207
7.3.3使用AsyncTask实现线程间通信213
7.4本章小结217
习题217
第8章Service与BroadcastReceiver218
8.1Android组件间的通信218
8.1.1Intent218
8.1.2Activity之间的切换和跳转222
8.2Service及其生命周期232
8.2.1Service简介232
8.2.2Service的生命周期233
8.3创建、启动和停止Service234
8.3.1创建Service234
8.3.2启动和停止Service236
8.3.3Activity与Service的通信239
8.3.4将Service绑定到Activity241
8.4Android的广播机制246
8.4.1广播的发送和接收246
8.4.2静态注册BroadcastReceiver247
8.4.3动态注册BroadcastReceiver250
8.4.4有序广播的发送和接收252
8.5本章小结255
习题255
第9章数据的存储与访问256
9.1基于SharedPreferences的数据存取256
9.2数据文件的存取260
9.2.1读取assets和raw文件夹中的文件260
9.2.2对内部文件的存取操作261
9.2.3对外部文件的存取操作266
9.3SQLite及其数据管理机制272
9.3.1SQLite概述272
9.3.2SQLiteOpenHelper、SQLiteDatabase和Cursor类273
9.3.3创建数据库和数据表274
9.3.4操纵数据库中的数据277
9.4基于ContentProvider的数据存取285
9.4.1ContentProvider285
9.4.2定义和使用ContentProvider285
9.5本章小结289
习题290
第10章多媒体应用开发291
10.1音视频文件的播放291
10.1.1MediaPlayer类291
10.1.2使用MediaPlayer播放音频文件294
10.1.3使用MediaPlayer播放视频文件297
10.1.4利用系统内置的播放器程序播放音频和视频299
10.1.5使用VideoView播放视频302
10.2音视频文件的录制305
10.2.1MediaRecorder类305
10.2.2使用MediaRecorder录制音视频306
10.3基于Camera类的图片摄取310
10.3.1Camera类310
10.3.2利用Camera类实现图片的摄取311
10.3.3利用系统内置的Camera应用实现图片的摄取317
10.4本章小结318
习题318
第11章Web应用开发320
11.1Android网络通信概述320
11.2网络资源的访问322
11.2.1使用HTTP的GET方式访问网络322
11.2.2使用HTTP的POST方式访问网络324
11.2.3使用HttpURLConnection访问网络326
11.2.4使用Socket进行网络通信330
11.3WebView333
11.3.1WebView的基本用法334
11.3.2WebView的参数设置334
11.3.3WebView应用实例338
11.4本章小结340
习题341
第12章综合应用实例342
12.1计算器APP342
12.1.1功能分析342
12.1.2界面布局设计342
12.1.3实现运算的类346
12.1.4界面功能的实现350
12.1.5实现基于SharedPreferences的数据存取353
12.1.6菜单设计354
12.2待办事项提醒小助手358
12.2.1功能分析358
12.2.2创建数据库359
12.2.3界面设计和功能实现360
12.2.4定时推送状态栏提醒377
12.2.5菜单设计379
12.3本章小结382
习题382
参考文献384
2014年12月15日前言随着移动互联网时代的来临,智能手机及其客户端APP软件成为广大用户接入和使用互联网的主要设备和方式之一。由谷歌公司推出的Android系统自2007年问世以来,得到了全球众多厂商和运营商的支持,迅速成为智能手机的主流操作系统,占据了大部分的市场份额。它不仅得到了全球开发者社区的极大关注,而且一大批世界一流的手机生产厂商和运营厂商都已经采用了Android系统,因此基于Android的手机APP软件开发日益受到广大开发者的关注,一些大学和培训机构也相继开设了基于Android的软件技术培训课程。这不仅合乎时代发展需要,而且有助于学生日后的就业,更能满足国内外日益增长的专业需求。本书是在作者撰写的《深入浅出Android软件开发教程》(第1版)的基础上,听取了部分任课教师和教材使用者的修改意见,结合Android智能手机软件开发的发展,重新撰写的一部教材。作为一本面向初学者的教程,本书延续上一版的写作风格,注重讲解的深入浅出和易学易懂,对于一些较难理解的理论,尽可能使用图示加以说明。对每个知识点都配有示例程序,并力求示例程序短小精悍,既能帮助读者理解知识,又具有启发性和实用性,非常适合教学讲授、自学或日后作为工具资料查询。每一章都配有难度适中的习题,引导读者编写相关功能的实用程序,有助于提高读者的学习兴趣。本书特别设置了Java语言和XML的基础知识介绍,同时这部分内容还可以作为Java和XML语法简明手册使用,便于初学者在编程过程中查阅。由于Android程序设计涉及编程语言、网络通信、硬件控制、多媒体等较多知识内容,所以学习时应该遵循循序渐进、由浅入深的原则。学习的过程中既要注重理论的理解,更要加强动手实践,尤其对于初学者,多练习才能掌握设计的方法和技巧。本书的示例程序采用2017年6月发布的Android Studio 2.3.3开发环境调试,其安装文件版本为androidstudiobundle162.4069837windows.exe,模拟器版本为Android 8.0(API 26)。Android Studio自2013年推出以来,在几次更新之后已经成为非常稳定和强大的IDE开发环境。和基于Eclipse的编程环境相比,Android Studio具有很多优势。Android Studio以IntelliJ IDEA为基础,整合了Gradle构建工具,为开发者提供了开发和调试工具,包括智能代码编辑、用户界面设计工具、性能分析工具等。Android Studio的界面风格更受程序员欢迎,代码的修改会自动智能保存,自带了多设备的实时预览,具有内置命令行终端,具有更完善的插件系统(如Git、Markdown、Gradle等)和版本控制系统,在代码智能提示、运行响应速度等方面都更出色。本书共分12章。第1章介绍智能移动设备及其操作系统,Android系统的体系结构,以及Java、XML等Android程序设计必要的预备知识。第2章介绍在Windows系统中搭建Android开发平台的主要步骤和集成开发环境的使用方法,并且通过学习创建个Android应用程序,了解典型Android应用程序的架构与组成。第3~5章介绍用户界面的设计,主要包括XML布局文件的设计和使用方法、常见的界面布局方式、Android中的事件处理机制、常用的用户界面控件以及对话框、菜单和状态栏消息的设计方法。第6章介绍Fragment的基本概念、Fragment的加载和切换以及相关应用。第7章介绍线程的概念、相关操作和Android多线程通信机制。第8章介绍Intent的概念及其在组件通信中的应用,包括Activity之间的跳转与通信、后台服务Service及其启动/停止方法、广播消息的发送和接收等。第9章介绍Android常用的数据存储和访问方法,包括Shared Preferences、文件存取、SQLite数据库存储、内容提供器(Content Provider)等。第10章介绍在Android系统中如何处理和使用音视频等多媒体资源。第11章主要介绍访问Internet资源的方法,包括利用Http、HttpURLConnection或Socket与远程服务器交互,使用WebView控件在Activity中包含一个基于WebKit浏览器的方法等。第12章介绍两个综合应用实例的设计思路和实现方法,以加深对基本知识的理解。本书第1~6章由张雪梅编写,第7、8章由李志强编写、第9~12章由王向编写,部分章节中的实例由李志强、王向完成,后由高凯完成了全书的统稿和审阅工作。本书可作为大学相关专业教科书和工程实训、技能培训用书,也可供工程技术人员参考。本书提供源代码下载和教学课件下载,相关源代码和课件资源均在清华大学出版社网站(http: //www.tup.com.cn)发布,方便读者自学和实践。在本书的写作与相关科研课题的研究工作中,得到了多方面的支持与帮助。在写作过程中,有关Android智能手机软件开发的相关网站亦为本书提供了良好的基础,我们也参考了相关文献和互联网上众多热心网友提供的素材,本书的顺利完成也得益于参阅了大量的相关工作及研究成果,在此谨向这些文献的作者、热心网友以及为本书提供帮助的老师致以诚挚的谢意和崇高的敬意。在本书的写作过程中,也得到了清华大学出版社的大力支持和帮助,在此一并表示衷心感谢。本书读者对象包括计算机、通信、电子信息类本专科学生,以及从事手机软件开发与维护的工程技术人员。由于作者水平有限,书中难免有不足之处,恳请广大读者批评指正。作者的联系方式是[email protected],欢迎来信交流,共同探讨Android程序设计方面的问题。
作者2018年5月
public class MainActivity extends Activity {private static final String TAG = “生命周期示例”;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(TAG, “– onCreate()被调用–“);}@Overrideprotected void onStart() {super.onStart();Log.d(TAG, “– onStart()被调用–“);}@Overrideprotected void onResume() {super.onResume();Log.d(TAG, “– onResume()被调用–“);}@Overrideprotected void onPause() {super.onPause();Log.d(TAG, “– onPause()被调用–“);}@Overrideprotected void onStop() {super.onStop();Log.d(TAG, “– onStop()被调用–“);}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, “– onDestroy()被调用–“);}@Overrideprotected void onRestart() {super.onRestart();Log.d(TAG, “– onRestart()被调用–“);}}运行这个Activity后,在LogCat窗口中能看到给出的提示信息,从中可看到Activity的生命周期是如何运行的。例如,启动这个Activity后LogCat窗口输出的提示信息如图32所示,onCreate()、onStart()和onResume()方法被依次调用;关闭这个Activity时,LogCat窗口输出的提示信息如图33所示,onPause()、onStop()和onDestroy()方法被依次调用。图32Activity启动时调用的生命周期方法图33Activity结束时调用的生命周期方法3.1.4Activity的启动模式主Activity在启动应用程序时就创建完毕,在其中可以显示XML布局信息、指定处理逻辑等。对于功能较复杂的应用程序,往往一个界面是不够用的,这就需要多个Activity来实现不同的用户界面。在Android系统中,所有的Activity由堆栈进行管理,Activity栈遵循“后进先出”的规则。如图34所示,当一个新的Activity被执行后,它将会被放置到堆栈的,并且变成当前活动的Activity,而先前的Activity原则上还是会存在于堆栈中,但它此时不会在前台。Android系统会自动记录从首个Activity到其他Activity的所有跳转记录并且自动将以前的Activity压入系统堆栈,用户可以通过编程的方式删除历史堆栈中的Activity实例。图34Activity堆栈示意图Activity的启动方式有4种,分别是standard、singleTop、singleTask、singleInstance。可根据实际需求为Activity设置对应的启动模式,从而避免创建大量重复的Activity等问题。设置Activity启动模式的方法是在AndroidManifest.xml里对应的标签中设置android: launchMode属性。【例32】示例工程Demo_03_ActivityLaunchMode演示了Activity不同启动模式的区别。首先,新建一个基于空白模板的应用程序。然后在XML布局中添加一个TextView并给默认的TextView增加ID号以便以后引用它;添加一个按钮,设置其显示内容、ID号等信息。之后,在侦听按钮单击事件中显示任务栈中的ID号和实例号。示例程序的主要代码如代码段34所示。代码段3-4Activity的启动模式private TextView tv;//定义显示文字的TextView实例对象@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//设置布局TextView tv= (TextView)findViewById(R.id.mytv);//通过ID号引用TextViewtv.setText(String.format(“任务堆栈中的ID号: %d\n Activity实例ID: %s\n”, getTaskId(), this.toString()));findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { //设置按钮单击事件@Overridepublic void onClick(View v) {startActivity(new Intent(MainActivity.this, MainActivity.class));//启动自身}});}之后,可以在工程的AndroidManifest.XML文件中设置Activity的启动模式,通过引用android: launchMode的不同参数,完成对不同Activity启动模式的设置,如图35所示。图35在AndroidManifest.XML中设置Activity的启动模式Standard是默认模式,若当前Activity名为ActivityA,单击按钮可再次跳转到ActivityA,则单击按钮便会启动一个新的ActivityA实例叠加在刚才的ActivityA之上;再次点击,又会启动一个新的ActivityA实例并放置在它之上。此时Activity是在同一个任务栈里,只不过是不同的实例而已,单击手机上的回退键会依照栈顺序依次退出。图36中给出了任务堆栈的ID号(图中显示319)。随着用户单击界面中的按钮,这个ID号是不变的,变化的是下方显示在@后的Activity实例号(图中显示3a200df)。如果单击手机的回退键,会根据堆栈“后进先出”的特性依次显示各个实例号,但任务栈的ID号是不变的,始终的。在图36中的表现形式是上面框中的数据维持不变,而下面框中的数据会发生变化。图36示例程序的运行结果在图35所示的其他3种启动模式中,SingleTop模式可以有多个实例,但是不允许多个相同Activity叠加在一起,如果Activity在堆栈顶时启动相同的Activity,则不会创建新的实例,表现在图36中是两个框中的数据都不会发生变化。SingleTask模式只有一个实例,在同一个应用程序中启动它时,若Activity不存在,则会在当前创建一个新的实例;若存在,则会把任务列表中在其之上的其他Activity取消并调用它的onNewIntent()方法。SingleInstance模式只有一个实例,不允许有别的Activity存在,也就是说,一个实例堆栈中只有一个Activity。3.1.5Context及其在Activity中的应用Context的中文解释是“上下文”或“环境”,在Android中应该理解为“场景”。例如,正在打电话时,场景就是用户所能看到的在手机里显示出来的拨号键盘,以及虽然看不到,但是却在系统后台运行的对应着拨号功能的处理程序。Context描述的是一个应用程序环境的上下文信息,是访问全局信息(如字符串资源、图片资源等)的接口。通过它可以获取应用程序的资源和类,也包括一些应用级别操作,如启动Activity、发送广播、接收Intent信息等。也就是说,如果需要访问全局信息,就要使用Context。在代码段35中,this指的是这个语句所在的Activity对象,同时也是这个Activity的Context。代码段3-5通过Context获取Activity上下文中的字符串信息public class MainActivity extends ActionBarActivity {private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);tv = new TextView(this);//得到当前Activity的上下文信息tv.setText(R.string.hello_world); //通过Context得到字符串资源setContentView(tv);}}Android系统中有很多Context对象,例如前述的Activity继承自Context,也就是说每一个Activity对应一个Context。Service也继承自Context,每一个Service也对应一个Context。常用的Context对象有两种,一种是Activity的Context,另一种是Application的Context。二者的生存周期不同。Activity的Context生命周期仅在Activity存在时,也就是说,如果Activity已经被系统回收了,那么对应的Context也就不存在了;而Application的Context生命周期却很长,只要应用程序运行着,这个Context就是存在的,所以要根据自己程序的需要使用合适的Context。3.2布局文件及其加载Activity主要用于呈现用户界面,包括显示UI控件、监听并处理用户的界面事件并做出响应等。3.2.1View类和ViewGroup类在一个Android应用程序中,用户界面一般由一组View和ViewGroup对象组成。View对象是继承自View基类的可视化控件对象,是Android平台上表示用户界面的基本单元,如TextView、Button、CheckBox等。View是所有可视化控件的基类,提供了控件绘制和事件处理的属性和基本方法,任何继承自View的子类都会拥有View类的属性及方法。表31给出了View类常用属性的说明。View及其子类的相关属性既可以在XML布局文件中进行设置,也可以通过成员方法在Java代码中动态设置。表31View类的部分常用属性XML属性在Java代码中对应的方法功能及使用说明android: backgroundsetBackgroundResource(int)设置背景颜色android: clickablesetClickable(boolean)设置是否响应点击事件android: visibilitysetVisibility(int)设置该View控件是否可见android: focusablesetFocusable(boolean)设置View控件是否能捕获焦点android: idsetId(int)设置该View控件标识符android: layout_widthsetWidth(int)设置宽度android: layout_heightsetHeight(int)设置高度android: textsetText(CharSequence)/setText(int)设置控件上显示的文字android: textSizesetTextSize(float)设置控件上显示文字的大小android: textColorsetTextColor(int)设置控件上显示文字的颜色ViewGroup类是View类的子类,与View类不同的是,它可以充当其他控件的容器。ViewGroup类作为一个基类为布局提供服务,其主要功能是装载和管理一组View和其他的ViewGroup,可以嵌套ViewGroup和View对象,其关系如图37所示,而它们共同组建的顶层视图可以由应用程序中的Activity调用setContentView()方法来显示。Android中的一些复杂控件如Gallery、GridView等都继承自ViewGroup。图37View与ViewGroup的关系View 是屏幕上的一个矩形区域,负责绘制和事件处理,它是所有布局和Widget控件的基类,其继承结构如图38所示。图38布局和Widget控件的继承结构3.2.2XML布局及其加载在Android应用程序中,常见的布局方式有线性布局(linear layout)、相对布局(relative layout)、布局(absolute layout)、表格布局(table layout)、帧布局(frame layout)等。这些布局都通过ViewGroup的子类实现。界面的布局可以在XML文件中进行设置,也可以通过Java代码设计实现。如果采用种方式,则需要在资源文件夹res\layout中定义相应的布局文件。这个XML布局文件由许多View对象嵌套组成。如果布局中有多个元素,那么顶层的根节点必须是ViewGroup对象;如果整个布局只有一个元素,那么顶层元素就是的元素,它可以是一个单一的Widget对象。代码段36就是一个自定义的布局文件mylayout.xml,在其中声明了布局的实例,该例采用线性布局,布局中包括一个TextView控件。代码段3-6自定义的XML布局文件定义了布局文件之后,需要在Activity中的onCreate()回调方法中通过调用setContentView()方法来加载这个布局,如代码段37所示。代码段3-7通过重写onCreate()方法加载用户界面的布局public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.mylayout); //加载布局}}3.2.3在Activity中定义和引用布局除了上述直接调用已经设定好的XML布局外,还可以在Java代码中直接引用某种布局,此时就不需要在工程的res文件夹下存放XML布局文件了。在将Widget对象实例化并设置属性值后,通过调用addView()方法可将其添加到设定的布局。【例33】工程Demo_03_DefineLayoutInActivity演示在Java代码中定义并引用布局的方法。此例是通过在MainActivity中添加线性布局而非通过XML布局文件来设置布局的。通过循环语句定义了3个按钮,并通过addView()方法将其添加到布局中,如代码段38所示。代码段3-8在Activity中设定布局public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);LinearLayout myLayout = new LinearLayout(this);//通过上下文设定线性布局对象myLayout.setGravity(Gravity.CENTER_HORIZONTAL);myLayout.setOrientation(LinearLayout.VERTICAL);//垂直布局myLayout.setPadding(0,20,0,0); //设置左、上、右、下边距setContentView(myLayout); //加载布局Button myBtn; //定义按钮对象for (int i=1; i<4; i ){ //添加几个按钮myBtn = new Button(this);myBtn.setText(“按钮” i);myBtn.setTextSize(20); //设置字体大小myBtn.setHeight(35); //设置按钮的高度myLayout.addView(myBtn);//将Button对象添加到布局中myBtn.getLayoutParams().width=300; }}}示例程序的运行结果如图39所示。图39示例程序的运行结果3.2.4资源的管理与使用在Android中,对字符、颜色、图像、音视频等资源的使用与管理也是很方便的,只要调用或设置资源文件夹res下的相关媒体文件或XML文件,就可以实现相关功能。1. R.java文件R.java文件由Android Studio自动生成与维护,提供了对Android资源的全局索引。Android应用程序中,XML布局和资源文件并不包含在Activity的Java源码中,各种资源文件由系统自动生成的R.java文件来管理。每一个资源类型在R.java文件中都有一个对应的内部类。例如,类型为layout的资源项在R.java文件中对应的内部类是layout,而类型为string的资源项在R.java文件中对应的内部类就是string。R.java文件的作用相当于一个项目字典,项目中的用户界面、字符串、图片、声音等资源都会在该类中创建其的ID,当项目中使用这些资源时,会通过该ID得到资源的引用。如果程序开发人员变更了任何资源文件的内容或属性,R.java文件会随之变动并自动更新R.java类。可以打开R.java文件查看其内容,如图310所示,但开发者不需要也不能修改此文件,否则资源的内存地址会发生错误,程序就无法运行了。图310R.java文件及其内容在Java程序中通过R.java类引用资源的方法是“R.资源类型.资源名称”,其中的“资源类型”可以是放置图像的文件夹、XML文件或布局文件,而“资源名称”是资源文件名或XML文件中的变量名。例如,R.drawable.background表示使用资源目录中的res\drawable\background.png图片文件;R.string.title表示使用资源文件res\values\string.xml中定义的title字符串变量;R.layout.activity_main表示使用资源目录中的res\layout\activity_main.xml布局文件;R.anim.anim表示使用res\anim\anim.xml动画定义文件。2. 图片资源的管理与使用Android Studio工程项目提供了mipmap文件夹和drawable文件夹管理图片资源文件。新建工程项目时,系统会在res资源文件夹中自动创建多个drawable或mipmap文件夹,如drawablehdpi、drawablemdpi、mipmaphdpi、mipmapmdpi等,具体取决于Android Studio的版本。当应用程序安装在不同显示分辨率的终端上时,程序会自适应地选择加载xxhdpi、xhdpi、hdpi或mdpi文件夹中的资源。例如一部屏幕密度为320的手机,会自动使用drawable_xhdpi文件夹下的图片。如果有默认文件夹drawable,则系统如果在其他dpi文件夹下找不到图片时会使用drawable中的图片。谷歌公司建议将应用程序的图标文件放在mipmaps文件夹中,这样可以提高系统渲染图片的速度,提高图片质量,减小GPU压力。mipmap支持多尺度缩放,系统会根据当前缩放范围选择mipmap文件夹中适当的图片。而如果将图片放在drawable文件夹下,将根据当前设备的屏幕密度选择恰当的图片。【例34】工程Demo_03_UseImageResource以设置ImageView的图片属性为例演示了如何在XML文件中引用图片资源的方法。首先将某个图片文件复制到工程中的mipmap文件夹下,图311是把background.jpg复制到工程中以后的效果。图311在工程中添加图片在布局XML文件中,通过“@mipmap/图片文件名”的方式引用mipmap文件夹中的图片文件,实现代码如代码段39所示,运行结果如图312所示。代码段3-9在XML文件中引用图片资源【例35】工程Demo_03_SetBackgroundForActivity以设置Activity的背景图片为例演示了如何在Java源代码中引用图片资源的方法。首先将某个图片文件复制到工程中的mipmap文件夹下。在Java源代码中,通过“R.mipmap.图片文件名”的方式引用mipmap文件夹中的图片文件。本例中,通过调用this.getWindow().setBackgroundDrawableResource()方法设定某个图片作为APP的背景,在onCreate()方法中的实现代码如代码段310所示,运行结果如图313所示。代码段3-10在Activity中设定APP的背景protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.getWindow().setBackgroundDrawableResource(R.mipmap.background);//用指定图片作为背景setContentView(R.layout.activity_main);}图312设置ImageView的图片属性图313设置Activity背景
3. 字符串资源的管理与使用字符串资源描述文件strings.xml一般位于工程res文件夹下的values子文件夹中。如果需要在Activity代码或布局文件中使用字符串,可以在strings.xml文件中的标签下添加相应的元素,定义字符串资源。元素的基本格式是字符串的内容代码段311是一个典型的strings.xml示例,其中定义了两个字符串变量。代码段3-11典型的string.xml代码段MyFirstApplicationHello world!上述代码段的第1行定义了XML版本与编码方式。第2行以后在标签下定义了两个元素,分别定义了两个字符串,字符串的名称分别为app_name和hello_world。如果需要在Java程序代码中使用这些字符串,可以用“R.string.字符串名称”的方式引用。如果在XML文件中使用这些字符串,则用“@string/字符串名称”的方式引用。Android解析器会从工程的res/values/strings.xml文件里读取相应名称变量的值并进行替换。4. 数组资源的管理与使用与字符串资源类似,数组描述文件arrays.xml位于工程res文件夹下的values子文件夹中。数组资源也定义在标签下,其基本语法如下: 数组元素值数组元素值数据类型-array>代码段312是一个典型的array.xml示例,在其中定义了两个字符串数组,数组名分别是citys和modes。代码段3-12典型的array.xml代码段北京天津上海123在XML中引用数组资源的方法是“@array/数组名称”,在Java代码中引用数组资源的方法是“getResources().getXxxArray(R.array.数组名称)”,例如: String[] citys =getResources().getStringArray(R.array.citys);int[] modes =getResources().getIntArray(R.array.modes);5. 颜色描述资源的管理与使用颜色描述文件strings.xml位于工程res文件夹下的values子文件夹中,其典型内容如代码段313所示。代码段3-13典型的color.xml代码段#3F51B5#303F9F#FF4081在标签下添加相应的元素,定义颜色资源,其基本格式如下: 该颜色的值颜色值通常为8位的十六进制的颜色值,表达式顺序是#aarrggbb,其中aa表示alpha值(00~FF,00表示完全透明,FF表示完全不透明),rr表示红色分量的值(00~FF),gg表示绿色分量的值(00~FF),bb表示蓝色分量的值(00~FF)。例如,#7F0400ff,其中7F表示透明度,0400ff表示色值(red值为04,green值为00,blue值为FF)。任何一种颜色的值范围都是0~255(00~FF)。颜色值也可以为6位的十六进制的颜色值,表示一个完全不透明的颜色,表达式顺序是#rrggbb。例如,#0400FF,则red值为04,green值为00,blue值为FF。在XML中引用颜色资源的方法是“@color/颜色名称”,例如: android:textColor=”@color/colorAccent”在Java代码中引用颜色资源的方法是“getResources().getColor(R.color.颜色名称)”或“ContextCompat.getColor(context, R.color.颜色名称)”,例如: TextView hello=(TextView)findViewById(R.id.hello);hello.setTextColor(getResources().getColor(R.color.colorPrimary));6. 引用assets文件夹中的资源同res文件夹相似,assets也是存放资源文件的文件夹,但两者有所不同,res文件夹中的内容会被编译器所编译,assets文件夹则不会。也就是说,应用程序运行的时候,res文件夹中的内容会在启动的时候载入内存,assets文件夹中的内容只有在被用到的时候才会载入内存,所以一般将一些不经常使用的大资源文件存放在该目录下,例如应用程序中使用的音视频文件、图片、文本文件等。在程序中可以使用getResources.getAssets().open(“文件名”)的方式得到资源文件的输入流InputStream对象。3.3界面元素的常用属性每个View和ViewGroup对象支持其自身的各种XML属性。一些属性对所有View对象可用,因为它们是从View基类继承而来的,例如id属性;而有些属性只有特定的某一种View对象及其子类可用,例如TextView及其子类支持textSize属性。3.3.1控件ID及其使用在XML布局文件中,可以通过设置android: id属性来给相应的Widget控件指定ID,通常是以字符串的形式定义一个ID;而在Java中则可以通过调用setId(int)方法来实现给控件指定ID。通过这个ID,可在XML布局或Activity代码中引用相应的控件。例如,如果新添加了一个按钮Button,在XML布局文件中采用如下方式为其分配ID号: android:id=”@ id/my_button”这里在“@ id/”后面的字符是设定的ID号,@表示XML解析器应该解析ID字符串并把它作为ID资源;“ ”表示这是一个新的资源名字,它被创建后应加入到资源文件R.java中。在Java代码中引用相应的ID时,则不需要 符号,只需创建这个View对象(如Button)的实例名,并通过其ID号获取它。例如,代码段314给出在Activity中通过ID号取得布局上的元素句柄,此例中ID为my_button。代码段3-14通过findViewById()取得控件句柄@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//在activity_main.xml中应提前定义好Button的IDButton myButton = (Button) findViewById (R.id.my_button);//取得Button控件句柄,存储到myButton对象中myButton.setText(“hello”);//字符串hello显示在ID号为my_button的Button控件中}在定义资源之前,要先使用android: id属性定义其ID号,这样该资源才能被记录到
评论
还没有评论。