当前位置:   article > 正文

Android的视图绑定

Android的视图绑定

视图绑定(ViewBinding)在开发中起到的作用是代替findViewById

初始设置

ViewBinding是按模块启动的,在使用之前需要在模块中的gradle中开启ViewBinding。

  1. //kotlin
  2. android {
  3. ...
  4. buildFeatures {
  5. viewBinding = true
  6. }
  7. }
  8. //groovy
  9. android {
  10. ...
  11. buildFeatures {
  12. viewBinding true
  13. }
  14. }

使用

当我们为某个模块引入ViewBinding并Sync之后,系统会自动为该模块下的每一个xml生成一个绑定类,每个绑定类都包含该xml中的所有组件id的引用,而这些类的名称都与xml有关。例如我们已有一个布局文件名为result_profile.xml,他的绑定类名称就是ResultProfileBinding。

以下展示了如何在Activity和Fragment中使用生成的绑定类。

Activity

在onCreate中:

  1. 调用绑定类的inflate方法,目的是创建该绑定类的实例;
  2. 调用getRoot方法或使用Kotlin属性语法,获取对根视图的使用;
  3. 将第二步获取的根视图传递给setContentView方法,使其成为屏幕上的活动View。
  1. //kotlin
  2. private lateinit var binding: ResultProfileBinding
  3. override fun onCreate(savedInstanceState: Bundle?) {
  4. super.onCreate(savedInstanceState)
  5. binding = ResultProfileBinding.inflate(layoutInflater)//1+2
  6. setContentView(view)//3
  7. }
  8. //java
  9. private ResultProfileBinding binding;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. binding = ResultProfileBinding.inflate(getLayoutInflater());//1
  14. View view = binding.getRoot();//2
  15. setContentView(view);//3
  16. }

此后可以使用该绑定类的实例来引用任何视图:

  1. //kotlin
  2. private ResultProfileBinding binding;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. binding = ResultProfileBinding.inflate(getLayoutInflater());
  7. View view = binding.getRoot();
  8. setContentView(view);
  9. }
  10. //java
  11. binding.name.setText(viewModel.getName());
  12. binding.button.setOnClickListener(new View.OnClickListener() {
  13. viewModel.userClicked()
  14. });

Fragment

Fragment和Activity中的用法差不多,需要在onCreateView方法中执行以下:

  1. 调用绑定类中的inflate方法;
  2. 调用getRoot方法或使用Kotlin属性语法获取根视图的引用;
  3. 从onCreateView中返回根视图,使其成为屏幕上的活动View。
  1. //kotlin
  2. //该变量只在onCreateView和onDestroyView中可见
  3. private var _binding: ResultProfileBinding? = null
  4. private val binding get() = _binding!!
  5. override fun onCreateView(
  6. inflater: LayoutInflater,
  7. container: viewGroup?,
  8. savedInstanceState: Bundle?
  9. ): View? {
  10. _binding = ResultProfileBinding.inflate(inflater, container, false)
  11. val view = binding.root
  12. return view
  13. }
  14. override fun onDestroyView() {
  15. super.onDetroy()
  16. _binding = null
  17. }
  18. //java
  19. private ResultProfileBinding binding;
  20. @Override
  21. public View onCreateView (LayoutInflater inflater,
  22. ViewGroup container,
  23. Bundle savedInstanceState) {
  24. binding = ResultProfileBinding.inflate(inflater, container, false);
  25. View view = binding.getRoot();
  26. return view;
  27. }
  28. @Override
  29. public void onDestroyView() {
  30. super.onDestroyView();
  31. binding = null;
  32. }

由于kotlin中空类型系统的存在,在fragment中的ViewBinding写法与java相比会稍显复杂,需要在新建一个变量接收绑定的实例,并给出非空断言。

与findViewById的对比

两者都可用于直接引用视图的绑定类,ViewBinding的优势在于:

  • 加快编译速度:ViewBinding不需要处理注解
  • 易于使用:不需要标记xml文件,因为每个xml都会自动生成相应的绑定类

而与findViewById即数据绑定相比,ViewBinding具有以下限制:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/89033
推荐阅读
相关标签
  

闽ICP备14008679号