BaseFragment
private var _binding: VB? = null
protected val mBinding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = BindingReflex.reflexViewBinding(javaClass, layoutInflater)
return _binding?.root
}
BindingReflex.reflexViewBinding
/**
* 反射获取ViewBinding
*
* @param <V> ViewBinding 实现类
* @param aClass 当前类
* @param from layouinflater
* @return viewBinding实例
</V> */
fun <V : ViewBinding> reflexViewBinding(aClass: Class<*>, from: LayoutInflater?): V {
try {
val actualTypeArguments =
(Objects.requireNonNull(aClass.genericSuperclass) as ParameterizedType).actualTypeArguments
for (i in actualTypeArguments.indices) {
val tClass: Class<Any>
try {
tClass = actualTypeArguments[i] as Class<Any>
} catch (e: Exception) {
continue
}
if (ViewBinding::class.java.isAssignableFrom(tClass)) {
val inflate = tClass.getMethod("inflate", LayoutInflater::class.java)
return inflate.invoke(null, from) as V
}
}
return reflexViewBinding(aClass.superclass, from)
} catch (e: NoSuchMethodException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
} catch (e: InvocationTargetException) {
e.printStackTrace()
}
throw RuntimeException("ViewBinding初始化失败")
}