ViewBinding封装基类(BaseActivity,BaseFragment)

1,008 阅读1分钟

/混淆规则

-keep class  包名.databinding.* {*;}

不使用反射

open class ViewActivity<VB : ViewBinding>(open val block:(LayoutInflater)->VB) : Activity(){
    protected val binding by lazy { block(layoutInflater) }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
    }
}
 
abstract class ViewFragment2<VB : ViewBinding>(val bindingBlock:(LayoutInflater, ViewGroup?,Boolean)->VB) : Fragment(){

    private lateinit var _binding: VB
    protected val binding get() = _binding
    
    override fun getLayoutId() = 0
    
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        isLoaded = false
        _binding = bindingBlock(inflater,container,false)
        return _binding.root
    }
}
    
class MainActivity2 : ViewActivity<ActivityMain2Binding>(ActivityMain2Binding::inflate){
}
 
class MyFragment:ViewFragment2<FragmentMyBinding>(FragmentMyBinding::inflate){
    
}

经过验证 如下

abstract class BaseFragment<VB : ViewBinding>(val bindingInflate:(LayoutInflater, ViewGroup?, Boolean)->VB) : Fragment() {

    private lateinit var _binding: VB
    protected val binding get() = _binding

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        _binding = bindingInflate(inflater, container, false)
        // 初始化view
        initViews(_binding.root)
        return _binding.root
    }

    //子类有可能可以override,所以要open一下
    open fun initViews(rootView: View) {}

}