3d926d3d60a6945b26893ae7bc9bc7ffd935f50d
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 结构
项目中的一个标准业务模块通常由以下部分组成:
业务页面 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 和 PresenterBaseActivityNoPresenter/BaseFragmentNoPresenter:用于不需要 Presenter 的简单页面
目录结构
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)
快速开始
-
克隆仓库:
git clone https://gitee.com/fengjingqi/kotlin-mvp-project.git -
使用 Android Studio 打开项目根目录。
-
等待 Gradle 同步完成。
-
修改
NetworkConfig.kt中的服务端地址和网络配置。 -
连接设备或启动模拟器,运行
app模块。
也可以在命令行编译:
./gradlew assembleDebug
Windows PowerShell:
.\gradlew.bat assembleDebug
创建一个新的 MVP 模块
建议每个业务模块至少包含 Contract、Presenter、Impl 和页面类。
1. 定义 Contract
interface ExampleContract {
interface View : IView {
fun showContent(content: String)
}
interface Presenter : IPresenter<View> {
fun loadContent()
}
}
2. 编写数据实现
class ExampleImpl {
fun loadContent(): String = "Hello MVP"
}
实际业务中可在这一层调用 Retrofit 接口或本地数据库。
3. 编写 Presenter
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
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 文件。
Description
Languages
Kotlin
87.2%
HTML
10%
Java
2.8%