恭喜大家都还能活到这节课,从现在开始我们进入Android的学习,前面Java没学会的也不要紧,在以后的学习中就能慢慢理解了,接下来开始起飞。

安装Android Studio

工欲善其事,必先利其器。在学习之前,这里有份史诗级新手装备待你领取,它叫AS

上号
  1. 和IDEA一样,进入ToolBox下载
image-20221119101736382
  1. 打开AS,选择不导入
image-20221119101803136
  1. 不向谷歌发送,下一步

    image-20221119101912276
  2. 先不设置代理,下一步

    有梯子的同学可以设置代理

    image-20221119101956364
  3. 选择标准安装,下一步

    image-20221119102127196
  4. 选择主题,下一步

    image-20221119102231909
  5. 下一步,接受条款,下一步

    image-20221119102422543 image-20221119102456570

  6. 等待下载,然后点击Finish

    等待时间较长,觉得慢用流量开热点,这校园网太垃圾!

    image-20221119102551804

    安装完成,接下来开始你的第一个APP🎉

    注:从AS是纯英文版,汉化插件需要自己去找,不推荐使用汉化,以后的很多文档都是英文的,各位需打好英语基础。

第一个APP

  1. 新建一个项目

    image-20221119102946779
  2. 选择Empty Activity,点击下一步

    其他Activity有很多模板代码,我们也用不到

    image-20221119103033032
  3. 选择Java语言,安卓兼容最低版本为安卓7

    目前市场上大部分安卓版本都在安卓7以上,只有小部分还是安卓5,我们不用去管它

    image-20221119103344941
  4. 等待下载完成

    等待时间较长,觉得慢用流量开热点,这校园网太垃圾!

    image-20221119103421483
  5. 运行第一个App,点击绿色的三角

    Pixel_3a_API_33_x86_64是我们在AS的模拟器

    image-20221119103614211

  6. 等一会就运行成功了🎉

    image-20221119103735259
  7. 刚才那个是在模拟器上运行,实际上,我们一般选择用真机调试,因为模拟器上有一些奇怪的bug,而且轻薄本用模拟器会卡🥀

    手机打开usb调试,以小米手机为例:连续点击MIUI版本7下,开启开发者选项,打开USB调试

    image-20221119094635117

  8. 用数据线连接电脑

    第一次连接会提示你配对,点确定就好了

    然后AS上会显示你的设备

    image-20221119104338869
  9. 点击绿三角运行

    手机上同意通过USB安装应用

    你成功在手机上运行了自己的APP🎉🎉🎉

    img

推荐书籍

在此推荐真正的郭神写的书:《第一行代码》第二版(由于该书时间发行较久,可能不好买到一手。群里有 pdf)

第一行代码:Android(第2版)

别买到蓝色的第三版了

第一行代码(第3版)

第三版全部用的 kotlin,里面虽然也有一些 kotlin 的语法讲解,但你们目前阶段对于 java 掌握不牢固,不适合去学习 kotlin

书中的坑

由于 Android 一年一个版本,所以书中很多教程到现在都已经很旧了,在此提一些坑

support 导包问题

image-20211112220814024

书中在讲一些导包时都会让你们像上图一样导入 suport 包,目前该包已被官方停止维护,且已经迁移至 androidx 的包。

这是目前的androidx包,报黄的原因是可以升级了,鼠标移过去就可以升级

image-20221119105830002

在这里我建议在代码中直接输入要使用的控件的全名,再使用 Alt + Enter,AS 会自动帮你导包,对于 build.gradle 文件不建议你们修改

例如:导入 RecyclerView 可以直接在代码中写,在选择后 AS 会自动帮你导包

image-20221119105931335

但仍存在部分控件或者依赖 AS 也不知道的情况,这时就需要你们自己谷歌找最新的依赖包了

XML简单介绍

  1. 什么是XML

    XML (eXtensible Markup Language)指可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。

  2. XML的用途
    xml被用于信息的记录和传递,因此xml经常被用于充当配置文件。

    在Android中,res文件下和manifest使用的是xml语言

  3. XML 仅仅是纯文本
    XML 没什么特别的,它仅仅是纯文本而已,所以res下的文件需要受到java下的代码调用。

  4. XML的格式

    XML 文档第一行以 XML 声明开始,用来表述文档的一些信息

    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="UTF-8"?>
    <site>
    <name>Redrock</name>
    <url>https://redrock.team</url>
    <logo>redrock.png</logo>
    <desc>红岩网校工作站</desc>
    </site>

    分别为标签,标签内包含了要传递的信息。

    • 标签必须成对出现,有开始标签就需要有结束标签,例如:开始标签:**** 和 结束标签:****

    • 标签是有层级的,必须正确的嵌套;

    • 标签区分大小写;

    • xml属性值必须加引号,例

      1
      2
      3
      <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />

