Encapsulación simple del uso de ViewBinding y la clase base Base

  • una breve introducción:

        En términos sencillos, ViewBinding puede ayudar a los desarrolladores a encontrar rápidamente controles con identificadores, sin más preámbulos.

  • Fácil de usar:

Configure en el archivo .gradle debajo del módulo que debe usarse:

Android { 
        buildFeatures { 
            viewBinding = verdadero 
        } 
}

Una vez completada la configuración, se puede utilizar.

Por ejemplo:

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 {}
    }
}

La clase ActivityTextBinding es generada por el archivo Activity_text.xml correspondiente,

Si no desea que xml genere el archivo de enlace correspondiente, puede agregarlo al xml y etiquetarlo

herramientas:viewBindingIgnore="true  "

  • Encapsular la clase base BaseActivity
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
    }
}
  • Encapsular la clase base BaseFragment
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
    }

}
  • Aviso

Si se habilita la confusión, agregue el archivo proguard-rules.pro:

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

 ya terminaste

Supongo que te gusta

Origin blog.csdn.net/lwh1212/article/details/130017315
Recomendado
Clasificación