# 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 { fun loadContent() } } ``` ### 2. 编写数据实现 ```kotlin class ExampleImpl { fun loadContent(): String = "Hello MVP" } ``` 实际业务中可在这一层调用 Retrofit 接口或本地数据库。 ### 3. 编写 Presenter ```kotlin class ExamplePresenter( private val model: ExampleImpl ) : BasePresenter(), ExampleContract.Presenter { override fun loadContent() { view?.showLoading() val content = model.loadContent() view?.hideLoading() view?.showContent(content) } } ``` ### 4. 页面绑定 Presenter ```kotlin class ExampleActivity : BaseActivity(), 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 文件。