Android 项目结构

Android 与之前 Java 的一个项目相比复杂了许多,下面我们先简单认识一下。

结构视图有ProjectAndroid两种,Project就是以文件夹的形式展示,Android是编译后更方便的一种展示。

image-20221125133525559

谷歌爸爸为了使我们的应用更好开发,把代码与视图进行了分层,主要的结构视图如下:(在 Android 视图下):

  1. java下面写我们的逻辑代码,就和以前我们在src里写的一样
  2. res是写布局代码,包括一些图片,布局,主题,颜色等等。
  3. gradle是项目构建,目前我们不用管
image-20221125134544001

manifests

用来放 AndroidManifests.xml 简称“注册文件”

image-20221125135603943

注:但由于Android12的问题,目前需要在启动的 activity 的标签新加一句android:exported=”true”,它的作用是:是否支持其它应用调用当前组件

java

你的所有用于控制视图的代码都在这里

第一个包就是你的源代码 java 文件,后面两个包是有关测试的,不用去了解,之后的个人开发也不会用到他们,网校开发也没有用到

res

用于放视图和资源文件

drawable

用于放图片资源以及 xml 类型的图片

layout

用于放应用中每个界面的地方

mipmap

这里只用来放应用的桌面图标的(注:这里一般不是用来放应用内部图片或者图标的,该文件夹一般不用)

values

用于放一些引用的文字或者颜色等杂东西

认识HelloWorld

相信各位都想自己开始动手改写 HelloWorld,但一打开 java 代码却傻了眼,这都是些什么鬼?

image-20221125175114949

java 代码讲解

你一看MainActivity继承于 AppCompatActivity,然后点进去一看,666 行的英文,什么也看不懂。

其实不用管这么多,就跟你们开始学习 java 一样,只要记住之前的 main() 是整个程序的入口,在 Android 中这个入口“变成了” onCreated() (其实入口并不是它)以后代码就 “全” 写在 onCreated() 中就可以了(别真的把代码全写在一个函数中了!)

关键语句 setContentView()

细心的你肯定能发现除了 super.onCreate() 外,他还自己多写了一个 setContentView(R.layout.activity_main)

setContentView 字面意思就是:设置内容视图

前面我们讲过 Android 将 视图代码 进行了分离,而这就话就是将视图与代码进行判定,其中 R.layout 是一种固定写法,用于引用 layout 文件夹中的文件(tips: 同理,R.drawable 表示引用 drawable 文件夹中的图片)

layout 中的 XML

点击 activity_main 后肯定更懵逼了,这又是写的什么?(555,我还是退学吧!)

image-20221126093148550

目前可以死记住需要这样写即可

但我还是给大家简单梳理下:

其中 2 ~ 8 行是一体的(严格来说还包括第19行),描绘了一个在 androidx.constraintlayout.widget 下一个叫 ConstraintLayout 的控件的行为(何为控件?后面会讲)

同理,这个是一个名字叫 TextView 的控件

image-20221126093456054

其中第 13 行有一个 “Hello World!”,我们把他改成 “Hello RedRock!”,再打包运行一下,你就会发现应用的字变成了 “Hello Redrock!”

简单的认识了HelloWorld后,我们接下来进行更细致的讲解

视图的基本单位——控件

控件中分为单一的,用于与用户交互的控件 (View) 和 负责布局的控件 (ViewGroup)

View

常用的 View

TextView

一个用于显示文本的控件

自身属性 作用
android:text 设置显示的文字
android:textSize 设置字体大小
android:textStyle 设置字体样式(只有加粗和斜体)
android:fontFamily 设置文字的字体
app:drawableStartCompat 设置文字左边的图片(类似的可以把 Start 换成 Top、Bottom、End)

如果要设置一个图片在 TextView 旁边,尽量使用 app:drawableStartCompat 属性,而不是写一个 ImageView 在旁边

Button

一个与用户进行交互的按钮(注意:并不是只有 Button 可以点击,所有的 View 都可以设置点击监听)

