入门
# 目录视图
![]() | ![]() |
|---|
Project:跟真实目录层级一样Android:按类型分类,在 Android 开发中主流的视图方式。
# Project
- app:
- build:编译制品目录
- src:源码目录
- androidTest:测试用例
- main:核心源代码
- java:存放 kotlin、java 代码
- res:资源文件、布局文件
- drawable:图片
- layout:布局文件目录
- values:字符串、颜色、主题等配置
- mipmap:应用图标文件
- AndroidManifest.xml:应用配置文件
- build.gradle:模块级别的构建配置
- gradle:构建工具目录
- build.gradle:项目级别的构建配置、
- setting.gradle:项目设置文件,类似
POM.xml
# Android
kotlin+java:即 kotlin、java 代码文件
# 真机调试
- USB 调试
- WIFI 调试(Android11+)
# ADB
ADB,全称 Android Debug Bridge。
scoop install main/adb
常用命令
adb install {apk文件路径}
# scrcpy 投屏工具
scoop install main/scrcpy
# 连接设备
scrcpy
# 页面和布局
在传统 Android 开发中,一个页面通常由两部分组成:
- 逻辑代码:即页面的逻辑功能,数据、交互等,一般使用 Java 或 kotlin 代码编写
- 布局代码:通常使用 xml 布局
逻辑代码
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
// 设置当前页面的布局,类似于要加载哪个HTML文件
// R 是自动生成的资源类,指向res/,类似于前端的@
// 指向res/layout/activity_main(.xml)
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
}
布局代码
<?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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
# 页面 Activity
Android 中页面称为 Activity ,Activity 类必须继承 AppCompatActivity :
- 对 Material Design 设计规范的支持
- 向后兼容旧版 Android 系统
- 集成 ActionBar
# 生命周期
- onCreate:当 Activity 第一次被创建时调用,代码中必须执行
super.onCreate(savedInstanceState)
# 新建
- 在对应包名下,如:kotlin+java/
com.example.myapplication - 右键 - 新建 - Activity - Empty Views Activity
- name:以
Avtivity结尾 - Generate a Layout File:是否生成布局文件
- Lanuche Activity:是否设为启动页面
- name:以
# 设置启动页
方法一: 在 AndroidManifest.xml 对应的 Activity 添加
<activity
...
android:exported="true"
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
方法二:(多用于调试)
在启动时选择指定 Activity

