第 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 的必修课,我们下篇见!


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

相关推荐
千里马学框架15 小时前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台16 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone16 小时前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc17 小时前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo18 小时前
Kotlin 协程中的 Job 结构化并发与取消
android
sun00770019 小时前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼19 小时前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone20 小时前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen20 小时前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone20 小时前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui