Android安卓开发 - 开发基础(二)

news2024/11/20 2:39:16

App的工程结构                                                            

本节介绍App工程的基本结构及其常用配置,首先描述项目和模块的区别,以及工程内部各目录与配置

文件的用途说明;其次阐述两种级别的编译配置文件build.gradle,以及它们内部的配置信息说明;再次讲述运行配置文件AndroidManifest.xml的节点信息及其属性说明。

2.2.1 App工程目录结构                                                            

App工程分为两个层次,第一个层次是项目,依次选择菜单File→New→New Project即可创建新项目。

另一个层次是模块,模块依附于项目,每个项目至少有一个模块,也能拥有多个模块,依次选择菜单

FileNewNew Module即可在当前项目创建新模块。一般所言的编译运行App”,指的是运行某个模块,而非运行某个项目,因为模块才对应实际的App。单击Android Studio左上角竖排的Project标签,可见App工程的项目结构如图2-12所示。

 

该项目下面有两个分类:一个是app(代表app模块);另一个是Gradle Scripts。其中,app下面又有3个子目录,其功能说明如下:

  1. manifests子目录,下面只有一个XML文件,即AndroidManifest.xml,它是App的运行配置文件。
  2. java子目录,下面有3个com.example.myapp包,其中第一个包存放当前模块的Java源代码,后面两个包存放测试用的Java代码。
  3. res子目录,存放当前模块的资源文件。res下面又有4个子目录:

drawable目录存放图形描述文件与图片文件。

layout目录存放App页面的布局文件。

mipmap目录存放App的启动图标。

values目录存放一些常量定义文件,例如字符串常量strings.xml、像素常量dimens.xml、颜色常量colors.xml、样式风格定义styles.xml等。

Gradle Scripts下面主要是工程的编译配置文件,主要有:

  1. build.gradle,该文件分为项目级与模块级两种,用于描述App工程的编译规则。
  2. proguard-rules.pro,该文件用于描述Java代码的混淆规则。
  3. gradle.properties,该文件用于配置编译工程的命令行参数,一般无须改动。
  4. settings.gradle,该文件配置了需要编译哪些模块。初始内容为include ':app',表示只编译app模块。
  5. local.properties,项目的本地配置文件,它在工程编译时自动生成,用于描述开发者电脑的环境配置,包括SDK的本地路径、NDK的本地路径等

2.2.2 编译配置文件build.gradle                                               

新创建的App项目默认有两个build.gradle,一个是Project项目级别的build.gradle;另一个是Module 模块级别的build.gradle。

项目级别的build.gradle指定了当前项目的总体编译规则,打开该文件在buildscript下面找到

repositories和dependencies两个节点,其中repositories节点用于设置Android Studio插件的网络仓

库地址,而dependencies节点用于设置gradle插件的版本号。由于官方的谷歌仓库位于国外,下载速度相对较慢,因此可在repositories节点添加阿里云的仓库地址,方便国内开发者下载相关插件。修改之后的buildscript节点内容如下所示:

 模块级别的build.gradle对应于具体模块,每个模块都有自己的build.gradle,它指定了当前模块的详细编译规则。build.gradle补充文字注释,方便读者更好地理解每个参数的用途。

 

 

为啥这两种编译配置文件的扩展名都是Gradle呢?这是因为它们采用了Gradle工具完成编译构建操作。

Gradle工具的版本配置在gradle\wrapper\gradle-wrapper.properties,也可以依次选择菜单

File→Project Structure→Project,在弹出的设置页面中修改Gradle Version。注意每个版本的Android Studio都有对应的Gradle版本,只有二者的版本正确对应,App工程才能成功编译。比如Android

Studio 4.1对应的Gradle版本为6.5,更多的版本对应关系见

2.2.3 运行配置文件AndroidManifest.xml                                

AndroidManifest.xml指定了App的运行配置信息,它是一个XML描述文件,初始内容如下所示:

 

