开源-MVVM手脚架-BaseMVVM

一个快速开发架构,使用了MVVM架构,集成使用了LiveData,ViewModel,Lifecycle,google Jetpack ,帮助开发者快速上手mvvm

前言

最早之前其实写过一个base 的基础库框架。幻想着吧好多东西都集成进去,发现反而显得很冗余,收到郭嫂在litepal 新版本的启发,一个库应该纯粹,适当的时候可以做减法,将不必须要的东西都是删除,所以才有了今天的这个框架,BaseMVVM

抱歉

这个框架目前只在公司的项目中使用了,没什么大问题,毕竟是公司的项目,在写这个博客的时候还没有上线,所以不能放图,更不可能开源。。就没办法放上图给各位看官,聊表歉意,放上妹子一张

下载

Step 1. Add the JitPack repository to your build file

Add it in your root build.gradle at the end of repositories:

1
2
3
4
5
allprojects {
repositories {
maven { url 'https://www.jitpack.io' }
}
}

Step 2. Add the dependency

1
2
3
dependencies {
implementation 'com.github.JiangHaiYang01:BaseMvvM:Tag'
}

当前最新版本

使用

开启 databinding

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
android{
//==========================================================================================
// 从Android Gradle Plugin 4.0.0-alpha05这里开始,有一个称为buildFeatures启用构建功能的新块。
// 因此,为了使用新的AGP插件启用数据绑定,您必须执行以下操作
//==========================================================================================
buildFeatures{
//==========================================================================================
// 启用 DataBinding
//==========================================================================================
dataBinding = true
//==========================================================================================
// 启用 viewBinding
//==========================================================================================
// viewBinding = true
}
}

将自己的application 继承 BaseApplication

关于是否创建 BaseApplication

原本计划是不要 BaseApplication ,认为手脚架就应该精简,不需要那么多花里胡哨的东西,但是想了很久还是加上了。主要有一下几个考虑

  • 方便加入一下状态,例如网络监测。就不需要再BaseActivity 中去添加(其实也可以,但是有了LiveData 就抛弃了使用Lifecycle 去自动管理)
  • 提供了 context

activity 中使用

在项目中,有一个 LogInAct 的 sample 文末我会放出GitHub 地址,

  • LogInRepos
1
2
3
4
//继承 BaseRepos
//这里可以添加自己需要的model 提供数据源
class LoginRepos : BaseRepos() {
}
  • LoginViewModel
1
2
3
//继承 BaseVM
class LoginViewModel : BaseVM<LoginRepos>() {
}
  • LoginAct
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//继承 BaseMVVMActivity
class LoginAct : BaseMVVMActivity<ActivityLoginBinding, LoginRepos, LoginViewModel>() {

//这里的接口主要是防止忘记绑定xml
override fun initBindDataBing() {
//dataBind.viewModel 是在xml 自己定义的viewmodel
dataBind.viewModel = viewModel
}


//事件的处理建议放在这里,
override fun initCreate() {

}


//返回当前的布局
override fun getContentViewId(): Int {
return R.layout.activity_login
}

//返回 Repos
override fun createRepos(): LoginRepos {
return LoginRepos()
}

//创建viewModel
override fun createVMClass(): Class<LoginViewModel> {
return LoginViewModel::class.java
}

//liveData变化
override fun initLiveData() {

}

}
  • xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>

<variable
name="viewModel"
type="com.allens.base.activity.LoginViewModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/act_login_parent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

....


</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

fragment 中使用

和在activity 使用相同 指需要继承BaseMVVMFragment即可

1
2
class LoginFragment :
BaseMVVMFragment<FragmentLoginBinding, LogInFragmentRepos, LoginFragmentViewModel>() {}

其他用法

沉寂式

关于沉寂式,已经有很多的文章去说明,也有不少优秀的开源库,专门做个事情的

BaseActivity中设置

1
2
3
override fun setStatusBarHide(): Boolean {
return true
}

开启 即可,默认是关闭的

手势识别

Android 上的手势和ios 没法比 很多需要自己去写,目前提供两个手势 捏合 两指放大

1
2
3
override fun setGestures(): Boolean {
return true
}

默认是不开启的

然后实现

1
2
3
4
5
6
7
8
9
override fun onGesturesAmplification() {
super.onGesturesAmplification()
tv_info.text = "放大"
}

override fun onGesturesNarrow() {
super.onGesturesNarrow()
tv_info.text = "缩小"
}

网络变化

网络变化检测的方法有很多,可以在项目源码中查看 NetworkHelper查看,在 BaseApplication中注册了。通过lvieData 分发到 BaseActivityBaseFragment

用过livedata 的同学都知道 livedata 有一个倒灌的概念

这里需要感谢 重学安卓,这个概念也是从这里get 到的

为了防止 获取到在注册之前的数据变化,借鉴了 第三方的工具 LiveEventBus 参考其中的代码 作为事件分发的工具

实现接口 override fun onNetWorkStatus(isMobileConn: Boolean, isWifiConn: Boolean) 就能拿到网络的变化状态

activity 和 fragment 中使用方式相同

1
2
3
4
5
6
7
8
9
10
11
12
13
class StatusActivity :BaseActivity(){
override fun getContentViewId(): Int {
return R.layout.activity_status
}

override fun initOnCreate() {
}

override fun onNetWorkStatus(isMobileConn: Boolean, isWifiConn: Boolean) {
super.onNetWorkStatus(isMobileConn, isWifiConn)
info.text = "activity 网络变化 手机网络 $isMobileConn 无线网络 $isWifiConn"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
class StatusFragment :BaseFragment(){
override fun getContentViewId(): Int {
return R.layout.fragment_status
}

override fun initOnCreate() {
}

override fun onNetWorkStatus(isMobileConn: Boolean, isWifiConn: Boolean) {
super.onNetWorkStatus(isMobileConn, isWifiConn)
info.text = "fragment 网络变化 手机网络 $isMobileConn 无线网络 $isWifiConn"
}
}

可以在 Application 中使用 (需要继承BaseApplication) 控制是否打开网络监测 默认是打开的

1
2
3
4
5

//开启网络监测
override fun setNewWorkStatus(): Boolean {
return true
}

GitHub

Github