我写的第一行代码
今天学习成果
了解了安卓的项目目录和基本的结构
Android项目结构(先略过,暂时还没讲解到)
主要了解的是Project项目结构
1 .gradle和.idea
里面都是系统生成的一些文件暂时还不需要了解
2 app目录这个目录非常重要里面包括以下内容
(留到后面详细讲解)
3 build
目录包含了编译时自动生成的文件
4 gradle
包含了gradle wrapper 的配置文件
5 .gitignore文件
用来将指定的目录或者文件排除再版本控制之外(暂未学习)
6 build.gradle
项目全局的gradle构建脚本(后面讲解里面的具体内容)
7 gradle.properties
全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本
8 gradlew和gradlew.bat
这两个文件是用来在命令行界面执行gradle命令的,其中gradlew是在Linux或Mac系统
中使用的,gradlew.bat是在Windows系统中使用的
9 Hello World Application.iml
iml 文件是所有 Intellij IDEA项目都会自动生成的一个文件,用于标识这是个
Intellij IDEA 项目
10 local.properties
这个文件用于指定本机中的Android SDK 路径,通常内容都是自动生成的,不需要修改
假如本机中的Android SDK 位置发生了改变,那么将这个文件的路径改成新的位置即可
11setting.gradle
这个文件用于指定项目中的所有引入的模块
--------------------------------------外层目录介绍完毕-----------------------------------------
下面进行app目录的详细讲解
app目录包括以下内容
1 build
目录包含了编译时自动生成的文件和外层的build目录类似
2 libs
假如你的项目中使用到了第三方的jar包,就需要把这些都放到libs目录下,
放到这个目录下的jar包都会被自动加载到构建路径里去.
3 android Test
用来编写Andorid Test测试用例的,可以对项目进行一些自动化测试
4 java
毫无疑问,java目录就是我们放置我们所有的Java代码的地方
5 res
这个目录内容有点多,简单说就是为你的资源文件分类
展开如下
图片放 drawable目录下
布局放 layout目录下
字符串放 values目录下
图标放 mipmap目录下
6 AndroidManifest.xml
这个是整个Android项目的配置文件,你在程序中定义的四大组件都需要在这个文件里注册,
另外还可以在这文件中给应用程序添加权限声明(后期再详细讲解--暂未学习)
7 test
用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式
8 .gitinore
用于将app模块内的指定目录或文件排除再版本的控制之外,作用和外层的.gitinore文件类似
9 app.iml
IntelliJ IDEA 项目自动生成的文件
10 build.gradle
这个是app模块的gradle构建脚本,这个文件会指定很多项目构建相关的配置(后面详细讲解)
11 proguard-rules.pro
这个文件用于指定项目代码的混淆规则,当代码打包成安装包文件,如果不希望被别人破解,通常会将代码进行混淆,从而让破解者难以阅读
----------------------------------项目结构了解完毕-----------------------------------------
探究Hello World 到底是怎么运行起来的吧
首先打开AndroidManifest.xml这个文件找到以下代码
1 //这一段代码表示对MainActivity这个活动进行注册 2 <activity android:name=".MainActivity" >
3 <intent-filter> 4 <action android:name="android.intent.action.MAIN" />//这个项目的主活动 5 <category android:name="android.intent.category.LAUNCHER" />//这个项目的主活动 6 </intent-filter> 7 </activity>
那么 MainActivity 具体作用,打开 MainActivity 代码如下
1 //Activity系统提供的活动基类,AppCompatActivity是Activity的子类
2 class MainActivity : AppCompatActivity() { 3 override fun onCreate(savedInstanceState: Bundle?) { 4 super.onCreate(savedInstanceState)//活动创建是必须要执行的方法 5 setContentView(R.layout.activity_main)//引入一个布局定义在res/layout目录下 6 } 7 }
Hello World 在哪里呢?
Android讲究逻辑和视图分离,可以看到
在onCreate()方法的第二行(第5行)调用了setContentView()方法,就是这个方法给当前的活动引入了一个 R.layout.activity_main 布局,那么Hello World 就这这个里面啦
布局文件是在res/layout 目录下(或者选中[activity_main]再Ctrl+鼠标左键,直接跳转到并打开这个文件),找到名叫activity_main.xml的,切换视图到Text视图就能看到了
如图所示
代码如下
1 <?xml version="1.0" encoding="utf-8"?> 2 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:background="#00C42D2D" 8 tools:context=".MainActivity"> 9 10 <TextView 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:background="#00FF0000" 14 android:text="Hello World" 15 app:layout_constraintBottom_toBottomOf="parent" 16 app:layout_constraintLeft_toLeftOf="parent" 17 app:layout_constraintRight_toRightOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20 </androidx.constraintlayout.widget.ConstraintLayout> 21 <!--通过android:text 来定义要显示的文字-->
只需要自知道TextView这个控件,能够在布局中显示文字就行了
-----------------现在就清楚了Hello World 是怎么显示在页面上的啦---------------------
前面已经介绍过res目录下每个文件夹的含义,打开res/values/string.xml 文件 代码如下所示
1 <resources> 2 <string name="app_name">Hello World</string> 3 </resources> 4 <!--定义了一个个应用程序名的字符串 5 在代码中R.string.hello_world_application可以获得该字符串的引用 6 在XML中通过@string/hello_world_application可以获得该字符串的引用 7 其中string部分可以替换, 8 如果引用的是图片资源就可以替换成drawable 9 如果引用的是图标就可以替换成mipmap 10 引用的是布局则改成layout,以此类推 11 -->
举个例子,打开AndroidManifest.xml 文件,如下所示
1 <application 2 android:allowBackup="true" 3 android:icon="@mipmap/ic_launcher" 4 android:label="@string/app_name" 5 android:roundIcon="@mipmap/ic_logo" 6 android:supportsRtl="true" 7 android:theme="@style/AppTheme" > 8 ...... 9 </application> 10 <!--android:icon="@mipmap/ic_launcher" 指定图标 11 android:label="@string/app_name" 指定应用程序名称 12 -->
可以看到,这个是XML中引用资源的语法
我已经对程序的程序名和图标都做了更改啦,你也去试一试吧!
详细讲解build.gradle文件
最外层,代码如下所示
1 buildscript { 2 ext.kotlin_version = '1.3.50' 3 repositories {//repositories闭包 4 google() 5 jcenter()//代码托管仓库 6 7 } 8 dependencies { 9 classpath 'com.android.tools.build:gradle:3.5.2'//声明了个Gradle插件gradle:3.5.2 版本号 10 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 // NOTE: Do not place your application dependencies here; they belong 12 // in the individual module build.gradle files 13 } 14 } 15 16 allprojects { 17 repositories { 18 google() 19 jcenter() 20 21 } 22 } 23 24 task clean(type: Delete) { 25 delete rootProject.buildDir 26 }
第二个就是app目录下的啦,代码如下(有点复杂)
1 apply plugin: 'com.android.application'//应用了一个插件,表示应用程序模块(可直接运行), 2 // com.android.library表示库模块(只能作为代码库,依附别的应用程序模块来运行) 3 4 apply plugin: 'kotlin-android' 5 6 apply plugin: 'kotlin-android-extensions' 7 8 //安卓闭包 9 android { 10 compileSdkVersion 30 //用于指定项目的编译版本SDK 11 buildToolsVersion "30.0.2"//指定项目构建工具的版本 12 //嵌套了一个defaultConfig闭包 13 defaultConfig { 14 applicationId "com.ChenXianZi" //指定项目的包名 15 minSdkVersion 15 //最低兼容的Android系统版本 16 targetSdkVersion 30 17 versionCode 1 //指定项目的版本号 18 versionName "1.0" //指定项目的版本名 19 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 20 } 21 //buildTypes闭包 22 buildTypes { 23 release { 24 minifyEnabled false //是否对项目代码进行混淆 false是不混淆 true是混淆 25 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 26 //proguard-android-optimize.txt是在AndroidSDK目录下的里面是所有项目的通用的混淆规则 27 //proguard-rules.pro 是在当前项目的根目录下,里面可以编写当前项目特有的混淆规则 28 } 29 } 30 } 31 //dependencies闭包 32 dependencies { 33 //依赖包括本地依赖,库依赖,远程依赖 34 implementation fileTree(dir: 'libs', include: ['*.jar'])//本地依赖的声明 35 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 36 implementation 'androidx.appcompat:appcompat:1.0.2' 37 implementation 'androidx.core:core-ktx:1.0.2' 38 implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 39 testImplementation 'junit:junit:4.12'//声明测试用例库,暂时用不到 40 androidTestImplementation 'androidx.test.ext:junit:1.1.0' 41 androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' 42 }
这里面没有库依赖:
它的基本格式是compile project 后面加要依赖的库名即可
例如:库名叫test,那么添加库的依赖关系只需要加入compile project(':test')这句声明即可
----------------------------------------使用Android的日志工具---------------------------------
Android 中的日志工具类是Log(android.util.Log)
五个方法,如下所示
Log.v()
用于打印那些最为琐碎的、意义最小的日志信息.对应级别verbose,
是Android日志里面级别最低的一种.
Log.d()
用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的.
对应级别debug,比verbose高一级。
Log.i()
用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以帮你分析用户行为数据。
对应级别info,比debug高一级。
Log.w()
用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修
复一下这些出现警告的地方。对应级别warn, 比info高一级。
Log.e()
用于打印程序中的错误信息,比如程序进入到了catch 语句当中。当有错误信息打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。
对应级别error,比warn高一级。
使用实例,代码如下:
1 class MainActivity : AppCompatActivity() { 2 3 override fun onCreate(savedInstanceState: Bundle?) { 4 super.onCreate(savedInstanceState)//活动创建是必须要执行的方法 5 setContentView(R.layout.activity_main)//引入一个布局定义在res/layout目录下 6 Log.d("MainActivity","这是我写的第一行代码!") 7 //第一个参数是tag一般是当前类名,第二参数是msg想打印的具体内容 8 //不建议使用System.out.println();来输出日志信息 9 //快捷键logd再按下tab键 10 } 11 }
运行的快捷键是Shift+F10(Mac系统是control+R)
其中能看到的信息有打印日志的内容和tag名,程序的包名,打印的时间以及程序的进程号都可以看到
最后经过以上的学习,写出了我的第一行的代码
对明天的学习满怀期待!今天就写道这吧,继续加油!