第 3 篇|Android 项目结构解析与第一个界面 —— Hello, CSDN!

第 3 篇|Android 项目结构解析与第一个界面 ------ Hello, CSDN!

拆解 Android 项目核心文件,搭建第一个可运行界面,搞定环境与布局基础


哈喽,各位零基础想入门 Android 开发的小伙伴们~ 关于Android Studio全面指南可以看

  1. 彻底搞懂 Android 项目的目录结构,知道每个文件是干嘛的

  2. 理解 Android 中最核心的概念之一 ------ Context

  3. 手把手搭建你的第一个 Android 界面,并让按钮响应点击事件

全程保姆级讲解,附带新手必踩的坑点清单,跟着做就能把 App 跑起来。废话不多说,直接开始!


一、Android Studio 安装避坑(补充版):SDK、HAXM、模拟器

虽然前面已经讲过 AS 的安装,但很多新手在后续配置中还是会踩坑。这里重点补充 3 个核心避坑点,直接决定你的项目能否正常运行、模拟器是否流畅。

1. SDK 路径配置避坑(重中之重)

SDK(Software Development Kit)是 Android 开发的核心工具包,包含了编译、调试、运行 App 所需的所有资源。路径配置错误会导致项目无法编译。

✅ 正确操作:

  1. 打开 AS,进入 File → Settings → Appearance & Behavior → System Settings → Android SDK(Mac 系统为 Android Studio → Settings → 同上)
  2. SDK Platforms 选项卡:勾选推荐版本(新手选 API 33 或 34,兼容性好),点击 Apply 下载
  3. SDK Tools 选项卡:勾选 Android SDK Build-Tools、Android Emulator、Android SDK Platform-Tools、Intel x86 Emulator Accelerator (HAXM installer)(Intel CPU 必装)
  4. 重点检查 SDK 路径:确保路径是纯英文、无空格、无中文(例如 D:\Android\SDK)

❌ 常见坑点:

  • 路径含中文或空格(如 C:\Users\张三\AppData...)→ 编译时会出现莫名其妙的错误
  • SDK 下载失败或速度慢 → 配置国内镜像源(百度「Android SDK 国内镜像」获取地址)
  • 随意删除 SDK 文件夹内的文件 → 可能导致工具缺失,只能重新下载

2. HAXM 加速安装避坑(模拟器流畅关键)

HAXM(Intel Hardware Accelerated Execution Manager)是 Intel 的硬件加速工具,能让模拟器运行速度提升 10 倍以上。没有它,模拟器会卡到怀疑人生。

✅ 正确操作:

  • 在 SDK Tools 中勾选 Intel x86 Emulator Accelerator (HAXM installer) 并下载安装
  • 安装完成后重启电脑
  • 进入 BIOS(开机按 F2/F10/Del,视主板而定),找到 Intel Virtualization Technology(VT-x),设置为 Enabled

❌ 常见坑点:

  • 提示「未开启 VT-x」→ 进 BIOS 开启虚拟化技术

-- 提示「与其他虚拟化软件冲突」→ 关闭 VMware、VirtualBox 等软件后重装

  • AMD 处理器用户 → 无需安装 HAXM,改选 Android Emulator Hypervisor Driver for AMD Processors

3. 模拟器创建避坑(避免黑屏、启动失败)

模拟器是调试 App 的核心工具,创建不当容易出现「启动失败」「黑屏」「卡死」等问题。

✅ 正确操作:

  1. 点击 AS 顶部工具栏的 Device Manager(手机小图标)→ Create device
  2. 选择设备型号:新手推荐 Pixel 5 或 Pixel 6(尺寸适中,兼容性好)
  3. 选择系统镜像:勾选 x86_64 架构,选择与 SDK 对应的版本(如 API 33),点击 Download 下载镜像
  4. 模拟器配置:默认即可,可修改名称方便识别
  5. 启动模拟器:选中后点击 Launch,首次启动需 1-2 分钟,耐心等待

❌ 常见坑点:

  • 启动后黑屏 → 检查 HAXM/Hyper-V 是否安装成功;若不行,删除模拟器重新创建
  • 模拟器卡顿 → 关闭后台程序,或编辑模拟器设置将 Memory 调整为 2GB
  • 模拟器占用 C 盘空间 → 可在 SDK 设置中修改 AVD 存储路径至其他盘

二、Android 项目核心目录解析:3 个核心,看懂就能上手

创建一个新的 Empty Views Activity 项目后,AS 会生成一堆文件和文件夹。很多新手看到直接懵了,别慌,我们只讲最核心的 3 个文件/目录,搞懂它们就够你入门了。

项目目录一览(Project 视图)

