2026-09-24 17:23:47 +08:00
2026-09-22 09:28:21 +08:00
2026-09-24 17:23:47 +08:00
2026-09-17 08:59:24 +08:00
2026-09-22 09:28:37 +08:00
2026-09-17 08:59:24 +08:00
2026-09-17 08:59:24 +08:00
2026-09-17 08:59:24 +08:00
2026-09-20 09:18:26 +08:00
2026-09-17 08:59:24 +08:00
2026-09-17 08:59:24 +08:00
2026-09-17 08:53:44 +08:00
2026-09-17 08:59:24 +08:00

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 和 Presenter
  • BaseActivityNoPresenter / 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)

快速开始

  1. 克隆仓库:

    git clone https://gitee.com/fengjingqi/kotlin-mvp-project.git
    
  2. 使用 Android Studio 打开项目根目录。

  3. 等待 Gradle 同步完成。

  4. 修改 NetworkConfig.kt 中的服务端地址和网络配置。

  5. 连接设备或启动模拟器,运行 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
No description provided
Readme 1.4 MiB
Languages
Kotlin 87.2%
HTML 10%
Java 2.8%