今天先创建第一个app,跟的课程是google推荐的Developing Android Apps with Kotlin https://classroom.udacity.com/courses/ud9012
由于上面这个课程都是视频,所以也跟着google的kotlin android training get started补充理论知识
1. Explore Android Studio
上一篇文章已经讲过了gradle在项目中的结构,除了gradle外,其它的代码文件的分布也和java的项目类似,主要说一下其它文件夹。
res/layout
android的布局文件夹,每一个Activity对应一个xml布局文件,在布局文件里面可以看到Activity的页面UI显示。
AndroidManifest.xml
一直以为是mainfest,结果是manifest(清单),列举了android系统运行app所需要的清单(Activity列表和权限)。
2. Anatomy(剖析) of Basic Android Project
下面就开始进行第一个app的开发,app叫dice roller(投色子),创建一个空项目后打开运行可以看到Hello World,就证明整个环境是通的。下面看代码。
MainActivity
首先看到的类是MainActivity,MainActivity就是Hello world这个页面的Activity。而页面的layout就是res/layout下的activity_main.xml,layout命名规则名称后置。对于Activity和layout中的xml的理解,和前端的html和js的关系类似,js处理交互逻辑,html显示页面UI,这里就是Activity处理交互逻辑,xml文件显示页面UI。
|
|
可以看到MainActicity继承自AppCompatActivity,AppCompatAcitvity是Activity的一个子类,兼容性和新特性都很好。
onCreate()
|
|
Activity不用构造器去初始化对象,而是用生命周期函数,onCreate()就是一个生命周期函数,它是Activity生命周期中的开始。
setContentView()用来绑定当前Activity和layout的xml文件。R.layout.activity_main,这里绑定的layout xml文件使用了R class,R class包含了app在res下所有的静态资源,R.layout就相当于res下的layout文件夹。
activity_main.xml
下面来看一下layout的xml文件,前面已经解释过了xml文件的作用,下面就看一下代码
|
|
-
顶级的标签是
是android中比较常用的布局,顾名思义,线性布局,在水平或者垂直方向上一个接一个排列。点进去可以看到 LinearLayout 继承自 ViewGroup,可以包含其它多个views并且指定view的在屏幕上的定位。 -
作用是展示text,*android:text=“Hello World!"*是展示的text。
layout xml文件和activity联动
按照教程上所说,添加一个button,具体按照教程走,主要是添加完button后,为 添加一个id android:id=”@+id/roll_button",就相当于为当前的控件添加一个唯一的id,然后我们在Activity中通过R class获取到该控件进行相关的操作。rollButton.setOnClickListener { rollDice() }点击事件的监听方法,当触发点击时间后,进行相关的操作。
|
|
通过点击button,我们可以改变之前的 *
如果我们把
|
|
至此,就完成了第一个投色子的app,下面就是在项目过程中遇到问题。
3. 创建第一个项目中遇到的问题
- Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Manager
构建工具的版本冲突,使用sdk管理工具删除重新安装。可以尝试删除重新安装tools,或者直接在Project Structure -> Moudules选择个低版本的,我使用的是第二种方法。
- Apps targeting Android 12 and higher are required to specify an explicit value for android:exported
android12以上的app需要去指定一个属性android:exported,如果使用了intent过滤器,则必须要显示声明该属性。
|
|
- Failed to calculate the value of task ‘:app:mergeLibDexDebug’ property ’numberOfBuckets’ > Expected minSdkVersion >= 21 but found 1
这个是创建模拟器的问题,生成新的模拟器后无此问题。