可见AndroidManifest.xml的根节点为manifest,它的package属性指定了该App的包名。manifest下面有个application节点,它的各属性说明如下:

   android:allowBackup,是否允许应用备份。允许用户备份系统应用和第三方应用的apk安装包和应用数据,以便在刷机或者数据丢失后恢复应用,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复。为true表示允许,为false则表示不允许。

android:icon,指定App在手机屏幕上显示的图标。 android:label,指定App在手机屏幕上显示的名称。

android:roundIcon,指定App的圆角图标。

android:supportsRtl,是否支持阿拉伯语/波斯语这种从右往左的文字排列顺序。为true表示支持,为false则表示不支持。

android:theme,指定App的显示风格。

注意到application下面还有个activity节点,它是活动页面的注册声明,只有在AndroidManifest.xml中正确配置了activity节点,才能在运行时访问对应的活动页面。初始配置的MainActivity正是App的默认主页,之所以说该页面是App主页,是因为它的activity节点内部还配置了以下的过滤信息:

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

其中action节点设置的android.intent.action.MAIN表示该页面是App的入口页面,启动App时会 先打开该页面。而category节点设置的android.intent.category.LAUNCHER决定了是否在手机屏幕上显示

App图标,如果同时有两个activity节点内部都设置了android.intent.category.LAUNCHER,那么桌面就会显示两个App图标。以上的两种节点规则可能一开始不太好理解,读者只需记住默认主页必须同时配置这两种过滤规则即可。

2.3 App的设计规范                                                    

本节介绍了App工程的源码设计规范,首先App将看得见的界面设计与看不见的代码逻辑区分开,然后利用XML标记描绘应用界面,同时使用Java代码书写程序逻辑,从而形成App前后端分离的设计规约,有利于提高App集成的灵活性。

2.3.1 界面设计与代码逻辑                                                          

手机的功能越来越强大,某种意义上相当于微型电脑,比如打开一个电商App,仿佛是在电脑上浏览网站。网站分为用户看得到的网页,以及用户看不到的Web后台;App也分为用户看得到的界面,以及用户看不到的App后台。虽然Android允许使用Java代码描绘界面,但不提倡这么做,推荐的做法是将界面设计从Java代码剥离出来,通过单独的XML文件定义界面布局,就像网站使用HTML文件定义网页那样。

直观地看,网站的前后端分离设计如图2-13所示,App的前后端分离设计如图2-14所示。

  1. 使用XML文件描述App界面,可以很方便地在Android Studio上预览界面效果。比如新创建的App 项目,默认首页布局为activity_main.xml,单击界面右上角的Design按钮,即可看到如图2-15所示的预览界面。

如果XML文件修改了Hello World的文字内容,立刻就能在预览区域观看 新界面。倘若使用Java代码描绘界面,那么必须运行App才能看到App界面,无疑费时许多。

  1. 一个界面布局可以被多处代码复用,比如看图界面,既能通过商城购物代码浏览商品图片,也能通过商品评价代码浏览买家晒单。
  2. 反过来,一段Java代码也可能适配多个界面布局,比如手机有竖屏与横屏两种模式,默认情况App

采用同一套布局,然而在竖屏时很紧凑的界面布局(见图2-16),切换到横屏往往变得松垮乃至变形

(见图2-17)。

图2-15 XML文件的预览界面

图2-16 竖屏时候的界面布局

图2-17 横屏时候的界面布局

鉴于竖屏与横屏遵照一样的业务逻辑,仅仅是屏幕方向不同,若要调整的话,只需分别给出竖屏时候的界面布局,以及横屏时候的界面布局。因为用户多数习惯竖屏浏览,所以res/layout目录下放置的XML

文件默认为竖屏规格,另外在res下面新建名为layout-land的目录,用来存放横屏规格的XML文件。

land是landscape的缩写,意思是横向,Android把layout-land作为横屏XML的专用布局目录。然后在 layout-land目录创建与原XML同名的XML文件,并重新编排界面控件的展示方位,调整后的横屏界面如图2-18所示,从而有效适配了屏幕的水平方向。