text 复制代码
MyApplication/
├── app/                                    # 主模块,99% 的代码都在这里
│   ├── src/
│   │   ├── main/
│   │   │   ├── java/com/example/...        # Kotlin/Java 源代码
│   │   │   │   └── MainActivity.kt         # 主界面逻辑
│   │   │   ├── res/                        # 资源文件夹(重点!)
│   │   │   │   ├── layout/                 # 界面布局 XML
│   │   │   │   │   └── activity_main.xml   # 主界面布局
│   │   │   │   ├── drawable/               # 图片、形状等
│   │   │   │   ├── values/                 # 颜色、字符串、尺寸
│   │   │   │   └── mipmap/                 # 应用图标
│   │   │   └── AndroidManifest.xml         # 应用清单文件(重点!)
│   └── build.gradle.kts                    # 模块级构建配置
├── build.gradle.kts                        # 项目级构建配置
└── settings.gradle.kts                     # 项目设置

1. AndroidManifest.xml ------ 应用的「身份证」

这个文件是整个 App 的全局配置文件,系统通过它识别应用的核心信息。所有界面(Activity)、权限、服务都必须在此声明。

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hellocsdn"> <!-- 应用包名,唯一标识 -->

    <!-- 权限声明示例 -->
    <!-- <uses-permission android:name="android.permission.INTERNET" /> -->

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"      <!-- 桌面图标 -->
        android:label="@string/app_name"        <!-- 应用名称 -->
        android:theme="@style/Theme.HelloCSDN"> <!-- 全局主题 -->

        <!-- 声明主界面 Activity -->
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <!-- 意图过滤器:标识这是启动界面 -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

关键点解读:

  • package 属性:应用唯一包名,发布后不可更改
  • intent-filter 中的 MAIN + LAUNCHER:表示这是 App 的入口界面,点击桌面图标打开的就是它
  • 需要网络、相机等权限时,在 manifest 内添加 uses-permission 标签

2. res/layout ------ 界面布局的「骨架」

res 目录存放所有非代码资源,layout 子目录专门放界面布局 XML 文件。每个布局文件对应一个界面,相当于界面的「骨架」。

  • 默认生成 activity_main.xml,是 MainActivity 的布局文件
  • 命名规范:小写字母 + 下划线(如 activity_main.xml、item_user.xml)
  • 打开后可切换三种视图:
    • Design:可视化拖拽,所见即所得
    • Code:纯 XML 代码编辑
    • Split:左右分屏,同时查看拖拽和代码(新手推荐)

3. build.gradle.kts ------ 项目的「编译配置」

Android 项目中有两个 build.gradle.kts 文件,新手重点关注 模块级 的(位于 app/ 目录下)。它控制当前模块的编译配置,直接决定项目能否正常运行。

kotlin 复制代码
// app/build.gradle.kts
android {
    namespace = "com.example.hellocsdn"
    compileSdk = 34                      // 编译使用的 SDK 版本

    defaultConfig {
        applicationId = "com.example.hellocsdn"
        minSdk = 24                      // 最低支持 Android 7.0
        targetSdk = 34                   // 目标 SDK 版本
        versionCode = 1
        versionName = "1.0"
    }
}

dependencies {
    // 项目依赖,相当于引入外部工具包
    implementation("androidx.core:core-ktx:1.12.0")
    implementation("androidx.appcompat:appcompat:1.6.1")
    // ... 其他依赖
}

关键注意点:

  • compileSdk、minSdk、targetSdk 需匹配,新手保持默认即可
  • 修改 build.gradle.kts 后,必须点击顶部的「Sync Now」同步配置,否则修改不生效
  • 需要引入第三方库时(如 Glide、Retrofit),在 dependencies 中添加语句并 Sync

三、Context 通俗理解 ------ Android 的「环境句柄」

Context 是 Android 开发中最基础、也最容易被新手忽略的概念。很多新手写代码时遇到「Context 找不到」「Context 用错」的问题,其实用通俗的方式理解,一点都不难。

Context 就是 Android 应用的「环境句柄」,相当于应用的「万能钥匙」或「场景说明书」。

生活例子:你去餐厅吃饭,Context 就相当于餐厅的 「前台」。你需要通过前台才能拿到菜单(获取资源)、叫服务员(调用系统服务)、结账(执行操作)。同样,在代码中,我们需要通过 Context 才能完成各种操作。

Context 的核心作用(新手常用)

作用 代码示例
获取资源 getString(R.string.app_name)
启动新界面 startActivity(Intent(this, SecondActivity::class.java))
弹出 Toast Toast.makeText(this, "提示", Toast.LENGTH_SHORT).show()
获取系统服务 getSystemService(Context.LAYOUT_INFLATER_SERVICE)

新手必记:2 种常用 Context

