open class BaseActivity<T:ViewBinding>: AppCompatActivity() {
lateinit var binding:T
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val cls = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as Class<T>
binding = cls.getMethod("inflate", LayoutInflater::class.java).invoke(null, LayoutInflater.from(this)) as T
setContentView(binding.root)
}
}
class MainActivity:BaseActivity<ActivityMainBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.tv.text = "hehe"
}
}
Fragment
open class BaseFragment<T: ViewBinding> : Fragment() {
private var _binding:T? = null
val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val cls = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as Class<T>
_binding = cls.getMethod("inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java).invoke(null, LayoutInflater.from(requireActivity()), container, false) as T
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
class HomeFragment:BaseFragment<FragmentHomeBinding>() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
binding.tv.text = "hehe"
}
}
-keep class * implements androidx.viewbinding.ViewBinding
-keepclassmembers class * implements androidx.viewbinding.ViewBinding { public static ** inflate(...); public static ** bind(***); }