安卓开发阶段性学习成果

Android开发简介

   Android简介

        Android:动操作系统。是一种基于Linux内核的自由及开放源代码的操作系统。市面上绝大多数手机品牌都使用此系统。学习Android可以打下移动开发的基础。Android开发可以使用Java/Kotlin语言,因本人不会Kotlin语言以下代码均为Java语言。

   Android开发环境搭建的流程与主要步骤

        因使用java语言编程,所以需要JDK的安装与配置。之后安装Android studio关联Android SDK,就可以使用Android创建和启动电脑上模拟手机运行应用。

        JDK与SDK之间的关系:JDK是专门针对Java语言开发的一套工具包,而SDK是一个更广泛的概念,包含了用于特定技术或平台开发的工具集。在Java领域,JDK是SDK的一个实例,用于支持Java语言的开发、编译和运行。

        Android开发环境搭建的主要步骤与下图所示:

Android开发环境主要步骤
Android开发环境搭建的主要步骤

Android布局管理器

   ViewViewGroup概述

        View:视图,是用户接口组件的基本构建块,它在屏幕中占用一个矩形区域,它是所有UI控件的基类,比如TextView,ImageView。

ViewGroup :ViewGroup是一个特殊的View,能够容纳其它的View(子控件),它是布局和视图容器的基类。(它是占据整个手机最大的框,能在上面放各种的View进行布局)

   Android布局概述

        在ViewGroup上对View进行位置、颜色等管理称为布局管理。这些布局通常以文件的方式保存,称为布局文件。而一个正常的手机应用不可能只有一个布局文件,实际开发中每个应用程序都包含多个界面,而程序默认提供的一个主界面布局无法满足需求,因此经常会在程序中添加多个布局。如图所示:layout包下的文件为布局文件

   Android中常用的五种布局

        Android中一个布局中是可以包含另一个布局的,这种情况一般称之为布局的嵌套。以下是常用的五种布局的简单介绍:

        线性布局

                以水平或垂直方向排列,这种布局方式特别适合于需要简单、直接排列控件的场景。线性布局是ViewGroup的子类,支持布局样式的嵌套,以实现更复杂的布局需求。

                设置线性布局的方向主要使用orientation属性。当orientation属性设置为horizontal时,子元素将水平排列;设置为vertical时,子元素将垂直排列。如果不指定orientation属性,则默认水平方向排列。

        约束布局

                以灵活的方式定位和调整,约束布局的核心理念是使用约束来计算子控件的大小和位置。这些约束包括对齐、边距、大小等,它们定义了子控件与父控件或其他子控件之间的相对关系。通过这种方式,即使在不嵌套其他布局容器的情况下,也能构建出复杂的界面布局。

        帧布局

                开辟空白区域,帧里面的控件可叠加。为每个加入其中的控件创建一个空白区域,称为一帧,每个控件占据一帧。这种布局方式的特点是所有控件都默认显示在屏幕的左上角,并按照先后放入的顺序重叠摆放。后添加的控件会层叠在先添加的控件上,形成一种堆叠的效果。帧布局的大小由内部最大控件决定,如果多个控件大小相同,则同一时刻只能看到最上面的那个组件,后续添加的控件会覆盖前一个。

        表格布局

                以表格形式排列,对于Android开发来说,表格布局也是一种常见的界面设计方法。开发者可以使用各种布局管理器来创建和管理表格视图,以确保界面元素的正确排列和显示。

        相对布局

                通过相对定位来进行排列,也是一种灵活的布局方式,它允许控件相对于其父容器或其他控件进行定位。这种布局方式特别适用于需要复杂布局的情况,如当线性布局嵌套多层时,可以采用RelativeLayout结合LinearLayout的layout_weight属性来使用。

   布局的常用属性

        线性布局常用属性:

                android:orientation 设置线性布局的朝向,可设置为horizontalvertical两种排列方式,默认为水平方向。

                android: gravity 线性布局的控件默认是从左到右排列(horizontal)或者从上往下排列(vertical)的,如果想让线性布局中的子控件排列对齐右边缘或者底部,可以用gravity属性控制。将其中的属性值设置为“right”或“bottom”

        布局中控件的常用属性:

                android: layout_gravity  gravity属性表示当前布局/控件内部的子控件位置,layout_gravity表示当前控件在父控件的位置。当父控件设置了gravity且子控件也设置了layout_gravity时, 子控件的layout_gravity优先级高。

                android: layout_weight 该属性需要加在LinearLayout的子控件中。其作用是分配线性布局中的剩余空间到该控件上(注意分割的是剩余空间而不是总空间)。在控件没有添加layout_weight属性时,控件未占满线性布局的区域会空出来。如果都加上android:layout_weight=“1”,则多个控件均匀分配剩余空间。如果填入不同的数字,则按对应数字比例瓜分剩余空间。

        约束布局控件定位属性:

                虽然定位属性有很多种,但它们的关键字为:layout_constraint 后面跟的是例如 此控件的左与另一个控件的右边对其:Left_toRightOf,所以需要用约束布局种控件定位的属性只需要在控件属性中打出关键字即可,例如控件需要顶端对齐,则需要打出ToptoTop关键字即可选择layout_constraintTop_toTopOf后输入需要对其控件的id即可。