类型 获取方式 生命周期 使用场景
Activity Context this(在 Activity 内部) 与 Activity 一致 启动页面、弹 Toast、操作 UI
Application Context applicationContext 与整个 App 一致 数据库初始化、网络请求等全局操作

⚠️ 注意:不要在 Activity 已销毁后还持有它的 Context,否则会造成内存泄漏。工具类中需要使用 Context 时,优先传入 Application Context。


四、第一个界面:ConstraintLayout 拖拽 + 代码混合开发

ConstraintLayout(约束布局)是 AS 默认的布局方式,也是目前最常用、最灵活的布局。新手可以先用拖拽快速搭建,再通过代码精细化调整。

1. 认识 ConstraintLayout 的核心概念

ConstraintLayout 的核心思想是:每个控件的位置由它与其他控件(或父容器)的约束关系决定。

  • 每个控件四周有 4 个「约束锚点」(小圆圈)

  • 把锚点拖到父容器边缘或其他控件边缘,就建立了约束关系

  • 至少需要 水平和垂直各一个约束,控件的位置才能确定

2. 拖拽搭建「Hello, CSDN!」界面

打开 activity_main.xml,切换到 Design 视图:

  1. 从左侧 Palette 面板找到 TextView,拖到预览界面中央
  2. 选中 TextView,在右侧 Attributes 面板修改属性:
    • text:输入 Hello, CSDN!
    • textSize:输入 24sp
    • textColor:选择红色或输入 #FF0000
  3. 添加约束:拖动 TextView 四周的约束点,分别连接到父布局的 上、下、左、右 边缘(约束线变蓝色即成功)

3. 查看并理解生成的 XML 代码

切换到 Code 视图,你会看到以下代码:

xml 复制代码
<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello, CSDN!"
        android:textColor="#FF0000"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

代码解读:

属性 含义 常用取值
layout_width / layout_height 控件的宽/高 match_parent(撑满父容器)、wrap_content(包裹内容)、固定值如 100dp
text 显示的文本 任意字符串
textSize 文字大小 单位用 sp(可随系统字体缩放)
textColor 文字颜色 十六进制颜色值如 #FF0000
app:layout_constraintXXX 约束属性 定义控件与其他控件或父容器的对齐关系

4. 运行验证

点击 AS 顶部工具栏的绿色三角 Run 按钮,选择你创建的模拟器,等待编译安装。几秒钟后,模拟器上会显示你的 App,中间写着红色的 Hello, CSDN!。

🎉 恭喜!你的第一个 Android 界面成功运行了!


五、新手必踩坑点清单(收藏备用)

新手开发时,90% 的报错都源于以下两个坑,提前记住,避免走弯路!

坑点 ①:运行报错 INSTALL_FAILED_OLDER_SDK

错误信息:

text 复制代码
Installation failed with message INSTALL_FAILED_OLDER_SDK

原因:模拟器的 Android 版本低于 App 要求的 minSdk。

解决方法(二选一):

  1. 修改 app/build.gradle.kts 中的 minSdk,调低到模拟器支持的版本(不推荐,会失去新特性)

  2. 推荐:创建一个 API Level ≥ minSdk 的新模拟器

坑点 ②:修改 XML 后运行无变化

现象:改了 activity_main.xml 里的文字,重新运行,模拟器上还是老样子。

常见原因及解决

原因 解决方法
文件未保存 Ctrl + S(Windows)/ Command + S(Mac)保存
R 文件未同步 点击顶部 Sync Now(大象图标)同步项目
缓存问题 Build → Clean Project,再 Build → Rebuild Project
XML 语法错误 检查标签是否闭合、属性是否写错,修复后重新同步
改错了布局文件 确认修改的是当前 Activity 使用的布局文件

六、综合小案例:个人名片界面

让我们把今天学到的知识综合起来,做一个漂亮的个人名片界面。

需求说明

  • 顶部放置一个圆形头像(ImageView)

  • 头像下方显示姓名(TextView)

  • 姓名下方显示个人简介(TextView)

  • 底部放置一个「关注」按钮(Button)

  • 点击按钮弹出 Toast 提示:「感谢关注!」

步骤 1:准备图片资源

  1. 将头像图片(jpg/png)复制到 app/src/main/res/drawable 目录,命名为 avatar.png(小写字母+下划线)

  2. 若没有图片,可右键 res → New → Image Asset,选择一张图片或使用系统图标

步骤 2:编写布局 XML

打开 activity_main.xml,切换到 Code 视图,输入以下代码:

