《第一行代码》笔记
因为比赛项目要做语音识别的原因,从上个月中旬才正式开始学android,中间又兜兜转转地重
看了java,看了android的教学视频,一头雾水,分不清主次,又自己动手解决做个小app的问题,
从UI到调用包,自己也是仿照着写了一部分,但是还是很不清晰。直到前两天看了《第一行代码》
才有了清晰的认识,打算将自己这两天觉得重要的知识点记录下来,避免忘记。
今天要将《第一行代码》学到UI部分结束,估摸着明天就可以开始打一打工程文件的调用,这部分
我确实是非常地不熟,并且在我之前基础不扎实的时候看得是云里雾里。
今天是520了,笑,( ̄▽ ̄),爱她呀。因为疫情,不能回学校不能去找她,实在是太烦恼了。
祝各位看官有情人终成眷属吧!
在project下看项目文件夹
在project的状态栏目下我们只需要关注app这个文件夹,我们的代码和资源都是在这里面的
1. build
这个目录和外层的build目录类似,主要也是包含了一些在编译时自动生成的文件,不过它
里面的内容会更多更杂,我们不需要过多关心。
2. libs .
如果你的项目中使用到了第三方jar包,就需要把这些jar包都放在libs 目录下,放在这个目
录下的jar包都会被自动添加到构建路径里去。
3. androidTest
此处是用来编写Android Test测试用例的,可以对项目进行一些自动化测试。
4. java
毫无疑问,java 目录是放置我们所有Java代码的地方,展开该目录,你将看到我们刚才创建
的HelloWorldActivity文件就在里面。
5. res
这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的所有图片、布局、字符
串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在drawable目录下,
布局放在layout目录下,字符串(比如strings.xml)放在values目录下,所以你不用担心会把整个
res目录弄得乱糟糟的。
6. AndroidManifest.xml
这是你整个Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里
注册,另外还可以在这个文件中给应用程序添加权限声明。由于这个文件以后会经常用到,我们
用到的时候再做详细说明。
7. test
此处是用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
8. .gitignore
这个文件用于将app 模块内的指定的目录或文件排除在版本控制之外,作用和外层
的.gitignore文件类似。
9. app.iml
IntelliJ IDEA项目自动生成的文件,我们不需要关心或修改这个文件中的内容。
10. build.gradle
这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置,我们稍后将
会详细分析gradle构建脚本中的具体内容。
11. proguard-rules.pro
这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代
码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读。
res目录:
看到这么多的文件夹也不用害怕,其实归纳—下,res目录就变得非常简单了。所有以drawable
开头的文件夹都是用来放图片的,所有以mipmap开头的文件夹都是用来放应用图标的,所有以
values开头的文件夹(string)都是用来放字符串、样式、颜色等配置的,layout 文件夹是用来放
布局文件的。
调用string中的字符串
strings.xml 中找到的 app_name定义的字符串,我们有两种方式可以引用它:
1. 在代码中通过 R.string.app_name 可以获得该字符串的引用;
2. 在 XML 中通过@string/app_name 可以获得该字符串的引用。
基本的语法就是上面这两种方式,其中string部分是可以替换的,如果是引用的图片资源
就可以替换成drawable,如果是引用的应用图标就可以替换成mipmap,如果是引用的布局文件
就可以替换成layout,以此类推。
Mainactivity.java文件的笔记
package com.example.my_last_test; //声明包名为com.example.my_last_test
import android.support.v7.app.AppCompatActivity; //导入父类的包中的类AppCompatActivity
import android.os.Bundle; //导入父类的包
import android.util.Log;
public class LastTestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) //onCreate()方法是一个活动被创建时必定要执行的方法
{
super.onCreate(savedInstanceState);
setContentView(R.layout.last_test_layout); //给当前活动加载一个布局,每一个文件都会在layout中生成一个对应的id
Log.d("LastTestActivity","onCreate execute"); //打印日志出“onCreate execute”
}
}
AndroidMainIfest.xml文件的笔记
//程序的四大组件在这里注册,分别是活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)和内容提供器(Content Provider)
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
//引用string中的app_name
//项目的应用的名称是label属性来定义的,应用图标是icon
<activity android:name=".LastTestActivity" >//表示对 LastTestActivity 这个活动进行注册,没有在 AndroidManifest.xml 里
// 注册的活动是不能使用的
<intent-filter>
<action android:name="android.intent.action.MAIN" /> //LastTestActivity是这个项目的主活动
<category android:name="android.intent.category.LAUNCHER" /> //点击应用图标,首先启动的就是这个活动。LAUNCHER 即 入口
</intent-filter>
</activity>
</application>
</manifest>
buid.gradle(app)的配置问题(重要)
这个版本相关问题曾经搞得我焦头烂额,还是把该记的记下来,毕竟因为环境配置因素而耽误时间,
是一件非常低智而又蹉跎光阴的事情。
apply plugin: 'com.android.application'
//首先第一行“apply plugin: 'com.android.application'”应用了一个插件,一般有两种值可选: com. android . application表示这是一个应用程序模块,
//com. android. library表示这是一个库模块。应用程序模块和库模块的最大区别在于,一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。
android {
compileSdkVersion 25 //SDK_Tools的版本
buildToolsVersion "29.0.3" //build_tools 的版本
defaultConfig {
applicationId "com.example.my_last_test" //项目的包名
minSdkVersion 14
targetSdkVersion 25 //一般跟SDK_Tools的版本相同
versionCode 1 //指定项目的版本号
versionName "1.0" //指定项目的版本名
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// release闭包用于指定生成正式版安装文件的配置,minifyEnabled用于指定是否对项目的代码进行混淆
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//dependencies指定当前项目所有的依赖关系
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) //本地依赖lib下的jar
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.+' //库依赖 版本一般跟SDK_Tools的版本相同
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
testCompile 'junit:junit:4.12'
}
layout.xml文件笔记
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
//如果你需要在XML中引用一个id,就使用@id/id_ name 这种语法,而如果你需要在XML中定义一
//个id,则要使用@+id/id_ name 这种语法。
// match_ parent 表示让当前元素和父元素一样宽。
// wrap_content表示当前元素的高度只要能刚好包含里面的内容就行。
<Button
android:id="@+id/btn_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="本初1号"
/>
</LinearLayout>