图2-18 采用另一个XML文件的横屏布局

总的来说,界面设计与代码逻辑分离的好处多多,后续的例程都由XML布局与Java代码两部分组成。

2.3.2 利用XML标记描绘应用界面                                              

在前面“2.1.2 App的开发语言末尾,给出了安卓控件的XML定义例子,如下所示:

 注意到TextView标签以“<”开头,以“/>”结尾,为何尾巴多了个斜杆呢?要是没有斜杆,以左右尖括号包裹标签名称,岂不更好?其实这是XML的标记规范,凡是XML标签都由标签头与标签尾组成,标签头以左右尖括号包裹标签名称,形如“”;标签尾在左尖括号后面插入斜杆,以此同标签头区分开,形如“”。标签头允许在标签名称后面添加各种属性取值,而标签尾不允许添加任何属性,因此上述TextView标签的完整XML定义是下面这样的:

考虑到TextView仅仅是个文本视图,其标签头和标签尾之间不会插入其他标记,所以合并它的标签头和标签尾,也就是让TextView标签以“/>”结尾,表示该标签到此为止。

然而不是所有情况都能采取简化写法,简写只适用于TextView控件这种末梢节点。好比一棵大树,大树先有树干,树干分岔出树枝,一些大树枝又分出小树枝,树枝再长出末端的树叶。一个界面也是先有根节点(相当于树干),根节点下面挂着若干布局节点(相当于树枝),布局节点下面再挂着控件节点

(相当于树叶)。因为树叶已经是末梢了,不会再包含其他节点,所以末梢节点允许采用“/>”这种简写方式。

譬如下面是个XML文件的布局内容,里面包含了根节点、布局节点,以及控件节点:

 

上面的XML内容, 外层的LinearLayout标签为该界面的根节点,中间的LinearLayout标签为布局节点, 内层的TextView为控件节点。由于根节点和布局节点都存在下级节点,因此它们要有配对的标签头与标签尾,才能将下级节点包裹起来。根节点其实是特殊的布局节点,它的标签名称可以跟布局节点一样,区别之处在于下列两点:

  1. 每个界面只有一个根节点,却可能有多个布局节点,也可能没有中间的布局节点,此时所有控件节点都挂在根节点下面。
  2. 根节点必须配备“xmlns:android="http://schemas.android.com/apk/res/android"”,表示指定

XML内部的命名空间,有了这个命名空间,Android Studio会自动检查各节点的属性名称是否合法,如果不合法就提示报错。至于布局节点就不能再指定命名空间了。

有了根节点、布局节点、控件节点之后,XML内容即可表达丰富多彩的界面布局,因为每个界面都能划分为若干豆腐块,每个豆腐块再细分为若干控件罢了。三种节点之外,尚有“”这类注释标记,它的作用是包裹注释性质的说明文字,方便其他开发者理解此处的XML含义。

2.3.3 使用Java代码书写程序逻辑                                              

在XML文件中定义界面布局,已经明确是可行的了,然而这只是静态界面,倘若要求在App运行时修改文字内容,该当如何是好?倘若是动态变更网页内容,还能在HTML文件中嵌入JavaScript代码,由js片段操作Web控件。但Android的XML文件仅仅是布局标记,不能再嵌入其他语言的代码了,也就是说,只靠XML文件自身无法动态刷新某个控件。

XML固然表达不了复杂的业务逻辑,这副重担就得交给App后台的Java代码了。Android Studio每次创

建新项目,除了生成默认的首页布局activity_main.xml之外,还会生成与其对应的代码文件

MainActivity.java。赶紧打开MainActivity.java,看看里面有什么内容,该Java文件中MainActivity类的内容如下所示:

可见MainActivity.java的代码内容很简单,只有一个MainActivity类,该类下面只有一个onCreate方

法。注意onCreate内部的setContentView方法直接引用了布局文件的名字activity_main,该方法的意思是往当前活动界面填充activity_main.xml的布局内容。现在准备在这里改动,把文字内容改成中文。