xml 复制代码
<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="24dp"
    android:background="#F5F5F5">

    <!-- 头像 -->
    <ImageView
        android:id="@+id/iv_avatar"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:src="@drawable/avatar"
        android:scaleType="centerCrop"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginTop="48dp" />

    <!-- 姓名 -->
    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Android 开发之道"
        android:textSize="28sp"
        android:textStyle="bold"
        android:textColor="#333333"
        android:layout_marginTop="24dp"
        app:layout_constraintTop_toBottomOf="@id/iv_avatar"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <!-- 简介 -->
    <TextView
        android:id="@+id/tv_bio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="分享 Android 干货,陪你从小白到高手"
        android:textSize="16sp"
        android:textColor="#666666"
        android:layout_marginTop="12dp"
        app:layout_constraintTop_toBottomOf="@id/tv_name"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <!-- 分隔线 -->
    <View
        android:id="@+id/divider"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#DDDDDD"
        android:layout_marginTop="32dp"
        app:layout_constraintTop_toBottomOf="@id/tv_bio" />

    <!-- 详细信息 -->
    <TextView
        android:id="@+id/tv_detail1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="📧 公众号:Android 开发之道"
        android:textSize="14sp"
        android:textColor="#555555"
        android:layout_marginTop="20dp"
        app:layout_constraintTop_toBottomOf="@id/divider"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/tv_detail2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="📍 坐标:北京"
        android:textSize="14sp"
        android:textColor="#555555"
        android:layout_marginTop="12dp"
        app:layout_constraintTop_toBottomOf="@id/tv_detail1"
        app:layout_constraintStart_toStartOf="parent" />

    <!-- 关注按钮 -->
    <Button
        android:id="@+id/btn_follow"
        android:layout_width="0dp"
        android:layout_height="56dp"
        android:text="关 注"
        android:textSize="18sp"
        android:textColor="#FFFFFF"
        android:backgroundTint="#018786"
        android:layout_marginTop="48dp"
        android:layout_marginBottom="32dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

步骤 3:编写 Kotlin 逻辑代码

打开 MainActivity.kt,修改为以下代码:

kotlin 复制代码
package com.example.hellocsdn

import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 关联布局文件
        setContentView(R.layout.activity_main)
        
        // 通过 ID 找到按钮控件
        val btnFollow = findViewById<Button>(R.id.btn_follow)
        
        // 设置点击监听器
        btnFollow.setOnClickListener {
            // 弹出 Toast 提示
            Toast.makeText(this, "感谢关注!", Toast.LENGTH_SHORT).show()
        }
    }
}

代码解读:

  • setContentView(R.layout.activity_main):将布局文件与当前 Activity 关联

  • findViewById(R.id.btn_follow):通过 ID 获取布局中的按钮控件

  • setOnClickListener { ... }:Lambda 风格的点击事件,代码更简洁

  • Toast.makeText(this, ...).show():弹出短暂提示

步骤 4:运行效果

点击 Run,等待编译完成。你会看到一个精美的个人名片界面:

  • 顶部居中显示圆形头像
  • 姓名「Android 开发之道」醒目突出
  • 底部绿色「关注」按钮
  • 点击按钮后,屏幕底部弹出「感谢关注!」提示,2 秒后自动消失

七、总结与下篇预告

今天的内容信息量不小,我们一起来回顾核心收获:

  • ✅ 环境避坑:SDK 路径纯英文无空格、HAXM 加速要装、模拟器创建选对镜像

  • ✅ 项目目录:AndroidManifest.xml 是身份证、res/layout 放界面、build.gradle 管编译

  • ✅ Context 通俗理解:它就是访问系统资源的「通行证」,Activity 本身就是 Context

  • ✅ ConstraintLayout 基础:通过约束关系定位控件,可拖拽也可手写代码

  • ✅ 综合实战:完成了个人名片界面,掌握 ImageView、TextView、Button 的用法,以及点击事件和 Toast

从下一篇开始,我们将深入 Android 的核心组件,首先就是 Activity 的生命周期与页面跳转。理解生命周期是写出稳定、不崩溃 App 的必修课,我们下篇见!


✨ 如果本文对你有帮助,欢迎点赞收藏,让更多零基础的小伙伴少走弯路!

相关推荐
众少成多积小致巨5 小时前
Soong构建入门
android·go·编译器
笔夏5 小时前
【安卓学习之混淆】记录一些混淆导致闪退
android·学习
阿巴斯甜5 小时前
Kotlin高阶函数和Java 8 lambda的区别:
android
张小潇5 小时前
AOSP15 WMS/AMS系统开发 - WindowManagerService relayout调用流程详解
android
阿巴斯甜5 小时前
Kotlin 高阶函数:
android
之歆5 小时前
Day03_HTML 列表、表格、表单完整指南(下)
android·javascript·html
QING6186 小时前
Kotlin之【init】—— 新手须知
android·kotlin·android jetpack
阿巴斯甜6 小时前
MMKV 和DataStore 的区别:
android
阿巴斯甜6 小时前
MVVM和MVI的区别:
android