属性名称

功能描述

layout_constraintLeft_toLeftOf

控件的左边与另外一个控件的左边对齐

layout_constraintLeft_toRightOf

控件的左边与另外一个控件的右边对齐

layout_constraintRight_toLeftOf

控件的右边与另外一个控件的左边对齐

layout_constraintRight_toRightOf

控件的右边与另外一个控件的右边对齐

layout_constraintTop_toTopOf

控件的上边与另外一个控件的上边对齐

layout_constraintTop_toBottomOf

控件的上边与另外一个控件的底部对齐

layout_constraintBottom_toTopOf

控件的底边与另外一个控件的上边对齐

layout_constraintBottom_toBottomOf

控件的底边与另外一个控件的底部对齐

layout_constraintStart_toEndOf

控件的起始边与另外一个控件的尾部对齐

layout_constraintStart_toStartOf

控件的起始边与另外一个控件的起始边对齐

layout_constraintEnd_toStartOf

控件的尾部与另外一个控件的起始边对齐

layout_constraintEnd_toEndOf

控件的尾部与另外一个控件的尾部对齐

layout_constraintBaseline_toBaselineOf

控件间的文本内容基准线对齐        

        控件的定位与偏向:

                当完成控件的约束,发现还想进行偏移或者调整控件之间的间隙。可以通过bias和chain来完成。

               layout_constraintHorizontal_bias 横向的倾向,取值0-1,此取值关系之前约束的控件,0为开始端,1为末端以此类推。

                layout_constraintVertical_bias 纵向的倾向,取值0-1。与上面相同,但此倾向为垂直,0为顶端,1为底端。

                Chain(链),在同一个轴上(水平或者垂直)提供一个类似群组的统一表现,是一种特殊的约束,它使我们能够对一组水平或竖直方向互相关联的控件进行统一管理。一组控件通过一个双向的约束关系链接起来,就能形成一个Chain。

                当控件互相进行了位置约束时,且链头开始端连接了边界,链尾结束端连接了另一端的边界,链就形成了。

                链形成后可以通过layout_constraintHorizontal_weight或layout_constraintVertical_weight进行权重的分配,效果与线性布局的权重分配一样。

                还可以通过链的样式设置,以下是三种设置的预览:

Android常用控件

   Android的基本控件

                Android的基本控件有:TextView、EditText、Button、RadioButton、CheckBox、ImageView等。

   TextView

                TextView是用于显示文字(字符串)的控件,可在代码中通过改变文字的大小、颜色、样式等功能。

常用属性

功能描述

android:layout_width

设置TextView控件的宽度

android:layout_height

设置TextView控件的高度

android:id

设置TextView控件的唯一标识

android:background

设置TextView控件的背景

android:text

设置文本内容

android:textColor

设置文字显示的颜色

android:textSize

设置文字大小,推荐单位为sp

android:textStyle

设置文本样式,如bold(粗体),italic(斜体),normal(正常)

style

引用所需的样式

   EditText

                EditText继承自TextView,可以进行编辑操作,将用户信息传递给Android程序。还可以为EditText控件设置监听器,用来测试用户输入的内容是否合法。

属性名称

功能描述

android:hint

控件中内容为空时显示的提示文本信息

android:textColorHint

控件中内容为空时显示的提示文本信息的颜色

android:inputType

设置输入的字符类型,若多种类型,需加“|”分隔

android:maxLines

设置文本的最多行数

android:minLines

设置文本的最少行数

android:editable

设置是否可编辑

EditText监听方法

1.setOnEditorActionListener

        public void setOnEditorActionListener (TextView.OnEditorActionListener l)

        设置在对文本框执行操作时调用的特殊监听器。

        需实现接口:OnEditorActionListener

2. addTextChangedListener

        public void addTextChangedListener (TextWatcher watcher)

        添加一个TextWatcher到其方法的列表中,无论何时在TextView的文本发生变化时被调用。 

       需实现接口:TextWatcher

   Button

                Button是按钮,是用于响应用户的一系列点击事件,使程序更加流畅和完整。

   RadioButtonRadioGroup

                RadioButton为单选按钮,它需要与RadioGroup配合使用,提供两个或多个互斥的选项集。

                RadioGroup是单选组合框,可容纳多个RadioButton,并把它们组合在一起,实现单选状态。

RadioGroup监听事件

利用setOnCheckedChangeListener()监听RadioGroup控件状态,通过if语句判断被选中RadioButton的id。

ImageView

                ImageView是视图控件,它继承自View,其功能是在屏幕中显示图像。ImageView类可以从各种来源加载图像(如资源库或网络),并提供缩放、裁剪、着色(渲染)等功能。

                ImageView重要的属性src,此属性存放图片的地址或者网络链接来定位图片的加载。

        

Activity与Intent

        Activity与界面的关联

                Actitvity是打开应用程序的某一个界面,开发一个APP会创建很多个Actitvity,点开APP时会有总配置中打开默认的第一个Actitvity,随后通过按钮的点击或者链接去跳转到其他Actitvity。

                应用启动时,弹出的第一个Actitvity(界面)总是从总配置exported为true的活动开始,而name为.MainActitvity2的界面就只能通过按钮或链接去启动,如下图:

                安卓界面由Activity创建和管理,可直接在Activity类里面设计UI界面和控制逻辑。为了实现解耦,现在的安卓开发,把逻辑控制留在Activity类里面,UI部分放到res/layout目录下,然后在Activity中使用setContentView方法进行关联。

                上述为官方解释,大致意思是为了降低代码之间的关联度,将界面布局部分和逻辑实现部分分开,只通过Activity中setContentView方法进行关联。setContentView是某个类绑定一个页面视图的方法。使用方法创建一个类继承了AppCompatActivity后重写onCreate方法是调用setContentView与视图关联。

                下图为当活动被创建时与activity_mainl关联:

代码与显示界面的关系

                下图为显示界面与代码之间的联系:

显示界面与代码的关联

        Activity的基本用法

                活动的用法与活动的生命周期息息相关,一个活动基本的用法无非就是显示自身页面进行使用,这个在上述的代码与显示界面的连接中已经可以实现了。剩下的基本用法就是跳转到其他活动或者关闭自身活动。将在以下代码进行讲解:

                Activity的跳转

                在说明跳转前先简单介绍一下Intent(目的/意图),使用Intent显式转跳时,输入两个参数分别是Context和Class类型的,Context在这里有场景的意思,意为从此场景跳转到指定的类并执行,然后此类又是继承AppCompatActivity,而后这个类被执行时就会遵寻Activity的生命周期(下文有提及),先执行Activity的onCreate进而如同上述活动与界面的关联。这样就打开了另一个活动。以下代码为Intent的显式跳转

                既然有显示转跳,那么相对应就会有隐式跳转,隐式跳转与显式跳转的区别:显式跳转可以直接指定class来跳转,一般用于自身应用中的页面跳转。但当要跳转到其他应用时并不知道其他应用的类名,则要总配置中的<intent-filter>找到对应的name。隐式跳转是应用与应用之间的,每一应用在开始时第一个界面中总配置中有<intent-filter>会设置两个属性,一个是name,一个是category。设置<intent-filter>这两个属性都是必须的。

                总配置中设置的<intent-filter>如下:

                通过传入总配置中的name属性与增加种类组去寻找对应的界面,隐式跳转代码如下:

        Activity生命周期

                Activity生命周期是指一个Activity被创建到结束的全过程。因为界面不是只使用一次的,是周而复始的,每次使用此Activity时就会进入到一个周期直到这个周期结束销毁后,再次使用又会创建下一个过程一样的周期。

oncreate()->onstart()->onResume()->onRestart()->onPouse()->onStop()->onDestory()

onCreate() : 在Activity创建时调用,通常做一些初始化设置;
onStart(): 在Activity即将可见时调用;
onResume(): 在Activity已可见,获取焦点开始与用户交互时调用;
onPause(): 在当前Activity被其他Activity覆盖或锁屏时调用;
onStop() : 在Activity对用户不可见时调用;
onDestroy() :在Activity销毁时调用;
onRestart() : 在Activity从停止状态再次启动时调用;

                Activity生命周期如下图所示:       

                生命周期在跳转中的具体表现:

        Intent与IntentFilter

                Intent与IntentFilter的关系

                在Android开发中,Intent和IntentFilter是用来在应用程序之间传递信息的重要机制。Intent主要用于启动活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)以及处理这些组件之间的通信。

                IntentFilter是组件(如Activity、Service和BroadcastReceiver)的一个属性,它描述了组件愿意接收哪种类型的Intent。当Intent被传递给组件时,Android系统会检查IntentFilter来确定是否该组件可以处理该Intent。

                Intent属性

                Intent对象大致包括7大属性:Component,Action,Category,data,Type,Extra,Flag。

                通常,Action, Category属性结合使用。定义这两个属性都是在主配置文件的<intent-filter>节点中。Intent通过定义Action属性(其实就是定义一段自定义的字符串),这样就可以把Intent与具体的某个Activity分离,实现了解耦。

                Component:表示要处理Intent的组件,例如Activity、Service或Broadcast Receiver等。

                Type:表示Intent要操作的数据类型,例如文本、图片、音频、视频等。可以使用预定义的MIME类型或自定义类型。

                Data:属性是 Uri 类型,格式为:<scheme>://<host>:<port>/<path>,这四个部分由四个属性表示。

                Extras:表示要传递给组件的额外数据,例如键值对、序列化对象等。

                Flags:表示Intent的其他标志。

        Fragment

                fragment可以看作为一种特殊的Activity,它被包含于Activity,它也有独属自己的生命周期。它的作用是不用转跳整个界面,能使整个界面的一部分的内容进行更改,故直译过来有”碎片“的意思。

                创建一个新的fragment如下步骤:

                使用fragment要在主布局中需要添加一个<fragment>的标记对,并且id和name属性是必要的。因为没有这两属性,fragment就会无法显示,id是类寻找到<fragment>标记对的属性,而name则是这个fragment要显示出来的指定名称,例如此处需要显示一个名为BlankFragment,则需要在name属性中打出这个fragment的全限定类名。如下图所示:

                想要切换这个fragment就需要在代码中创建一个FragmentTransaction关于fragment的事务,使用这个事务将页面fragment中的内容切换。代码如下:

                扩展知识:如果想要fragment一开始不出现,那么在布局页面中就不能使用<fragment>标记对,而是使用<FrameLayout>,这样可以不用填充name的属性使得一开始Fragment并不出现。直至事务去替换当前Fragment的内容。