自身属性 作用
所有 TestView 的属性 因为 Button 是直接继承于 TestView 的,所以拥有所有 TestView 的属性

EditText

一个与用户进行交互的输入控件

自身属性 作用
所有 TestView 的属性 因为 EditText 也是直接继承于 TestView 的,所有拥有所有 TestView 的属性
android:hint 设置提示文字
android:textColorHint 设置提示文字颜色
android:inputType 设置输入的类型
android:digits 设置值接受指定的文本内容
android:lines 设置显示行数
android:maxLines 设置最大显示行数

(简单提一句:其实后面几个属性也不是 EditText 独有的)

ImageView

一个显示图片的控件

属性 作用
android:src 设置(前景)图片
android:scaleType 设置当图片与控件大小不一致时缩放模式

如何添加图片:

  1. 普通图片

    直接将图片放到res/drawable目录下即可

  2. 矢量图

    推荐一个矢量图网站:阿里巴巴矢量图标库,里面有很多好看的图标,而且是免费的。

    1. 先下载SVG图片,保存到你自己能找到的地方

      image-20221126102300504
    2. 在res文件夹下新建一个Vector Asset

      image-20221126102514490
    3. 选择加载本地资源,找到你的图片

      image-20221126102819483 image-20221126102903559
    4. 调整一些参数

      image-20221126103016756
    5. 完成

      image-20221126103122892

补充书没有的内容

scaleType

推荐博客:scaleType 的使用

一般使用 centeInside 模式,当 size 大于 ImageView 的图片进行等比例缩小,小于 ImageView 的图片不变,直接居中显示。(当不写该属性时,默认是 fitCenter 意思是当 size 大于 ImageView 的图片进行等比例缩小,小于 ImageView 的图片进行等比例放大,直接居中显示)

ShapeableImageView

如果想实现圆头像或者其他样式的头像,可以试试这个控件

推荐博客:ShapeableImageView 的使用

常用属性

android:layout_margin 与 padding

初学者往往会搞不懂这两个的含义

其中 layout_margin 是以父布局为参考系,设置外部边距

**padding **是以自身为参考系设置设置内部子 View 或者文本等边距

android:background

设置背景(与 ImageViewandroid:src 不同,src 是设置前景,可以选择缩放模式,而 background 是设置背景,是直接强行拉伸或者压缩图片)

Material组件库

Material Design 是由Google开发设计,扩展于Google即时的“卡片”设计,材质设计基于网格的布局、响应动画与过渡、填充、深度效果(如光线和阴影)。

Material官网

Github地址

强烈建议你们下载下来,里面有很多好看的控件,直接拿来用。

ViewGroup

ViewGroup 被翻译成容器,他的作用就是用来装 TextViewButton 这些控件的

基础 ViewGroup

以下简单讲解你们现阶段会用到的 ViewGroup,由于《第一行代码》中有关于这些的演示和讲解,所以这次课我更多的是进行实践操作

LinearLayout

页数:《第一行代码》P94页

该布局在入门阶段最常用

自身属性 作用
android:orientation 设置排列方向
子控件属性 作用
android:layout_gravity 设置子控件在父控件中的位置
android:layout_weight 设置子控件在父控件中的比重

子控件属性?父布局可以额外添加子控件的属性的,其中有个明显的特点就是,属性都以 layout_ 开头.

RelativeLayout

页数:《第一行代码》P100页

该布局不常使用,跳过

FramLayout

页数:《第一行代码》P103页

该布局在入门阶段一般不用,跳过(一般在自定义 View 中用的多,通过继承它来实现自己的控件)

CardView

页数:《第一行代码》P431页

该布局后期很常用,这里做一些补充

自身属性 作用
app:cardCornerRadius 设置圆角
app:elevation 设置阴影厚度(也指 Z 轴高度)
app:cardBackgroundColor 设置背景颜色(注意:该控件使用 android:background 来改变背景颜色是无效的,需要换成左边这个属性)
app:cardPreventCornerOverlap 显示完整阴影(如果你的阴影厚度较厚,你会发现你的阴影只显示了部分,使用该属性可以将阴影显示完整)
app:contentPadding 设置内容的 poadding(间距),除此之外还有app:contentPaddingLeft/Right/Top/Botom

用于复杂布局时的 ConstraintLayout

