kotlin ViewBinding的使用

ViewBinding的优点:
  • 仅仅支持绑定 View
  • 不需要在布局文件中添加layout标签
  • 需要在模块级build.gradle文件中添加 viewBinding = true 即可使用
  • 效率高于DataBinding,因为避免了与数据绑定相关的开销和性能问题
  • 相比于kotlin-android-extensions插件避免了空异常
Gradle配置:
// Android Studio 3.6
android {
    viewBinding {
        enabled = true
    }
}

// Android Studio 4.0
android {
    buildFeatures {
        viewBinding = true
    }
}
ViewBinding简单使用:
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        with(binding){
            textView.setText("这是ViewBinding")
        }
    }
}
BaseActivity的封装和使用:
abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
    lateinit var binding: VB
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //利用反射,调用指定ViewBinding中的inflate方法填充视图
        val type = javaClass.genericSuperclass
        if (type is ParameterizedType) {
            val clazz = type.actualTypeArguments[0] as Class<VB>
            val method = clazz.getMethod("inflate", LayoutInflater::class.java)
            binding = method.invoke(null, layoutInflater) as VB
            setContentView(binding.root)
        }
 
        initData()
    }
 
    abstract fun initData()
}

BaseFragment的封装和使用:
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
    lateinit var binding: VB
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        //利用反射,调用指定ViewBinding中的inflate方法填充视图
        val type = javaClass.genericSuperclass
        val clazz = (type as ParameterizedType).actualTypeArguments[0] as Class<VB>
        val method = clazz.getMethod("inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java)
        binding= method.invoke(null, layoutInflater, container, false) as VB
        return binding.root
    }
 
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initData()
    }
 
    abstract fun initData()
}

版权声明:本文为tanlove1314原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。