first commit
This commit is contained in:
237
README.md
Normal file
237
README.md
Normal 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 文件。
|
||||
Reference in New Issue
Block a user