From ea41ddbe742c7f180e2087a35f8ad9ec5e34c50b Mon Sep 17 00:00:00 2001 From: fengjignqi <15192412330@163.com> Date: Thu, 17 Sep 2026 08:53:44 +0800 Subject: [PATCH] first commit --- README.md | 237 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..33285d6 --- /dev/null +++ b/README.md @@ -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 { + 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 文件。