简体中文 | English
🔥🔥🔥增强ViewBinding的使用场景 ViewBindingPro
使用这个框架之后,您在 BaseActivity 或 BaseFragment 等基类配置一个注解就可以为 子类自动注入加载代码,无需使用反射
在开始之前可以给项目一个Star吗?非常感谢,你的支持是我唯一的动力。欢迎Star和Issues!
-
新版本
plugins { //必须项 👇 apply 设置为 true id "io.github.FlyJingFish.ViewBindingPro" version "1.0.4" apply true }
-
或者老版本
buildscript { dependencies { //必须项 👇 classpath 'io.github.FlyJingFish.ViewBindingPro:viewbindingpro-plugin:1.0.4' } } // 👇加上这句自动为所有module设置 apply plugin: "viewbinding.pro"
dependencies {
//必须项 👇
implementation 'io.github.FlyJingFish.ViewBindingPro:viewbindingpro-core:1.0.4'
}
Tip
如果你希望打包后的代码中不包含 viewbindingpro-core
库,可以改为 compileOnly
方式引入
- BaseActivity
abstract class BaseActivity<VB :ViewBinding>:AppCompatActivity() {
@BindViewBinding(position = 0, methodName = "void onCreate(android.os.Bundle)", isProtected = true, bindingType = BingType.INFLATE)
protected lateinit var binding :VB
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
}
}
- BaseFragment
abstract class BaseFragment<VB : ViewBinding>: Fragment() {
@BindViewBinding(position = 0, methodName = "android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle)", isProtected = false,bindingType = BingType.INFLATE_FALSE)
protected lateinit var binding :VB
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return binding.root
}
}
- BaseActivity
abstract class BaseVMActivity<VB :ViewBinding,VM: ViewModel>:BaseActivity<VB>() {
@BindClass(position = 1, insertMethodName = "void onCreate(android.os.Bundle)", callMethodName = "androidx.lifecycle.ViewModel initViewModel(java.lang.Class)",isProtected = false)
protected lateinit var mViewModel : VM
fun initViewModel(clazz: Class<out ViewModel>):ViewModel {
return ViewModelProvider(this)[clazz]
}
}
- BaseFragment
abstract class BaseVMFragment<VB :ViewBinding,VM: ViewModel>:BaseFragment<VB>() {
@BindClass(position = 1, insertMethodName = "android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle)", callMethodName = "androidx.lifecycle.ViewModel initViewModel(java.lang.Class)",isProtected = false)
protected lateinit var mViewModel : VM
fun initViewModel(clazz: Class<out ViewModel>):ViewModel {
return ViewModelProvider(this)[clazz]
}
}
上述两个例子都会在实现类的相应方法中,调用 initViewModel
@CancelBindViewBinding
@CancelBindClass
class MainActivity:BaseVMActivity<ActivityMainBinding,ExampleViewModel>() {
}
- CancelBindViewBinding 是取消注入 ViewBinding
- CancelBindClass 是取消注入 class
在根目录的 gradle.properties
中增加如下设置
#设置为false即可关闭自动注入功能
viewbindingpro.enable = true
如果你的module全部为 kotlin 代码,有可能插件不生效,目前的处理方法有两个
- 1、在根目录的
gradle.properties
中增加如下设置
android.defaults.buildfeatures.buildconfig=true
- 2、手动为不起作用的 module 增加一个 java 代码