NipGeihou's blog NipGeihou's blog
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
  • 常用软件
  • Git仓库推荐
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
  • 常用软件
  • Git仓库推荐
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档
  • nodejs

  • css

  • 最佳实践

  • TypeScript

  • ajax

  • JavaScript

  • 前端工程化

  • React

  • nextjs

  • Flutter

  • Vue

  • Taro

  • ReactNative

  • Android

    • 入门
      • 目录视图
        • Project
        • Android
      • 真机调试
        • ADB
        • scrcpy 投屏工具
      • 页面和布局
        • 页面Activity
        • 生命周期
        • 新建
        • 设置启动页
        • XML布局
      • AndroidManifest.xml
        • 修改名称和图标
      • 字符串引用
      • R类(静态资源类)
      • 布局与组件(样式) - Jetpack Compose
      • 布局与组件(样式) - XML
        • 布局
        • 线性布局 LinearLayout
        • 相对布局 RelativeLayout
        • 帧布局 FrameLayout
        • 组件
        • 通用属性
        • 尺寸单位
        • 文本组件 TextView
        • 按钮组件 Button
        • 点击事件
        • 样式
        • 其他按钮组件
        • 输入框 TextInput
        • 提示消息 Toast
        • 图片组件 ImageView
  • 笔记

  • 前端
  • Android
NipGeihou
2026-08-20
目录

入门

# 目录视图

image.png image.png
  • 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:是否设为启动页面

# 设置启动页

方法一: 在 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 image.png

# 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 第一启动页

# 修改名称和图标

  • 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 的值,即为当前主题的继承关系
# 其他按钮组件
  • 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()

扩展

  • 第三方库:GrenderG/Toasty: The usual Toast, but with steroids 💪 (opens new window)

# 图片组件 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
React Native - 开始
组件库

← React Native - 开始 组件库→

最近更新
01
3D打印 - 滑盖设计
09-02
02
Kotlin - 入门
08-12
03
React Native - 开始
08-12
更多文章>
Theme by Vdoing | Copyright © 2018-2026 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式