首先打开activity_main.xml,在TextView节点下方补充一行android:id="@+id/tv_hello",表示给它起个名字编号;然后回到MainActivity.java,在setContentView方法下面补充几行代码,具体如下:

 

新增的两行代码主要做了这些事情:先调用findViewById方法,从布局文件中取出名为tv_hello的

TextView控件;再调用控件对象的setText方法,为其设置新的文字内容。

代码补充完毕,重新运行测试App,发现应用界面变成了如图2-19所示的样子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1594000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用于扩展Qt本身的插件(上)

Qt自身插件 引言示例插件与应用插件的程序作为整体插件和应用插件的程序单独存在实现插件编写测试插件的程序应用插件运行结果引言 用于扩展qt自身的插件按照我的理解分为两种: 1. 直接扩展Qt自身,无需在QtCreator的设计器中加载; 2. 扩展Qt自身,同时需要在QtCreator的设计…

【SpringBoot整合系列】SpringBoot 实现大文件分片上传、断点续传及秒传

目录 功能介绍文件上传分片上传秒传断点续传 相关概念相关方法大文件上传流程前端切片处理逻辑后端处理切片的逻辑流程解析 后端代码实现功能目标1.建表SQL2.引入依赖3.实体类4.响应模板5.枚举类6.自定义异常7.工具类8.Controller层9.FileService10.LocalStorageService11.File…

设计模式代码实战-工厂模式

1、问题描述 小明家有两个工厂&#xff0c;一个用于生产圆形积木&#xff0c;一个用于生产方形积木&#xff0c;请你帮他设计一个积木工厂系统&#xff0c;记录积木生产的信息。 输入案例 3 Circle 1 Square 2 Circle 1 2、工厂模式 将产品的创建过程封装在⼀个⼯⼚类中&am…

变换时光:用MagicTime生成落叶纷飞的视频

简介 MagicTime: https://huggingface.co/spaces/BestWishYsh/MagicTime 是一款基于时间延迟视频生成模型的变体人工智能工具&#xff0c;它可以让您将静止图像转换为动态视频&#xff0c;赋予图像生命。 今天&#xff0c;我们将利用MagicTime来生成一片落叶纷飞的景象&#…

【从浅学到熟知Linux】程序地址空间分布与进程地址空间详谈(含虚拟地址到物理地址的映射)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 程序地址空间概览进程地址空间 程序地址空间概览 我们在执行一个C语言程序时&#xff0c;它包含代码、变量…

配置DHCP服务器实现为动态客户端和静态客户端分配不同网络参数

相关学习推荐&#xff1a;什么是DHCP?为什么要使用DHCP&#xff1f; 华为HCIP课程【视频教程】&#xff1a;华为HCIP必考题&#xff1a;DHCP协议原理与配置 组网需求 如图1所示&#xff0c;Router作为企业出口网关&#xff0c;PC和IP Phone为某办公区办公设备。为了方便统一管…

记一次Oracle DG备库实例宕分析

一、问题现象 同事反馈国外点在国内的XXX备库实例宕&#xff0c;尝试将该实例重启&#xff0c;结果重启报如下错误&#xff0c;未能正常启动该数据库。 Standby crash recovery failed to bring standby database to a consistent point because needed redo hasnt arrived yet…

全国贫困县DID数据(2008-2022年)

数据来源&#xff1a;国W院扶贫开发领导小组办公室 时间跨度&#xff1a;2008-2022年 数据范围&#xff1a;各县域 数据指标 年份 县域名称 所属地市 所属省份 县域代码 是否贫困县(是为1&#xff0c;否为0) 参考文献&#xff1a; [1]马雯嘉,吴茂祯.从全面脱贫到乡村振兴…

ChatGPT在线网页版

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

FL Studio808鼓音在哪 FL Studio怎么让音乐鼓点更有力 FL Studio教程

FL Studio808鼓音在哪&#xff1f;808是一款电鼓机的名称&#xff0c;它发出的声音也被称之为808鼓&#xff0c;通常我们可以安装鼓机插件来使用&#xff0c;但FL Studio中自带的也有808鼓的采样音频。FL Studio怎么让音乐鼓点更有力&#xff1f;让鼓点更有力要从EQ均衡器、压缩…

Pandas学习笔记——第二弹

在用正则表达式对数据进行filtering的时候&#xff0c;出现字符串和整数变量不匹配的问题&#xff0c;例如&#xff1a; 给3加上引号就好了&#xff1a;3 但是为什么10000不需要加引号&#xff0c;而3需要呢&#xff1f;这是因为他们的变量类型不一样的&#xff0c;于是总结一下…

分布式ID的方案和架构

超过并发&#xff0c;超高性能分布式ID生成系统的要求 在复杂的超高并发、分布式系统中&#xff0c;往往需要对大量的数据和消息进行唯一标识如在高并发、分布式的金融、支付、餐饮、酒店、电影等产品的系统中&#xff0c;数据日渐增长&#xff0c;对数据分库分表后需要有一个唯…

常见公开可用的数据集——对算法的鲁棒性和性能进行全面评估

提供了一组公开可用的数据集,这些数据集包含不同的图像变换,允许对算法的鲁棒性和性能进行全面评估。特征匹配实验中使用的数据集汇总信息如表2所示,图14为除YFCC100M外各数据集的样例图像。 Proj:202404 CMC-R.W Citavi (1) VGG [115]: This dataset comprises 40 pairs…

一些 VLP 下游任务的相关探索

目录 一、Image-Text Retrieval (ITR , 图像文本检索) 任务目的&#xff1a; 数据集格式 训练流程 evaluation流程 实际使用推测猜想 二、Visual Question Answering &#xff08;VQA &#xff0c; 视觉问答&#xff09; 任务目的 数据集格式 训练流程 demo以及评估流…

MySQL——链表

主键&#xff1a;非空 唯一&#xff08;针对整列数据而言&#xff09; 为了方便管理一般主键都是设置为自增 外键&#xff1a;一张表中的一列的值是另一张表的主键&#xff0c;使用外键建立两张数据表的数据关系 一、两张表连接 将两张表格拼接成一个表 1、格式&#xff1a;s…

AcWing 796. 子矩阵的和——算法基础课题解

AcWing 796. 子矩阵的和 题目描述 输入一个 n 行 m 列的整数矩阵&#xff0c;再输入 q 个询问&#xff0c;每个询问包含四个整数 x1,y1,x2,y2&#xff0c;表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数 n&…

前后端分离的Java医院云HIS信息管理系统源码(LIS源码+电子病历源码)

HIS系统采用主流成熟技术开发&#xff0c;软件结构简洁、代码规范易阅读&#xff0c;SaaS应用&#xff0c;全浏览器访问前后端分离&#xff0c;多服务协同&#xff0c;服务可拆分&#xff0c;功能易扩展。多医院、多集团统一登录患者主索引建立、主数据管理&#xff0c;统一对外…

ClickHouse--16--普通函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、日期函数1、时间或日期截取函数&#xff08;返回非日期&#xff09;2、时间或日期截取函数&#xff08;返回日期&#xff09;3、日期或时间日期生成函数 二、类…

Arthas实战教程:定位Java应用CPU过高与线程死锁

引言 在Java应用开发中&#xff0c;我们可能会遇到CPU占用过高和线程死锁的问题。本文将介绍如何使用Arthas工具快速定位这些问题。 准备工作 首先&#xff0c;我们创建一个简单的Java应用&#xff0c;模拟CPU过高和线程死锁的情况。在这个示例中&#xff0c;我们将编写一个…

算法刷题day43

目录 引言已知信息一、公约数二、序列的第k个数三、越狱四、等差数列五、公约数六、质因数个数七、完全平方数八、阶乘分解 引言 今天复习的是快速幂的剩余问题、质数、约数的问题&#xff0c;发现其实不难&#xff0c;都是在基础的模板上进行变化&#xff0c;但是不好想&…