Simple encapsulation of ViewBinding usage and Base base class

  • a brief introdction:

        In plain English, ViewBinding can help developers quickly find controls with ids, without further ado..

  • Simple to use:

Configure in the .gradle file under the module that needs to be used:

android {
        buildFeatures {
            viewBinding = true
        }
}

After the configuration is complete, it can be used

For example:

class TextActivity : AppCompatActivity() {
    lateinit var binding:ActivityTextBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityTextBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.btn.setOnClickListener {}
    }
}

The ActivityTextBinding class is generated by the corresponding activity_text.xml file,

If you don't want xml to generate the corresponding Binding file, you can add it to the xml and tag

tools:viewBindingIgnore="true  "

  • Encapsulate BaseActivity base class
abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
    protected lateinit var binding: VB
    override fun onCreate(savedInstanceState: Bundle?) {
        initial()
        super.onCreate(savedInstanceState)
        binding = createBinding()
        setContentView(binding.root)
        initView()
        initData()
    }
    open fun initial(){}
    protected abstract fun initView()
    protected abstract fun initData()

    private fun createBinding(): VB {
        val vbClass = getVBClass()
        val inflateMethod = vbClass.getMethod("inflate", LayoutInflater::class.java)
        return inflateMethod.invoke(null, layoutInflater) as VB
    }

    @Suppress("UNCHECKED_CAST")
    private fun getVBClass(): Class<VB> {
        val type = javaClass.genericSuperclass as ParameterizedType
        val vbClass = type.actualTypeArguments[0] as Class<VB>

        return vbClass
    }
}
  • Encapsulate BaseFragment base class
abstract class BaseFragment<VB : ViewBinding> : Fragment() {

    protected lateinit var binding: VB

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = createBinding(inflater, container)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initView()
        initData()
    }

    abstract fun initData()

    protected abstract fun initView()

    private fun createBinding(inflater: LayoutInflater, container: ViewGroup?): VB {
        val vbClass = getVBClass()
        val inflateMethod = vbClass.getMethod("inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java)
        return inflateMethod.invoke(null, inflater, container, false) as VB
    }

    @Suppress("UNCHECKED_CAST")
    private fun getVBClass(): Class<VB> {
        val type = javaClass.genericSuperclass as ParameterizedType
        val vbClass = type.actualTypeArguments[0] as Class<VB>
        return vbClass
    }

}
  • Notice

If confusion is enabled, please add in the proguard-rules.pro file:

-keep class * implements androidx.viewbinding.ViewBinding {
    *;
}

 you're done

Guess you like

Origin blog.csdn.net/lwh1212/article/details/130017315