版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章Android概述说到智能手机,人们马上就能想到Android手机(中文翻译为安卓手机)、iPhone手机、鸿蒙手机等。确实,在当今,上至老年人,下至几岁孩童都在使用智能手机。Android手机作为一款流行的智能手机,它的版本更新非常快,目前更新到了16版本;它的用户体验也越来越好;应用也越来越丰富。作为应用开发人员,开发基于Android的智能手机应用是一个重要的方向。目录1.1Android是什么1.2Android应用程序的组成1.3Android的发展历史1.1Android是什么Android是什么?回答是:Android是一个平台,它包括基础系统、开发工具和完整的文档。Android平台是一个通用的计算平台,它采用Linux作为其支撑操作系统,以Java作为其开发环境,通过编程实现完整的电话、视频、网络、界面设计等基础功能。1.2Android应用程序的组成一个Android应用程序包括如下的基本组成部分:(1)Activity(窗体):在Android应用程序中,一个界面就是一个Activity。Activity的中文含义是“活动”:因为用户通过界面与系统进行交互,而与系统交互的过程就是在做活动。可以将Android的Activity界面类比为Internet网页的一个页面。(2)View(窗体组件):View就是构建应用程序界面的基本组件,也就是说,Activity界面是由一个或多个View构成的。例如,Button、Label、TextField等都是View,View是构建Activity的基本元素。(3)Intent(窗体间或应用之间的通信组件):一般来说,一个Android应用程序会包括多个界面。用户在进行操作时可能会在多个不同界面之间切换。(4)ContentProvider(应用之间数据交互方式):ContentProvider,也就是内容提供者,是Android应用程序之间进行数据交互的方式。举例来说,如果一个应用程序希望将自己的数据提供给其他应用程序使用,则该应用程序需要实现ContentProvider接口,这样其他的应用程序便可以通过这个接口访问这个程序所提供的数据。(5)Service(无窗口的在后台默默运行的程序):所谓Service就是运行于后台的服务程序。Service服务程序没有界面,它们运行于后台并为运行在前端的程序提供服务。(6)广播接收器(信息广播方式):广播接收器,即BroadcastReceiver。Android平台中的程序在运行时可能会发生某些事件:有些应用程序在运行时可能会将它的事件广播出来,其他的程序可以监听这样的事件,并对发生的事件进行必要的处理。(7)AndroidManifest.xml文件(应用程序描述文件):AndroidManifest.xml文件是Android应用程序的配置文件:它将构成Android应用程序的各个组件有效地装配起来从而构成一个完整的Android应用程序。1.3Android的发展历史2007年,Google牵头建立了开放手机联盟(OpenHandsetAlliance)。到2009年,这个联盟成员包括SprintNextel、T-Mobile、Motorola、Samsung、SonyEricsson、Toshiba、Vodafone、Google、Intel、TexasInstruments等IT巨头。到2011年,成员已近80家,Android已经成为移动设备事实上的行业标准。到2025年7月,Android平台的版本已从1.0发展到了16.0。Android进化地如此之快,因此,读者在学习Android开发时,必须要学会使用Android的在线帮助文档。本书基于最新的Android16版本介绍Android应用开发相关技术内容。Q&A第2章建立Android应用开发环境Android采用Java作为应用程序开发语言。Android开发环境包括如下基本内容:Java基础类库、Android基础组件、AndroidUI组件、Android服务组件、Android电话和媒体服务组件、Android仿真器(AndroidVirtualDevice,AVD)、Android调试器等。所有这些内容都通过Android应用程序开发工具AndroidStudio有机地整合了起来。本章介绍如何安装AndroidStudio开发工具,并开发和运行第一个Android应用程序。目录2.1下载和安装AndroidStudio开发工具2.2创建第一个Android应用程序2.3运行第一个Android程序2.4Android应用程序的结构2.5修改AndroidStudio的界面风格2.6课堂同步练习2.7课后同步练习2.1下载和安装AndroidStudio开发工具从AndroidDeveloper网站下载最新的AndroidStudio开发工具安装程序,直接运行下载得到的安装软件,并按照提示安装AndroidStudio开发环境。2.2创建第一个Android应用程序点击“+NewProject”新建一个Android应用程序。AndroidAPI版本号与Android发行版本号之间的关系序号Android发行版本号(Version)AndroidAPI版本(Level)Android名字(name)1Android1636W2Android1535V3Android1434U4Android1333T5Android12L32S6Android12.031S7Android11.030R8Android10.029Q9Android9.028Pie10Android8.127Orea11Android8.026Orea12Android7.1.125Nougat13Android7.024Nougat14Android6.023MarshMallow一点小提示:如果遇到下载插件失败的情况,可更改插件下载地址。按照下图所示的方式打开配置文件,并修改插件下载地址为图中的地址,下载速度会明显提升。2.3运行第一个Android程序可以直接在Android真机上测试,也可以在AndroidSDK的模拟器上测试。在开发阶段,一般先在Android模拟器上测试,测试通过后再在Android真机上测试/运行。2.4Android应用程序的结构Android应用程序的目标环境可能不同,Android应用程序的规模也可能相差很大,但是,Android应用程序的结构是相似的。2.5修改AndroidStudio的界面风格可以根据个人喜好修改AndroidStudio主界面的色调。为此,在AndroidStudio主界面,点击主菜单的FileSettings…2.6课堂同步练习在各自使用的机房计算机上,打开计算机上预先安装安装的AndroidStudio开发工具,创建一个Android工程,然后,创建Android模拟器,并运行所创建的程序,以熟悉开发工具的使用。2.7课后同步练习在自己的个人计算机上,下载并安装Android开发环境,然后编写第一个HelloAndroid程序,运行它,并观察程序的结构。同时,熟悉AndroidStudio开发环境的各个功能的使用方法。Q&A第3章剖析Android应用程序上一章对Android应用程序的工程结构做了简单介绍,并指出AndroidManifest.xml文件是Android应用程序非常重要的配置文件。在Android应用程序运行时,Android平台将首先读取这个配置文件并进行分析,然后启动称为入口Activity的Activity运行。因此,下面就从这个配置文件开始对Android应用程序进行剖析。目录3.1AndroidManifest.xml配置文件3.2MainActivity.java3.3课堂同步练习3.4Android程序资源3.5课后同步练习3.1AndroidManifest.xml配置文件这是一个XML文件:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"xmlns:tools="/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Ch0201"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity></application></manifest>3.2MainActivity.java在启动Android应用程序时,Android平台将首先读取AndroidManifest.xml文件,从中获得入口Activity的相关信息,并启动入口Activity运行程序。在ch0201程序中,入口Activity是MainActivity.java程序,因此,Android平台将首先启动MainActivity程序运行,进而显示程序界面。packagecom.example.ch0201;
importandroid.os.Bundle;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivity{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});}}Android平台规定:当Android平台启动MainActivity运行时,将首先调用父类的onCreate()方法。在这个MainActivity的onCreate()方法中,有两行代码最为关键,它们是:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);activity_main.xml文件:<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="HelloWorld!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>3.3课堂同步练习请根据前面所讲述的内容试着做一道练习:将显示在屏幕上的“HelloWorld”改为“你好,世界!”。做完这个练习后,再做一道练习:在界面上显示的“你好,世界!”的下面再显示一句话“Android开发入门了!”。3.4Android程序资源Android程序资源在Android应用程序中起着十分重要的作用:Android程序资源可以是一个文件,如布局资源,也可以是一个值,如字符串常量定义。将应用程序的资源与应用程序代码分离的好处是:可以直接改变资源的值,而不用修改或编译应用程序代码本身。在Android应用程序中,会用到各种各样的资源,包括字符串资源、图片资源、界面布局资源、动画资源等,下面我们对常用的资源类型的定义和使用进行简单的介绍。3.4.1字符串资源在程序编码实践中,经常会用到大量的字符串常量。Android建议,将字符串常量统一定义到一个或多个XML资源文件中统一管理。一般情况下,将用到的字符串常量统一定义到res/values/strings.xml文件中。例如,ch0201程序工程的配置文件AndroidManefest.xml文件中,程序的标签label属性的值就是通过字符串资源定义的,AndroidManefest.xml文件部分内容如下:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"xmlns:tools="/tools">
<applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"……res/values/strings.xml文件内容;这里需要特别强调:用于定义字符串常量的XML文件必须放置到res/values工程目录下,而文件名则可以根据需要自行定义。<resources><stringname="app_name">ch0201</string></resources>AndroidStudio的构建工具会给每个资源分配一个唯一的编号,通过这个编号就可以访问到特定的资源。例如,为了在Java代码中访问在res/strings.xml文件定义的字符串资源,可以使用语句:R.string.app_name来访问由app_name定义的字符串;而在资源配置XML文件中,如AndroidManifest.xml文件中,则使用语句:@string/app_name来访问由app_name定义的字符串。3.4.2布局资源在Android程序中,可以使用Java代码直接构建程序界面,然而,更常用的方式是通过XML文件来构建布局界面。通过XML方式来构建程序界面的文件称为布局资源文件。例如,在ch0201工程中,res/layout/activity_main.xml就是一个布局资源文件。创建了这个布局资源后,可以通过程序代码将该界面显示在Activity中,就像在MainActivity.java程序中操作的那样,内容如下:publicclassMainActivityextendsAppCompatActivity{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});}}3.4.3组件ID就像给每个字符串资源、布局资源定义了唯一的标识符一样,也可以给布局资源中的组件分配唯一的ID。在给布局资源中的组件分配一个唯一的ID后,就可以在程序代码中引用这些组件了。为了给布局资源中的组件分配唯一的ID,只需要在布局资源中,为需要指定ID的组件加上android:id属性即可。下面用例子说明如何为布局资源的组件分配ID。修改res/layout/activity_main.xml文件为如下代码:<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<TextViewandroid:id="@+id/tv01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="HelloWorld!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>给TextView组件分配名为tv01的ID。现在,可以在MainActivity.java中,通过这个ID得到TextView组件的引用:packagecom.example.ch0301;
importandroid.os.Bundle;importandroid.widget.TextView;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivity{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
TextViewtv=findViewById(R.id.tv01);tv.setText("欢迎进入Android开发者阵营!");}}在Android应用开发实践中,建议将字符串资源统一定义在res/values/string.xml文件中。修改res/values/strings.xml文件:同时修改MainActivity.java原语句:tv.setText("欢迎进入Android阵营!");为新语句:
tv.setText(R.string.group);<resources><stringname="app_name">First</string><stringname="group">欢迎进入Android开发者阵营!</string></resources>3.4.4图片资源为了实现程序的可用性和美观性,在程序中会使用图片来装饰界面。目前Android支持的图片格式,包括常见的后缀名为.jpg、.png、.bmp、.webp等格式的图片。特别强调,Android不支持.gif格式的动图图片。Android将图片也定义为资源。它将每个图片资源作为文件放置在res/mipmap(或res/drawable)工程目录下,并且可为不同的手机屏幕尺寸和分辨率使用不同的尺寸大小的图片资源。对于图片资源,为了满足不同的屏幕分辨率和屏幕大小,可以对不同的屏幕分辨率和屏幕大小创建不同的资源:对于超高分辨率的设备,则首先从res/mipmap-xhdpi目录下获得图片资源,如果没找到,则再到其他相近目录下寻找;对于高分辨率的设备,则首先从res/mipmap-hdpi目录下获得图片资源,则再到其他相近目录下寻找;以此类推。-xxhdpi、-xhdpi、-hdpi、-mdpi、-ldpi等称为资源目录后缀。序号密度后缀密度(dpi,dotperinch)对应分辨率范围1ldpi120大于等于240x320并且小于等于320x4802mdpi160大于等于320x480并且小于等于480x8003hdpi240大于等于480x800并且小于等于720x12804xhdpi320大于等于720x1280并且小于等于1080x19205xxhdpi480大于等于1080x1920并且小于等于1440x25606xxxhdpi640大于等于1440x2560并且小于等于2160x3840为了说明图片资源的使用,下面举一个显示图片资源的例子程序。首先新建一个名称为ch0302的程序工程。观察一下图片资源目录mipmap目录。图片都针对不同分辨率制作了不同尺寸的图片,因此,在程序运行时,会根据手机的屏幕分辨率大小选择使用不同目录下的图片。现在准备一张图片,然后将图片复制到mipmap选定的子目录下:鼠标右击“mipmap”,选择“paste”,在弹出的窗口中选择“…\app\src\main\res\mipmap-xxxhdpi”,也就是,将图片复制到mipmap-xxxhdpi资源目录下。然后修改布局文件“res/layout/activity_main.xml”为如下代码:<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<ImageViewandroid:layout_width="match_parent"android:layout_height="300dp"android:src="@mipmap/a01"android:scaleType="fitCenter"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>3.4.5课堂同步练习编写一个Android应用程序,并显示一张自己认为漂亮的图片,然后以文本的形式介绍图片的内容。3.4.6Android的其他资源除了上面介绍的资源外,Android中还有多种其他类型的资源,包括color、animation、array、color-drawable、raw等,后续内容将对这些资源的定义和使用方法进行介绍。3.4.7资源引用不管Android资源的类型如何,所有的Android资源都是通过与之关联的标识符来进行引用的。例如,为了在Java代码中引用message_1字符串资源,可以使用如下语句:R.string.message_1来引用;而为了引用png2030.png图片资源,可以使用如下语句:R.drawable.png2030来引用。类似地,为了在资源配置XML文件中引用Android资源,例如,为了引用message_1字符串资源,可以使用如下语句:@string/message_1来引用;而为了引用png2030.png图片资源,可以使用如下语句:@drawable/png2030来引用。一般地,在Java程序代码中,可以使用如下格式来引用Android程序资源:[package.]R.类似地,在XML资源配置文件中,可以使用如下格式来引用Android程序资源:@[package:]type/name其中的type对应R的资源类型,包括如下内容:(1)drawable:图片资源。(2)id:在布局中为组件赋予的ID。(3)layout:布局资源。(4)string:字符串资源。(5)menu:菜单资源。(6)string-array:字符串数组资源。其中的name就是赋予资源的名字。这里需要再次强调的是,资源的名字可能是一个具体的文件名,例如,布局资源、图片资源,也可能是某个资源文件中为具体资源赋予的名称,如字符串资源。Android平台已经定义了很多资源可以供开发者使用,这可以从Android的开发文档中查到:打开Android开发者网站,在搜索栏搜索“R”,点击其中的“R.string”链接。在Java代码中,可以使用如下语句:android.R.string.VideoView_error_button来引用这个资源;类似地,在XML资源文件中,可以使用如下语句:@android:string/VideoView_error_button来引用这个资源。3.5课后同步练习从Android的帮助文档中找出Android平台定义的所有图片资源,并在程序中显示其中任意一张图片。Q&A第4章深入分析Activity在Android应用程序中,Activity承担了非常重要的功能,它代表应用程序与用户交互的界面。当Android平台要运行一个Android应用程序时,它会启动一个指定的Activity运行,通过用户与Activity的交互,实现界面之间的跳转,并进而完成程序的功能目标。本章对Activity的相关内容进行介绍。目录4.1Activity生命周期4.2Activity生命周期观察4.3使用Log类输出程序调试信息4.4Android常见Activity4.5课后同步练习4.1Activity生命周期JavaSE桌面应用程序场景,这些程序都会有一个称为main()的函数,它是整个程序运行的入口。但是,在Android应用程序中,就像之前编写的任何程序Android应用程序,程序中并不存在main()函数。packagecom.example.ch0401;
importandroid.os.Bundle;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivity{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});}}问题是,没有main()函数,Android程序又是如何运行的呢?这就需要理解Android程序生命周期的概念。一个应用程序也是有生命周期的:启动程序→完成业务功能→程序运行结束。Android应用程序的Activity界面,它也是有生命周期的:Android平台为显示Activity界面做准备→显示Activity界面→用户与界面交互→退出Activity界面。其实,Android的一个Activity的生命周期要比上面所描述的复杂和细致得多,并且,Android应用程序的生命周期是由Android平台管理的。当Android系统要启动一个应用程序的Activity时,例如,启动某个Android应用程序的入口Activity时,它将首先调用该Activity的onCreate()方法,然后调用该Activity的onStart()方法,接着调用Activity的onResume()方法,在调用了onResume()方法之后,该Activity已经将所表示的界面显示在屏幕上,此时,用户可以与此Activity进行交互,例如对于微信应用,则可以与好友进行微信聊天了。当一个应用程序的Activity显示在屏幕上时,随时都有可能被另外一个Activity覆盖。例如,当进行微信聊天时,可能突然会收到一条短信,这时,可以在继续微信聊天的同时,打开短信应用程序来阅读收到的短信,此时,微信聊天程序的Activity被短信应用的Activity覆盖。在这种情况下,Android系统会自动调用微信聊天程序Activity的onPause()方法,然后再调用短信程序的入口Activity的onCreate()方法、onStart()方法、onResume()方法,此时,就可以查看短信了;如果微信聊天程序的Activity界面被完全覆盖,则还会调用微信聊天程序Activity的onStop()方法。当阅读完短信,并关闭短信程序后,Android会根据微信聊天程序Activity被覆盖的情况(部分或完全被短信界面覆盖),自动调用微信聊天程序Activity的onResume()方法,或先调用onRestart()方法,再调用onStart()方法,并继续调用onResume()方法,将微信聊天程序的Activity在屏幕上显示出来,这时,微信聊天程序Activity的界面又显示在屏幕上了。当用户关闭一个Activity,也就是在程序界面上点击返回按钮,或者调用Activity的finish()方法时,Android会自动顺序调用该Activity的onPause()→onStop()→onDestroy()来结束Activity。4.2Activity生命周期观察packagecom.example.ch0401;
importandroid.os.Bundle;importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivity{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});System.out.println("onCreate()called");}@OverrideprotectedvoidonStart(){super.onStart();System.out.println("onStart()called");}
@OverrideprotectedvoidonResume(){super.onResume();System.out.println("onResume()called");}
@OverrideprotectedvoidonPause(){super.onPause();System.out.println("onPause()called");}
@OverrideprotectedvoidonStop(){super.onStop();System.out.println("onStop()called");}
@OverrideprotectedvoidonRestart(){super.onRestart();System.out.println("onRestart()called");}
@OverrideprotectedvoidonDestroy(){super.onDestroy();System.out.println("onDestroy()called");}}4.3使用Log类输出程序调试信息在Android程序中更常用的方式是使用Log类输出信息。使用Log类输出的信息可以使用Android的“adblogcat”命令在控制台查看程序输出的信息。packagecom.example.ch0401;
importandroid.os.Bundle;importandroid.util.Log;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivity{privatestaticStringTAG="我的调试信息";
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});//System.out.println("onCreate()called");Log.i(TAG,"onCreate()called");}
@OverrideprotectedvoidonStart(){super.onStart();//System.out.println("onStart()called");Log.i(TAG,"onStart()called");}
@OverrideprotectedvoidonResume(){super.onResume();//System.out.println("onResume()called");Log.i(TAG,"onResume()called");}@OverrideprotectedvoidonPause(){super.onPause();//System.out.println("onPause()called");Log.i(TAG,"onPause()called");}
@OverrideprotectedvoidonStop(){super.onStop();//System.out.println("onStop()called");Log.i(TAG,"onStop()called");}
@OverrideprotectedvoidonRestart(){super.onRestart();//System.out.println("onRestart()called");Log.i(TAG,"onRestart()called");}
@OverrideprotectedvoidonDestroy(){super.onDestroy();//System.out.println("onDestroy()called");Log.i(TAG,"onDestroy()called");}}Log类的常用方法及其功能。序号方法名功能
1staticintv(Stringtag,Stringmsg)用VERBOSE方式来进行消息的打印
2staticintd(Stringtag,Stringmsg)用DEBUG方式来进行消息的打印
3staticinti(Stringtag,Stringmsg)用INFO方式来进行消息的打印
4staticintw(Stringtag,Stringmsg)用WARN方式来进行消息的打印
5staticinte(Stringtag,Stringmsg)用ERROR方式来进行消息的打印4.4Android常见ActivityActivity及其子类是AndroidSDK中的关键类,这些类及其子类的继承关系如图。4.5课后同步练习探究性练习。编写一个Android程序,观察Activity生命周期方法被调用的过程。要求将Activity生命周期方法的调用过程写入一个文件中,例如,写入到名称为process.text的文本文件中以便查看Activity的生命周期过程。提示:因为Android程序使用Java语言编写的,因此,可以使用JavaSDK的I/O进行文件操作。之后,在AndroidStudio的菜单栏,选择ViewToolWindowsDeviceExplorer即可打开Android模拟器的Linux文件系统,如图所示:Q&A第5章Android常用UI组件在介绍了Android程序的基本框架之后,现在介绍如何构建Android的UI界面。Android提供了基本的用于构建程序UI的组件,包括:用于显示文字的TextView组件、用于显示图片的Image组件、用户显示进度情况的ProgressBar组件等。本章对Android的基础常用组件进行介绍。目录5.1基于XML的布局及组件使用入门5.2Android基本组件5.3Android容器组件5.4课后同步练习5.5AdapterView5.6ListView5.7Spinner5.8GridView5.9Android其他常用组件5.10课后同步练习5.1基于XML的布局及组件使用入门Android建议将程序界面与程序业务逻辑分离的方式来进行程序设计,其实,这不是Android的首创。在进行网页程序设计时,也采用将要显示的内容与页面的布局分离的方式:将要显示的信息保存在HTML中,而在CSS中定义信息显示的格式。下面举例说明Android基于XML的界面布局,以及如何响应对按钮的点击。这个程序首先显示一个巨大的按钮,当用户点击这个按钮时,在按钮上显示当前的日期和时间。activity_main.xml文件。<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<Buttonandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="@string/text_btn01"android:textSize="30sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>修改res/values/strings.xml的内容,在其中添加一个name为text_btn01的字符串资源定义。点击按钮时按钮的外观会发生变化,除此之外,没有其他反应。<resources><stringname="app_name">ch0501</string><stringname="text_btn01">点击</string></resources>程序需要响应用户对按钮的点击。通过实现View.OnClickListener接口来达到这个目的。View.OnClickListener是android.view.View类的一个内部接口,它定义了一个组件被点击时的响应函数:onClick()方法。修改MainActivity.java程序代码,在ID为id_btn01的按钮上监听点击事件,当按钮被点击时,对这个点击事件进行适当的响应。packagecom.example.ch0501;
importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
importjava.util.Date;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{Buttonbtn;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
btn=this.findViewById(R.id.id_btn01);//获取界面上Button(按钮)的引用btn.setOnClickListener(this);//设置按钮监听点击事件}
@OverridepublicvoidonClick(Viewv){Dated=newDate();btn.setText(d.toString());}}5.2Android基本组件Android基本组件包括Button、TextView、ImageView、EditText、CheckBox、RadioButton等。通过对这些组件的介绍,可以更好地掌握这些组件及其他组件的使用方法。Android的基础组件定义在android.widget包中。5.2.1ButtonButton组件是常用的组件。Button组件的每个XML可配置属性,均有一个与之对应的setXXX()方法。从android.widget.TextView中继承来的属性:(1)android:text设置在Button上要显示的文字。可以是一个字符串常量也可以是对一个字符串资源的引用。按照Android的规则,最好不要直接使用字符串常量,而应该使用字符串资源引用。(2)android:textColor设置显示在Button上的文字的颜色。可以是对一个颜色资源的引用,也可以是这些形式的颜色值:"#rgb"、"#argb"、"#rrggbb"或"#aarrggbb"。(3)android:textSize设置显示在Button上显示的文字尺寸大小。可以是一个常数加单位,如15px、20sp等,也可以是对单位度量资源的引用。(4)android:textStyle设置显示在Button上的文字风格,可用的值包括bold、italic、bolditalic。(5)android:typeface设置显示在Button上的文字的字体。目前Android只支持如下的字体:normal、sans、serif、monospace。从android.view.View中继承的XML配置属性。(1)android:id设置Button的ID属性以便在程序代码中可以引用该组件。(2)android:background设置Button的背景。可以是对一个mipmap/drawable资源的引用,也可以是形如"#rgb"、"#argb"、"#rrggbb"、"#aarrggbb"的颜色值。(3)android:clickable设置按钮是否可以响应点击事件。可选值包括true、false。(4)android:visibility设置按钮是否显示在屏幕上。可选值包括true、false。(5)android:padding、android:paddingTop、android:paddingBottom、android:paddingLeft、android:paddingRight设置组件的内边界,类似于HTML/CSS中的padding。(6)android:gravity设置按钮上显示的文字的对齐方式。可取值包括top、right、left、center等。5.2.2TextViewTextView用于显示一个文字到界面。显示在TextView中的字符串是不可编辑的。其实,Button组件的XML配置都是从TextView和View中继承来的,因此,TextView的属性与Button组件的XML配置属性是类似的。5.2.3ImageViewAndroid的ImageView组件用于显示图片。ImageView常用的XML配置属性包括如下内容。(1)android:maxHeight用于指定组件的最大高度。(2)android:maxWidth用于指定组件的最大宽度。(3)android:scaleType:center、centerCrop、centerInside、fitXY、……(4)android:src指定显示在组件中的图片。必须是对一个图片资源的引用。(5)android:contentDescription设定图片的描述性文字。下面举一个例子演示ImageView组件的使用。这个程序要求,当手机(模拟器)是竖屏时显示一张风景图片,横屏时显示另一张风景图片。新建名称为ch0502的Android工程,然后,按照如下操作新建mipmap-land资源目录:右击工程的res目录NewAndroidResourceDirectory。修改activity_main.xml布局文件为如下代码:<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<ImageView
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年市场消防安全责任人任命书
- 肝硬化患者血浆B型利钠肽水平与肝功能状态的深度关联研究
- 聚苯乙烯纳米塑料颗粒对小鼠脾淋巴细胞毒性作用的多维度解析
- 聚离子液体刷功能化超滤膜的制备与抗生物污染性能及机理探究
- 聚焦S省P县D中学:高三学生学习与生活的全景透视与深度剖析
- 2026年跨文化培训课程中的文化敏感性
- 聚合物纤维膜表面矿化过程调控:机制、影响因素与应用拓展
- 聚合物微悬臂梁:从制备工艺到多元应用的深度剖析
- 2026年失智老人精神慰藉与灵性关怀
- 2026年互联网投放培训服务协议
- 2026陕西西安市浐灞国际港交通大学附属中学陆港学校招聘考试备考题库及答案解析
- 山东省淄博市2025-2026学年度高三教学质量阶段性检测(淄博二模)化学+答案
- (三模)济南市2026届高三5月针对性训练政治试卷(含答案)
- 2026年病案专业技能大赛-病案综合管理专项试题
- 2025年钻井工试题及答案
- 《五一路社区卫生服务站财务管理制度》
- 2026年药品管理法实施条例新旧版本对照表
- 安徽省市政设施养护维修工程计价定额2022 上册
- JJF 1221-2025 汽车排气污染物检测用底盘测功机校准规范
- 《中小学幼儿园安全指南》解读专题培训
- 汽车维修售后业务合作协议书
评论
0/150
提交评论