first commit

This commit is contained in:
fengjignqi
2026-09-17 08:53:44 +08:00
commit ea41ddbe74

237
README.md Normal file
View File

@@ -0,0 +1,237 @@
# Kotlin MVP Project
一个使用 Kotlin 编写的 Android MVP 基础模板,提供可直接复用的 MVP 分层、网络请求、ViewBinding、动态权限、通用弹窗及常见页面组件。
该项目适合用于:
- 快速创建采用 MVP 架构的 Android 项目
- 学习 Presenter、View、Model 之间的职责划分
- 作为业务项目的基础工程继续扩展
- 查看 RecyclerView、ConstraintLayout、日期选择器等组件示例
## 项目特点
- 使用 Kotlin 开发,保留少量 Java Adapter 示例
- 使用 MVP 分离界面、业务逻辑和数据访问
- 使用 ViewBinding 访问布局控件
- 封装 Activity、Fragment 和 Presenter 基类
- Retrofit + OkHttp + Gson 网络请求基础封装
- Token 保存及统一网络配置
- 动态权限申请与永久拒绝处理
- 通用 Loading、确认和输入弹窗
- 支持日期、时间及日期时间选择
- 包含 RecyclerView 和 ConstraintLayout 示例页面
- 使用 Version Catalog 集中管理依赖版本
## 技术栈
| 技术 | 用途 |
| --- | --- |
| Kotlin | 主要开发语言 |
| MVP | 页面架构与职责分离 |
| ViewBinding | 类型安全地访问 View |
| AndroidX / Material Components | Android 基础组件与 UI |
| ConstraintLayout | 复杂页面布局 |
| ViewPager2 | 首页分页 |
| Retrofit / OkHttp | 网络请求 |
| Gson | JSON 转换 |
| RecyclerView / BaseRecyclerViewAdapterHelper | 列表展示 |
| ImmersionBar | 状态栏和导航栏适配 |
| Luban | 图片压缩 |
## MVP 结构
项目中的一个标准业务模块通常由以下部分组成:
```text
业务页面 Activity / Fragment
│ 实现 View 接口
▼
Contract(定义 View 与 Presenter 能力)
│
▼
Presenter(业务调度和结果处理)
│
▼
Impl / Model(网络请求或数据访问)
```
各层职责:
- **View**:展示数据、处理用户操作,不直接编写数据访问逻辑。
- **Presenter**:接收 View 事件,调用 Model,并将结果交回 View。
- **Model / Impl**:负责接口请求、本地数据或其他数据来源。
- **Contract**:集中定义各层之间的接口,明确模块边界。
基础接口位于 `app/src/main/java/com/example/kotmvpproject/base`:
- `IView`:Loading、消息和错误展示等通用 View 能力
- `IPresenter`:绑定 View 和生命周期方法
- `BasePresenter`:持有并释放 View,降低内存泄漏风险
- `BaseActivity` / `BaseFragment`:集成 ViewBinding 和 Presenter
- `BaseActivityNoPresenter` / `BaseFragmentNoPresenter`:用于不需要 Presenter 的简单页面
## 目录结构
```text
KotMvpProject/
├── app/src/main/java/com/example/kotmvpproject/
│ ├── base/ # MVP、Activity、Fragment 基类
│ ├── network/ # Retrofit、OkHttp、接口和 Token 管理
│ ├── login/ # 登录模块 MVP 示例
│ ├── main/ # 主页面及 Fragment 模块
│ ├── mine/ # 个人中心及组件入口
│ ├── component/ # 可复用业务组件
│ ├── dialog/ # 通用弹窗
│ ├── demo/ # RecyclerView、ConstraintLayout 示例
│ ├── util/ # 通用工具
│ └── utils/ # 应用升级等工具
├── app/src/main/res/ # 布局、图片、颜色和字符串资源
├── gradle/libs.versions.toml # 依赖版本管理
└── app/build.gradle # Android 模块配置
```
## 环境要求
- Android Studio(建议使用当前稳定版本)
- JDK 17
- Android SDK 36
- 最低支持 Android 7.0(API 24)
## 快速开始
1. 克隆仓库:
```bash
git clone https://gitee.com/fengjingqi/kotlin-mvp-project.git
```
2. 使用 Android Studio 打开项目根目录。
3. 等待 Gradle 同步完成。
4. 修改 `NetworkConfig.kt` 中的服务端地址和网络配置。
5. 连接设备或启动模拟器,运行 `app` 模块。
也可以在命令行编译:
```bash
./gradlew assembleDebug
```
Windows PowerShell:
```powershell
.\gradlew.bat assembleDebug
```
## 创建一个新的 MVP 模块
建议每个业务模块至少包含 `Contract`、`Presenter`、`Impl` 和页面类。
### 1. 定义 Contract
```kotlin
interface ExampleContract {
interface View : IView {
fun showContent(content: String)
}
interface Presenter : IPresenter<View> {
fun loadContent()
}
}
```
### 2. 编写数据实现
```kotlin
class ExampleImpl {
fun loadContent(): String = "Hello MVP"
}
```
实际业务中可在这一层调用 Retrofit 接口或本地数据库。
### 3. 编写 Presenter
```kotlin
class ExamplePresenter(
private val model: ExampleImpl
) : BasePresenter<ExampleContract.View>(), ExampleContract.Presenter {
override fun loadContent() {
view?.showLoading()
val content = model.loadContent()
view?.hideLoading()
view?.showContent(content)
}
}
```
### 4. 页面绑定 Presenter
```kotlin
class ExampleActivity :
BaseActivity<ActivityExampleBinding, ExamplePresenter>(),
ExampleContract.View {
override fun createBinding(inflater: LayoutInflater) =
ActivityExampleBinding.inflate(inflater)
override fun createPresenter() = ExamplePresenter(ExampleImpl())
override fun initView(savedInstanceState: Bundle?) {
binding.loadButton.setOnClickListener {
presenter?.loadContent()
}
}
override fun showContent(content: String) {
binding.contentTextView.text = content
}
override fun showError(message: String) {
showMessage(message)
}
}
```
最后在 `AndroidManifest.xml` 注册 Activity,并创建对应布局即可。
## 已有示例
- **登录模块**:完整的 Activity MVP 结构和 Token 保存流程
- **首页模块**:ViewPager2、底部导航及多个 Fragment MVP 模块
- **个人中心**:网络数据加载、权限、弹窗、选择器和组件入口
- **RecyclerView 示例**:列表、Item 点击和子控件点击
- **ConstraintLayout 示例**:Guideline、Barrier、Group、Chain、宽高比及基线约束
- **应用升级**:版本检查、APK 下载和安装处理
运行应用后,可从“我的”页面进入个人中心,再打开各个组件示例。
## 网络配置
网络相关代码位于 `network` 目录。接入实际服务端时重点检查:
- `NetworkConfig.kt`:Base URL、超时时间等配置
- `ApiService.kt`:Retrofit 接口定义
- `ApiClient.kt`:Retrofit 客户端
- `NetworkManager.kt`:请求调用与结果处理
- `TokenManager.kt`:登录 Token 的保存和读取
生产项目中不要将密码、私钥、正式环境 Token 等敏感数据提交到仓库。
## 后续扩展建议
- 使用 Kotlin Coroutines 替换或补充当前异步请求方案
- 引入依赖注入,统一创建 Presenter、Repository 和网络对象
- 增加 Repository 层,隔离远程数据与本地数据
- 为 Presenter 和数据层补充单元测试
- 将通用 UI、网络和工具代码拆分为独立 Library Module
- 增加多环境配置及签名配置管理
## License
当前仓库暂未声明开源许可证。如需公开复用或分发,建议根据实际用途补充 LICENSE 文件。