Android高级控件

         自动完成文本框

                自动完成文本框概述

                自动完成文本框由文本框(EditText)派生而出,实际上它也是一个编辑框,但它比普通编辑框添加了一个功能:当用户输人一定字符后,自动完成文本框会显示一个下拉菜单,供用户从中选择,当用户选择了某个菜单项后,自动完成文本框就会按用户选择自动填写该文本框。

                自动完成文本框实现

                自动完成文本框的多数属性与文本框相同,常有属性completionHint选择时弹出的提示信息,属性completionThreshold 此属性为输入字符达到设定字符时给出选择信息,默认为2,页面布局如下所示:

                代码中只需要把所需要的数据放入适配器,然后设置自动完成文本框中的setAdapter即可,代码如下:

                其中的android.R.layout.simple_list_item_1时显示一条信息的布局,如果有需要可以改变入参中的传入布局信息使得界面更加美观。

                自动完成文本框展示效果

                由上述代码实现的自动完成文本框效果如下:

        下拉列表

                下拉列表概述

                Spinner 组件是一种以下拉表的形式供用户快速进行数据输入的下拉控件,可以通过组件的 entries 属性绑定数据源,也可以通过数据适配器加载数据。Spinner 组件可以使用下拉列表和对话框两种形式展示,通过 spinnerMode 属性控制。

                下拉列表代码实现

                spinnerMode可以控制下拉模式和窗口模式,区别在于点击下拉列表后时弹出窗口还是直接下拉列表提供选择,默认为下拉框。页面布局代码如下:

                与上述的自动完成文本框相同,下来列表也是只需要将数据存放进适配器内既可使用,下拉列表同样提供了setAdapter方法,只需要放入对应适配器皆可:                

                下拉列表展示效果

                以下是两种不同模式下的展示效果,左边为窗口模式,右边为下拉模式:

        滚动视图

                滚动视图概述

                手机屏幕的显示空间有限,常常需要上下滑动或左右滑动才能拉出其余页面内容,可惜一般的布局节点 都不支持自行滚动,这时就要借助滚动视图了。滚动视图分为垂直方向和水平方向 两类,其中垂直滚动视图名为ScrollView,水平滚动视图名为HorizontalScrollView。这两个滚动视图的使用并不复杂,需要注意的是,滚动视图节点下面必须且只能挂着一个子控件,否则会在运行时报错。

                滚动视图代码实现

                滚动视图在布局中更像一个容器,提供一个可以滑动的容器,当里面存放子控件超过需要容器设定大小时可以提供滑动。所以只有在布局中设定,没有在类中体现。

                滚动视图布局代码如下:

                在代码中,创建了一个可变的字符序列StringBuilder,并向它不断的追加字符串,使得textview的文本超出屏幕长度来体现出滚动列表的功能。

                滚动视图展示效果

                上述代码实现的滚动视图效果如下:

        列表视图

                列表视图概述

                ListView是一种常用的展示列表数据的控件,它可以在应用中展示大量的数据,如联系人列表、歌曲列表等。 因为大部分的应用都需要展示一些列表数据,如新闻客户端需要展示新闻列表、社交应用需要展示好友列表等,所以ListView在安卓开发中是必不可少的。

                列表视图代码实现

                列表视图的布局非常简单,只需要将基本属性配置好就可以使用。布局代码如下:

                在此之前我们适配器使用的都是系统自带的,但如微信的好友列表之类的列表视图常常有图片和文字混合,想要实现这些效果就需要创建一个布局作为列表的某一行,然后创建适配器将布局和值对应起来再放入列表中。

                所以得先创建列表某一行的布局,先创建新的布局将它设置为以下样式:

                再创建一个类去输出得到数据给自己定义的适配器,此类与上面的布局需要的一致,适配器的作用就是将布局和类中的数据联系在一起。

                适配器的类需要继承一个抽象类BaseAdapter,重写四个方法,分别是:getCount、getItem、getItemId、getView。其核心就是getView。getView把重载得到参数一一放入获得的列表中。使用到了Layoutinflater.from().inflate,动态加载将只有一行的布局充入列表视图中,最后返回视图。

                适配器代码如下:

                列表视图的代码只需要创建需要放入数据的数组,再将视图的场景与数组传入(重载的入参)适配器中,最后设置ListView的适配器即setAdapter,实现代码如下:

                列表视图展示效果

                上述视图列表代码的实现效果如下:

    进度条与滑块

                进度条与滑块概述

                进度条(ProgressBar)是UI界面中一种实用的UI组件。它用于显示一个耗时操作的百分比。滑块(SeekBar)用于对 Android 系统中的某项数值进行调节,如音量、亮度等。和进度条非常相似,进度条 ProgressBar 采用颜色填充来表明任务的进度,而滑块通过位置来标识数值,且允许用户拖动滑块来改变进度。

                进度条的常用属性:

ProgressBar属性名称

功能描述

max

进度条的最大值

progress

进度条已完成进度值

progressDrawable

轨道对应的Drawable对象

indeterminate

如果设置成true,则进度条不精确显示进度

indeterminateDrawable

设置不显示进度的进度条的Drawable对象

indeterminateDuration

设置不精确显示进度的持续时间

secondaryProgress

二级进度条

                滑块的常用属性:

SeekBar属性名称

功能描述

max

滑动条的最大值

progress

滑动条的当前值

secondaryProgress

二级滑动条的进度

thumb

滑块的drawable

                 进度条样式预览:

                滑块的简单使用

                滑块的简单使用,首先在布局中创建一个滑块,如下图所示:

                想要显示它滑动的数值需要一个TextView来帮助显示,只需要使用setOnSeekBarChangeListener中创建OnSeekBarChangeListener重写onProgressChanged即可,代码如图所示:

                滑块展示效果

                当滑动滑块时数值根据滑块的位置而变化,实现效果如下:

Android菜单与对话框

        选项菜单简介

                选项菜单是一种常见的用户界面组件,用于提供快捷操作,提高应用程序的易用性和用户满意度。选项菜单通常用于一些常见的场景,例如复制、粘贴、删除、设置、搜索或分享等操作。需要注意的是,在开发应用程序时需要考虑版本兼容性。

        新创建的项目往往不显示出菜单选项,我们需要通过设置values/themes.xml文件中的style来使得菜单栏显示,如下所示:

        以上操作显示出来的菜单栏文字为我们的项目名,通过以下步骤可以改为需要显示的名字,找到values/strings.xml,修改<string name="app_name">中的文本皆可。如下图所示:

        创建选项菜单

                在 res/menu 目录下创建 xml ,定义菜单项;

                在 Java 代码重写 onCreateOptionsMenu ,关联 xml 和代码;

                在 Java 代码重写 onOptionsItemSelected,处理菜单点击逻辑。

上述代码实现效果:

总结

  在这门课程中,我们经历了一次全面的APP程序开发之旅。我们从最基础的编程概念和工具开始,逐步深入到复杂的用户界面设计、数据处理、以及后端服务交互。通过理论与实战相结合的教学方式,我们不仅学习了Android平台的基本框架,还亲手打造了属于自己的应用程序。

  经过这几周的学习,我对移动应用开发有了更深层次的认识。我学会了如何分析问题、设计解决方案,并且用代码将想法变为现实。更重要的是,这门课程激发了我对于不断学习新技术的热情。随着技术的不断发展,我意识到作为一名开发者,我们需要不断地适应新工具和语言,这样才能保持竞争力。

总的来说,这门课程不仅是对技术能力的提升,更是对解决问题能力的培养。我将会继续在这条路上探索,感谢这门课程带给我的一切。

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值