Skip to content

Commit 977b57d

Browse files
author
hegaojian
committed
commit 1.2.7 添加ViewBinding,后续无需重写layoutId()方法
1 parent 5fbc627 commit 977b57d

59 files changed

Lines changed: 51935 additions & 9492 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

JetpackMvvm/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ android {
88
defaultConfig {
99
minSdkVersion 21
1010
targetSdkVersion 30
11-
versionCode 26
12-
versionName "1.2.6"
11+
versionCode 27
12+
versionName "1.2.7"
1313
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1414
consumerProguardFiles 'consumer-rules.pro'
1515
}

JetpackMvvm/proguard-rules.pro

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,12 @@
6060
-keep class com.tbruyelle.rxpermissions2.** { *; }
6161
-keep interface com.tbruyelle.rxpermissions2.** { *; }
6262

63+
################ ViewBinding & DataBinding ###############
64+
-keepclassmembers class * implements androidx.viewbinding.ViewBinding {
65+
public static * inflate(android.view.LayoutInflater);
66+
public static * inflate(android.view.LayoutInflater, android.view.ViewGroup, boolean);
67+
public static * bind(android.view.View);
68+
}
69+
6370

6471

JetpackMvvm/src/main/java/me/hgj/jetpackmvvm/base/activity/BaseVmActivity.kt

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package me.hgj.jetpackmvvm.base.activity
22

33
import android.os.Bundle
4+
import android.view.View
45
import androidx.appcompat.app.AppCompatActivity
56
import androidx.lifecycle.Observer
67
import androidx.lifecycle.ViewModelProvider
78
import me.hgj.jetpackmvvm.base.viewmodel.BaseViewModel
89
import me.hgj.jetpackmvvm.ext.getVmClazz
10+
import me.hgj.jetpackmvvm.ext.util.notNull
911
import me.hgj.jetpackmvvm.network.manager.NetState
1012
import me.hgj.jetpackmvvm.network.manager.NetworkStateManager
1113

@@ -16,11 +18,6 @@ import me.hgj.jetpackmvvm.network.manager.NetworkStateManager
1618
*/
1719
abstract class BaseVmActivity<VM : BaseViewModel> : AppCompatActivity() {
1820

19-
/**
20-
* 是否需要使用DataBinding 供子类BaseVmDbActivity修改,用户请慎动
21-
*/
22-
private var isUserDb = false
23-
2421
lateinit var mViewModel: VM
2522

2623
abstract fun layoutId(): Int
@@ -33,11 +30,11 @@ abstract class BaseVmActivity<VM : BaseViewModel> : AppCompatActivity() {
3330

3431
override fun onCreate(savedInstanceState: Bundle?) {
3532
super.onCreate(savedInstanceState)
36-
if (!isUserDb) {
33+
initDataBind().notNull({
34+
setContentView(it)
35+
}, {
3736
setContentView(layoutId())
38-
} else {
39-
initDataBind()
40-
}
37+
})
4138
init(savedInstanceState)
4239
}
4340

@@ -86,8 +83,8 @@ abstract class BaseVmActivity<VM : BaseViewModel> : AppCompatActivity() {
8683
* 将非该Activity绑定的ViewModel添加 loading回调 防止出现请求时不显示 loading 弹窗bug
8784
* @param viewModels Array<out BaseViewModel>
8885
*/
89-
protected fun addLoadingObserve(vararg viewModels: BaseViewModel){
90-
viewModels.forEach {viewModel ->
86+
protected fun addLoadingObserve(vararg viewModels: BaseViewModel) {
87+
viewModels.forEach { viewModel ->
9188
//显示弹窗
9289
viewModel.loadingChange.showDialog.observeInActivity(this, Observer {
9390
showLoading(it)
@@ -99,12 +96,10 @@ abstract class BaseVmActivity<VM : BaseViewModel> : AppCompatActivity() {
9996
}
10097
}
10198

102-
fun userDataBinding(isUserDb: Boolean) {
103-
this.isUserDb = isUserDb
104-
}
105-
10699
/**
107100
* 供子类BaseVmDbActivity 初始化Databinding操作
108101
*/
109-
open fun initDataBind() {}
102+
open fun initDataBind(): View? {
103+
return null
104+
}
110105
}
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package me.hgj.jetpackmvvm.base.activity
22

3-
import android.os.Bundle
4-
import androidx.databinding.DataBindingUtil
3+
import android.view.View
54
import androidx.databinding.ViewDataBinding
65
import me.hgj.jetpackmvvm.base.viewmodel.BaseViewModel
6+
import me.hgj.jetpackmvvm.ext.inflateBindingWithGeneric
77

88
/**
99
* 作者 : hegaojian
@@ -13,18 +13,15 @@ import me.hgj.jetpackmvvm.base.viewmodel.BaseViewModel
1313
*/
1414
abstract class BaseVmDbActivity<VM : BaseViewModel, DB : ViewDataBinding> : BaseVmActivity<VM>() {
1515

16-
lateinit var mDatabind: DB
16+
override fun layoutId() = 0
1717

18-
override fun onCreate(savedInstanceState: Bundle?) {
19-
userDataBinding(true)
20-
super.onCreate(savedInstanceState)
21-
}
18+
lateinit var mDatabind: DB
2219

2320
/**
2421
* 创建DataBinding
2522
*/
26-
override fun initDataBind() {
27-
mDatabind = DataBindingUtil.setContentView(this, layoutId())
28-
mDatabind.lifecycleOwner = this
23+
override fun initDataBind(): View? {
24+
mDatabind = inflateBindingWithGeneric(layoutInflater)
25+
return mDatabind.root
2926
}
3027
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package me.hgj.jetpackmvvm.base.activity
2+
3+
import android.view.View
4+
import androidx.viewbinding.ViewBinding
5+
import me.hgj.jetpackmvvm.base.viewmodel.BaseViewModel
6+
import me.hgj.jetpackmvvm.ext.inflateBindingWithGeneric
7+
8+
/**
9+
* 作者 : hegaojian
10+
* 时间 : 2019/12/12
11+
* 描述 : 包含 ViewModel 和 ViewBinding ViewModelActivity基类,把ViewModel 和 ViewBinding 注入进来了
12+
* 需要使用 ViewBinding 的清继承它
13+
*/
14+
abstract class BaseVmVbActivity<VM : BaseViewModel, VB : ViewBinding> : BaseVmActivity<VM>() {
15+
16+
override fun layoutId(): Int = 0
17+
18+
lateinit var mViewBind: VB
19+
20+
/**
21+
* 创建DataBinding
22+
*/
23+
override fun initDataBind(): View? {
24+
mViewBind = inflateBindingWithGeneric(layoutInflater)
25+
return mViewBind.root
26+
27+
}
28+
}

JetpackMvvm/src/main/java/me/hgj/jetpackmvvm/base/fragment/BaseVmDbFragment.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,9 @@ import android.os.Bundle
44
import android.view.LayoutInflater
55
import android.view.View
66
import android.view.ViewGroup
7-
import androidx.databinding.DataBindingUtil
87
import androidx.databinding.ViewDataBinding
9-
import androidx.fragment.app.Fragment
10-
import androidx.lifecycle.Lifecycle
11-
import androidx.lifecycle.Observer
12-
import androidx.lifecycle.ViewModelProvider
138
import me.hgj.jetpackmvvm.base.viewmodel.BaseViewModel
14-
import me.hgj.jetpackmvvm.ext.getVmClazz
15-
import me.hgj.jetpackmvvm.network.manager.NetState
16-
import me.hgj.jetpackmvvm.network.manager.NetworkStateManager
9+
import me.hgj.jetpackmvvm.ext.inflateBindingWithGeneric
1710

1811
/**
1912
* 作者 : hegaojian
@@ -23,6 +16,8 @@ import me.hgj.jetpackmvvm.network.manager.NetworkStateManager
2316
*/
2417
abstract class BaseVmDbFragment<VM : BaseViewModel, DB : ViewDataBinding> : BaseVmFragment<VM>() {
2518

19+
override fun layoutId() = 0
20+
2621
//该类绑定的ViewDataBinding
2722
private var _binding: DB? = null
2823
val mDatabind: DB get() = _binding!!
@@ -32,8 +27,7 @@ abstract class BaseVmDbFragment<VM : BaseViewModel, DB : ViewDataBinding> : Base
3227
container: ViewGroup?,
3328
savedInstanceState: Bundle?
3429
): View? {
35-
_binding = DataBindingUtil.inflate(inflater, layoutId(), container, false)
36-
mDatabind.lifecycleOwner = this
30+
_binding = inflateBindingWithGeneric(inflater,container,false)
3731
return mDatabind.root
3832
}
3933

JetpackMvvm/src/main/java/me/hgj/jetpackmvvm/base/fragment/BaseVmFragment.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ abstract class BaseVmFragment<VM : BaseViewModel> : Fragment() {
3838
*/
3939
abstract fun layoutId(): Int
4040

41-
4241
override fun onCreateView(
4342
inflater: LayoutInflater,
4443
container: ViewGroup?,
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package me.hgj.jetpackmvvm.base.fragment
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import androidx.viewbinding.ViewBinding
8+
import me.hgj.jetpackmvvm.base.viewmodel.BaseViewModel
9+
import me.hgj.jetpackmvvm.ext.inflateBindingWithGeneric
10+
11+
/**
12+
* 作者 : hegaojian
13+
* 时间 : 2019/12/12
14+
* 描述 : ViewModelFragment基类,自动把ViewModel注入Fragment和 ViewBinding 注入进来了
15+
* 需要使用 ViewBinding 的清继承它
16+
*/
17+
abstract class BaseVmVbFragment<VM : BaseViewModel, VB : ViewBinding> : BaseVmFragment<VM>() {
18+
19+
override fun layoutId() = 0
20+
21+
//该类绑定的 ViewBinding
22+
private var _binding: VB? = null
23+
val mViewBind: VB get() = _binding!!
24+
25+
override fun onCreateView(
26+
inflater: LayoutInflater,
27+
container: ViewGroup?,
28+
savedInstanceState: Bundle?
29+
): View? {
30+
_binding = inflateBindingWithGeneric(inflater,container,false)
31+
return mViewBind.root
32+
}
33+
34+
override fun onDestroyView() {
35+
super.onDestroyView()
36+
_binding = null
37+
}
38+
}

JetpackMvvm/src/main/java/me/hgj/jetpackmvvm/ext/BaseViewModelExt.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ fun <T> BaseViewModel.request(
106106
resultState.paresResult(it)
107107
}.onFailure {
108108
it.message?.loge()
109+
//打印错误栈信息
110+
it.printStackTrace()
109111
resultState.paresException(it)
110112
}
111113
}
@@ -133,6 +135,8 @@ fun <T> BaseViewModel.requestNoCheck(
133135
resultState.paresResult(it)
134136
}.onFailure {
135137
it.message?.loge()
138+
//打印错误栈信息
139+
it.printStackTrace()
136140
resultState.paresException(it)
137141
}
138142
}
@@ -169,6 +173,8 @@ fun <T> BaseViewModel.request(
169173
}.onFailure { e ->
170174
//打印错误消息
171175
e.message?.loge()
176+
//打印错误栈信息
177+
e.printStackTrace()
172178
//失败回调
173179
error(ExceptionHandle.handleException(e))
174180
}
@@ -177,6 +183,8 @@ fun <T> BaseViewModel.request(
177183
loadingChange.dismissDialog.postValue(false)
178184
//打印错误消息
179185
it.message?.loge()
186+
//打印错误栈信息
187+
it.printStackTrace()
180188
//失败回调
181189
error(ExceptionHandle.handleException(it))
182190
}
@@ -214,6 +222,8 @@ fun <T> BaseViewModel.requestNoCheck(
214222
loadingChange.dismissDialog.postValue(false)
215223
//打印错误消息
216224
it.message?.loge()
225+
//打印错误栈信息
226+
it.printStackTrace()
217227
//失败回调
218228
error(ExceptionHandle.handleException(it))
219229
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package me.hgj.jetpackmvvm.ext
2+
3+
import android.view.LayoutInflater
4+
import android.view.ViewGroup
5+
import androidx.appcompat.app.AppCompatActivity
6+
import androidx.databinding.ViewDataBinding
7+
import androidx.fragment.app.Fragment
8+
import androidx.viewbinding.ViewBinding
9+
import java.lang.reflect.InvocationTargetException
10+
import java.lang.reflect.ParameterizedType
11+
12+
/**
13+
* 作者 : hegaojian
14+
* 时间 : 2021/12/21
15+
* 描述 :
16+
*/
17+
18+
@JvmName("inflateWithGeneric")
19+
fun <VB : ViewBinding> AppCompatActivity.inflateBindingWithGeneric(layoutInflater: LayoutInflater): VB =
20+
withGenericBindingClass<VB>(this) { clazz ->
21+
clazz.getMethod("inflate", LayoutInflater::class.java).invoke(null, layoutInflater) as VB
22+
}.also { binding ->
23+
if (binding is ViewDataBinding) {
24+
binding.lifecycleOwner = this
25+
}
26+
}
27+
28+
@JvmName("inflateWithGeneric")
29+
fun <VB : ViewBinding> Fragment.inflateBindingWithGeneric(layoutInflater: LayoutInflater, parent: ViewGroup?, attachToParent: Boolean): VB =
30+
withGenericBindingClass<VB>(this) { clazz ->
31+
clazz.getMethod("inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java)
32+
.invoke(null, layoutInflater, parent, attachToParent) as VB
33+
}.also { binding ->
34+
if (binding is ViewDataBinding) {
35+
binding.lifecycleOwner = viewLifecycleOwner
36+
}
37+
}
38+
39+
private fun <VB : ViewBinding> withGenericBindingClass(any: Any, block: (Class<VB>) -> VB): VB {
40+
var genericSuperclass = any.javaClass.genericSuperclass
41+
var superclass = any.javaClass.superclass
42+
while (superclass != null) {
43+
if (genericSuperclass is ParameterizedType) {
44+
try {
45+
return block.invoke(genericSuperclass.actualTypeArguments[1] as Class<VB>)
46+
} catch (e: NoSuchMethodException) {
47+
} catch (e: ClassCastException) {
48+
} catch (e: InvocationTargetException) {
49+
throw e.targetException
50+
}
51+
}
52+
genericSuperclass = superclass.genericSuperclass
53+
superclass = superclass.superclass
54+
}
55+
throw IllegalArgumentException("There is no generic of ViewBinding.")
56+
}

0 commit comments

Comments
 (0)