# XML 布局
存放位置: /res/layout
# AndroidManifest.xml
向 Android 系统声明应用的 身份信息 、 组件清单 ,可理解为备案文件。
- 声明应用包含哪些组件(Activity、Service、Receiver、Provide)
- 申请运行所需权限(如网络访问、相机使用),以前的版本在这里申请了就可以用,但新版使用敏感权限时需要用户动态授权。
- 指定应用图标、名称、版本号
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
<activity
android:name=".MainActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
跟微信小程序类似,每个页面 (activity) 都需要注册
uses-permission:权限声明,标签需要在application上方- 参考:
<uses-permission android:name="android.permission.INTERNET" />
- 参考:
application- android:icon:图标
- android:label:名称
- android:theme:主题
- 子标签
activity:application 下- android:name:类名
- 子标签
intent-filter:意图过滤器- 作用:告诉系统哪些 intent 可以触发当前 activity,
<action android:name="android.intent.action.MAIN" />+<category android:name="android.intent.category.LAUNCHER" />表示为 app 第一启动页
- 作用:告诉系统哪些 intent 可以触发当前 activity,
# 修改名称和图标
- app - res 右键
- 新建 - Image Asset
Foreground Layer:选择要导入的 logo 图片,并按需调整大小Background Layer:Asset Type=Color,填充背景颜色- 完成
- 修改
AndroidManifest.xml的android:icon、android:roundIcon(但更改新建的时候默认的 name 是ic_launcher,因此一般是不需要修改的)
# 字符串引用
todo
# R 类(静态资源类)
| 资源类型 | 对应 R 类成员 | 示例 | 对应目录 |
|---|---|---|---|
| 布局类型 | R.layout | setContentView(R.layout.activity_main) | |
| 字符串 | R.string | R.string.app_name | res/values/strings.xml |
| 图片 / 图标 | R.drawable | R.drawable.ic_launcher_background | res/drawable/ |
| 颜色值 | R.color | R.color.white | res/values/colors.xml |
# 布局与组件 (样式) - Jetpack Compose
- 简单说就是用 kotlin 替代 XML 来编写布局和组件。
- XML 的数据交互类似于 HTML+jQuery,Jetpack Compose 则类似于 Vue
- 创建项目时选择
Empty Activity
# 布局与组件 (样式) - XML
# 布局
# 线性布局 LinearLayout
LinearLayout 理解成一个功能较弱的 flex 容器
| Flex / RN | LinearLayout |
|---|---|
display: flex | LinearLayout 本身 |
flexDirection: 'row' | android:orientation="horizontal" |
flexDirection: 'column' | android:orientation="vertical" |
alignItems: 'center' | android:gravity="center_vertical" (row 时) |
justifyContent: 'center' | android:gravity="center_horizontal" (row 时) |
flex: 1 | layout_width="0dp" + layout_weight="1" |
width: '100%' | layout_width="match_parent" |
width: auto | layout_width="wrap_content" |
padding: 16 | android:padding="16dp" |
margin: 16 | android:layout_margin="16dp" |
gap: 8 | 通常给子元素 layout_margin ,或用其他布局 |
space-between | 通常需要 Space + weight |
space-around/evenly | 用多个 Space + weight 模拟 |
权重
占满剩余宽 / 高
flex: 1 = layout_width="0dp" + layout_weight="1"
对齐方式
间隔 layout_margin
# 相对布局 RelativeLayout
可相对父组件或兄弟组件
# 帧布局 FrameLayout
帧布局下的每一个组件相当于一个图层,越下面的层级越高
# 组件
# 通用属性
| 属性 | 说明 |
|---|---|
| 宽度 | |
| 高度 | |
| 背景 | |
| 外边距 | |
| 内边距 | |
| id | 以 @+id/ 开头,布局文件内唯一 |
# 尺寸单位
现在原生 Android 开发里,主流仍然是:
- 布局尺寸 / 间距:
dp - 文字大小:
sp - 图片、Canvas 绘制、底层像素计算:必要时才用
px
# 文本组件 TextView
布局中定义:
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
逻辑代码: 类似于原生 js 写法
val tv1 = findViewById<TextView>(R.id.tv1)
tv1.text = "MainActivity2"
优化:使用 ViewBinding
ViewBinding 可以理解成:Android 官方帮你把 XML 里的 id 自动生成成类型安全的 View 引用,不用再写 findViewById() 。
开启:在 app/build.gradle.kts 添加
android {
...
buildFeatures {
viewBinding = true
}
}
之后,XML 会自动生成 Binding 类:`
activity_main.xml
↓
ActivityMainBinding
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
...
binding = ActivityMainBinding.inflate(layoutInflater)
// setContentView(R.layout.activity_main)
setContentView(binding.root)
binding.tv1.text = "MainActivity"
}
# 按钮组件 Button
# 点击事件
- 方法一:通过 XML 的
android:onClick属性
<Button
...
android:onClick="goToMainActivity2" />
之后按提示一键在对应的 Activity 中生成对应方法。
class MainActivity : AppCompatActivity() {
...
fun goToMainActivity2(view: View) {
Toast.makeText(this, "Going to MainActivity2", Toast.LENGTH_SHORT).show()
}
}
- 方式二:使用
setOnClickListener监听器(推荐)
override fun onCreate(savedInstanceState: Bundle?) {
...
binding = ActivityMainBinding.inflate(layoutInflater)
binding.btn2.setOnClickListener {
Toast.makeText(this, "Button 2 clicked", Toast.LENGTH_SHORT).show()
}
}
- 方法三:让
Activity或Fragment实现OnClickListener
class MainActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
...
binding = ActivityMainBinding.inflate(layoutInflater)
binding.btn3.setOnClickListener(this)
binding.btn4.setOnClickListener(this)
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.btn3 -> Toast.makeText(this, "Button 3 clicked", Toast.LENGTH_SHORT).show()
R.id.btn4 -> Toast.makeText(this, "Button 4 clicked", Toast.LENGTH_SHORT).show()
}
}
}
- 实现
View.OnClickListener接口 - 注册
setOnClickListener(this) - 触发
onClick
# 样式
- 在 XML 的标签属性中设置
app:xxxxx。样式属于 app 命名空间,为 Material Design 库中的属性(需要引入,一般默认引入) - app 的主题需要继承
Theme.MaterialComponents:- app 的主题配置在 AndroidManifest.xml 的
android:theme - Ctrl + 点击可跳转到对应的主题文件:如
android/app/src/main/res/values/styles.xml - 一直跳转
parent的值,即为当前主题的继承关系
- app 的主题配置在 AndroidManifest.xml 的
# 其他按钮组件
- Button:默认
- AppCompatButton:默认增强
- MaterialButton:Material 主题按钮
# 输入框 TextInput
原生组件
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入内容" />
material 库组件
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入内容">
>
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>
扩展
- 密码类型
# 提示消息 Toast
Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show()
扩展
# 图片组件 ImageView
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher_foreground"
android:contentDescription="Image Button" />
上次更新: 2026/09/03, 18:15:39