该布局为最常用布局,而且现在AS默认的布局就是ConstraintLayout布局,只需要简单的一拖一拉,就能实现比 LinearLayoutRelativeLayout 更强大的效果。

这里直接推荐看博客内容:约束布局

也许你们觉得写这些好麻烦,其实,这些多用即便就记住了,还有就是我们可以直接使用 XML 中的 Design 窗口用鼠标来拖动,具体的使用会在课上演示

常用属性

android:gravity

部分 ViewGroup 拥有该属性,用于设置子控件的重心

控件这么多的属性我该怎么记?

其实你根本不用记住,直接照书抄就是了,后面你想找某个属性,推荐先去 Android 官网(点我进官网,就是你下 AS 的地方)找找,再去百度看他的用法,只要你用得多了,自然而然就记住这些属性了

其他

命名规范

id 命名规范

具体可参考群里的《阿里巴巴Android开发手册》

image-20211121223709087

image-20211121223738508

除此之外,还有如下命名规范:

【模块名】_【控件】_【界面位置】_【作用】

模块名:目前你们还设计不到模块相关,可以不用写

控件名:常见的控件可采用首字母缩写的形式,自定义控件和不常用的建议全写

界面位置:简单的描述是哪个界面,如下图的 stamp_detail 表示邮票详细界面(可以加上 activity、fragment、item 等字眼用于表示控件所在的容器)

作用:如果当前界面相同控件过多,强烈建议加上作用

大致以上面这样来写 id,这样更利于快速查找,也会让之后的学弟不会对你的代码留下什么印象 : )

image-20211121230412932

image-20211121225852596

image-20211121230459816

控件对象命名规范

image-20211121232148928

虽然是 kt 写得,但各位应该能看懂

【控件缩写】+【作用】

这里提一句,为什么以 m 开头,因为 Android 官方推荐类中的成员变量以 m 开头,你几乎可以在 Android 官方源码中都能发现这种写法,建议遵守官方规范

现搓一个登录界面

光听这些估计很无聊,接下来我将现搓一个登陆界面,写登录界面是这次作业中的 Lv2,各位可以用心听一下

布局代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
><?xml version="1.0" encoding="utf-8"?>
><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<ImageView
android:id="@+id/img_main_head"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="128dp"
android:src="@drawable/cqupt"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/et_main_username"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginTop="64dp"
android:drawableStart="@drawable/ic_baseline_account_box_24"
android:hint="账号"
android:inputType="number"
android:lines="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/img_main_head" />

<EditText
android:id="@+id/et_main_password"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:digits="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?!=+-_.,"
android:drawableStart="@drawable/ic_baseline_vpn_key_24"
android:hint="密码"
android:inputType="textPassword"
android:lines="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/et_main_username" />

<Button
android:id="@+id/btn_main_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="64dp"
android:text="登录"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/et_main_password" />

></androidx.constraintlayout.widget.ConstraintLayout>

Activity代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
>public class LoginActivity extends AppCompatActivity {

private ImageView mImgHead;
private EditText mEtUsername;
private EditText mEtPassword;
private Button mBtnLogin;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
initLogin();
}

/**
* 写一个方法专门用于初始化 View
*/
private void initView() {
mImgHead = findViewById(R.id.img_main_head);
mEtUsername = findViewById(R.id.et_main_username);
mEtPassword = findViewById(R.id.et_main_password);
mBtnLogin = findViewById(R.id.btn_main_login);
}

/**
* 专门用于登录的方法
*/
private void initLogin() {
mBtnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
login();
}
});
}

/**
* 执行登录操作
*/
private void login() {
String username = mEtUsername.getText().toString();
String password = mEtPassword.getText().toString();
if (username.equals("123456") && password.equals("123456")) {
loginSuccess(username, password);
} else {
loginFailure();
}
}

/**
* 登录成功的方法
*/
private void loginSuccess(String username, String password) {
Toast.makeText(this, "登陆成功!", Toast.LENGTH_SHORT).show();
MainActivity2.startActivity(this, username, password);
}

/**
* 登录失败的方法
*/
private void loginFailure() {
Toast.makeText(this, "账号或者密码好像输错了 :(", Toast.LENGTH_SHORT).show();
}

private long mExitTime = 0L;

/**
* 以下为连按两次才能退出
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
/*
* 当当前时间大于上次按返回键的时间 2 秒时
*/
if (System.currentTimeMillis() - mExitTime > 2000) {
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
mExitTime = System.currentTimeMillis();
return false;
}
}
return super.onKeyDown(keyCode, event);
}
}

再写一个 Activity

这就写完了?这也太简单了吧,简直有手就行。接下来我们给这个界面加上登录后的跳转

image-20221126125722859

intent 跳转

页数:《第一行代码》P41 ~ P43

只需要使用显示 Intent 就可以了,就两行代码

1
2
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

对于 Intent 的正确写法(以下为扩展内容,听不懂没事)

如果我们要传入一些数据给 ContentActivity 时,一般我们会在 MainActivity 直接这样写

1
2
3
4
Intent intent = new Intent(this, ContentActivity.class);
intent.putExtra("username", username);
intent.putExtra("password", password);
startActivity(intent);

这样写确实很方便,也没有什么问题

在之后的开发中,我们更推荐将启动事件交给要启动的类来处理,这样可以实现类与类之间的解耦合

应该在 MainActivity2 中写一个 static 的方法用于启动自己,让它来决定你该传入什么数据才能启动它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>public class MainActivity2 extends AppCompatActivity {
private static final String INTENT_USER_NAME = "username"; // intent 中的数据标记
private static final String INTENT_PASSWORD = "password"; // intent 中的数据标记

/**
* 写一个 static 方法,让它来决定该传入那些数据
*/
public static void startActivity(Context context, String username, String password) {
Intent intent = new Intent(context, MainActivity2.class);
intent.putExtra(INTENT_USER_NAME, username);
intent.putExtra(INTENT_PASSWORD, password);
context.startActivity(intent);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent intent = getIntent();
String mUserName = intent.getStringExtra(INTENT_USER_NAME);
String mPassword = intent.getStringExtra(INTENT_PASSWORD);
}
}

那么在 LoginActivity中可以直接一行代码启动 MainActivity2

1
MainActivity2.startActivity(this, username, password);

这样的写法在写大项目时是必须遵守的,写在这里只是为了让你们提前知道有这个规范

补充启动界面

注册文件改默认启动

页数:《第一行代码》P35 最底部

1
2
3
4
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

上面这一行代码就是设置启动 Activity

只需要把它改到你想设置的 Activity 里,在Android12中,默认启动activity必需要设置android:exported="true"

Activity 的 finish() 方法

页数:《第一行代码》P40 最底部

调用该方法会直接销毁当前 Activity,并移出 Activity 栈(Activity 栈的概念可以看书 P53)

扩展内容

Activity

是什么?

相信在写了上面懵懵懂懂的代码后,你也对 Activity 有了一个初步的认识。

如果说 XML 布局是应用的外表,那么 Activity 就是应用的内核,用于控制 XML(外表) 实时变化,达到与用户交流的目的

其中一个 Activity 掌管了一个对应的 XML 布局,XML 布局中的控件,都可以使用 findViewById() 这个方法转换成对应的一个对象,然后 Activity 就可以直接调用这些对象自带的方法用于设置一些属性

Activity 启动模式

页数:《第一行代码》P63

这东西平时不会经常用到,使用也很简单,你们下去看一下书就能理解了。主要用于使用返回键退出当前 Activity 或者 Activity 互相启动时会用到

Fragment

页数:《第一行代码》P142

Fragment 可以理解为一个小型的 Activity,它也可以向 Activity 一样,与 XML 视图进行一对一绑定,但它必须寄生于一个 Activity 中,不能独立存在

不讲内容

该部分内容对于你们目前阶段难以理解,故写在这里,现在只作了解即可,之后会再来详细讲解

Activity 生命周期

页数:《第一行代码》P53页

下学期会进行更深入的讲解,再加上目前你们涉及不到这个,所以就不写这个了

Fragment 生命周期

页数:《第一行代码》P151

与 Activity 生命周期类似,这节课也不会讲解该内容

FragmentManger

页数:《第一行代码》P147

Activity 中 Fragment 的管理者

补充问题

设置字体大小

AS默认的字体有点小,我们设置一下

窗口字号设置

File - Settings - Appearance 注意:这个只能设置除代码外的字体大小,也就是窗口字体大小image-20221116112521570

代码字体设置

File - Settings - Editor - Font 这里才是设置代码字体大小的地方image-20221116112439942

Ctrl + 滑轮 设置代码字号

File - Settings - Editor - General 开启 Ctrl + 滑轮设置字体大小很有用image-20221116112338817

快捷键设置

相信在写 java 中直接输 sout 而感到十分方便,其实这些都是可以自己去设置的

下面给出一个可以快捷打出 Log.d 的快捷键的设置方式

  • 打开设置
image-20221116113950566
  • 基本设置

    image-20221116150943141
    1
    2
    3
    android.util.Log.d("TAG","($class$:$line$)-->>");
    // TAG: 换成你自己想设置的 tag(用于过滤 Log,快速找到)
    // $class$、$line$: 固定写法
  • 设置属性

    image-20221116151038364
  • 设置语言

    image-20221116114614850
    • OK,接下来你可以在代码中直接输入 “ld” 然后回车,实现 sout 一样的效果

      image-20211113001706516

    经过了这个教程后,相信你也可以设置其他快捷键了.

推荐插件

装上一些插件可以很大部分上提高我们工作效率,在这里分享给大家几个插件

插件在这里下载:

image-20221116151510111
  • Translation

    image-20221126104258509

    一个很好用的翻译插件,对于英文注释来说可以直接翻译成中文

    使用方式:选中英文后直接 Ctrl + Shift + Y,也可以直接翻译文档

    image-20221116152353988

    image-20221116152618145

    注:谷歌翻译停止中国访问,该服务需要梯子,或者使用替他翻译引擎。

    如果挂了梯子还显示这个就需要设置代理image-20221116233947671

    这里可以替换其他搜索引擎image-20221116152554999

  • Rainbow Brackets

    image-20211113003325793

    括号总是白色,太难找到对应?试试这款插件,让你代码中的括号充满色彩!

如何打包

当手机装上了你自己的App,你也想分享给其他小伙伴一起使用,可是当你发现通过qq发送给别人的时候,他们安装不了,因为我们手机是通过AS直接装的,不是正式的apk。

  1. 打开Build -> Generate Signed Bundle / APK…

    image-20221116153122050
  2. 选择apk,点击next

    image-20221116153207864
  3. 创建签名文件

    生成 apk 需要签名文件,这个签名文件主要是用于检测当前 apk 是否已经被修改。比如你通过反编译修改了我的 apk,那么签名文件就会被破坏,其他人就可以通过签名文件来判断是否被修改

image-20221116153244714 image-20221116153928145 image-20221116154003036
  1. 选择relsase包

    image-20221116154730227
  2. 查看apk

    image-20221116154321753
image-20221116154604549

AS彻底卸载

时间长了AS会出现一些奇怪的问题,我们就需要彻底卸载AS了

  1. 在设置里卸载AS

  2. 打开下面这个路径,删除所有与 AS 有关的即可

    C:\Users\WhiteNight\AppData\Roaming\Google

    image-20221116175135744

    注1:图中的 “WhiteNight” 是电脑的用户名,打开你自己的用户目录

    注2:其中 “AppData” 为隐藏文件夹,自己打开显示隐藏文件夹即可找到

  3. 如果你想弃坑 Android 了 ,就可以把 gradle 删了🥀

image-20221116175509160

更改gradle路径

AS下载的gradle路径是在C盘的(如上图),到了后期gradle文件会越来越大,C盘会爆满,我们将它移到其他盘

1.打开“系统高级设置”,选择“环境变量

image-20221116232547400
  1. 找到GRADLE_USER_HOME
image-20221116232720376
  1. 选择你想存放的地方
image-20221116232815357
  1. 确定保存

梯子的问题

github和goole需要梯子,搞计算机的,梯子是必不可少的,你们可以自己去找梯子,也可以私下找我们。

设置代理

如果你有梯子的话可以给AS设置代理,这样可以在AS里访问外网(例如谷歌翻译)

打开设置,找到HTTP Proxy,选择手动代理设置,方式选择HTTP,地址默认就是127.0.0.1,端口号可以到Windows的设置->网络和Internet->代理->手动代理设置->编辑,点击编辑就能看到端口号了

image-20221116233651876 image-20221126103732094 image-20221126103803685

总结

本节课我们主要学习了Android Studio的使用,掌握了一些常用控件和布局,对Activity也有了一些认识。

在经历了这半学期的学习后,相信你们从网校这里学习到了很多,还记得开始入群时有500多人,到现在只有少数人在活跃,希望在接下来的路,你们能坚持走完,最后回头来看你会感谢如今的自己。