Android ViewBinding使用及原理

Android ViewBinding使用及原理

一、定义

ViewBinding主要是Google用来findViewById的,作用跟Butterknife差不多。只不过Butterknife是通过扫描注解生成相应代码,而ViewBinding是通过扫描layout布局文件生成相应代码。而且ViewBinding是Google开发,深度集成在idea上。

二、使用

在模块build.gradle文件中添加配置:

android {
    ...
    viewBinding{
        enabled = true
    }
}

注意:视图绑定在 Android Studio 3.6 Canary 11 及更高版本中可用。

点击Sync project重新编译,编译完成后就会在build文件夹下生成相应的文件,每个布局文件都会生成一个Binding文件。文件命名是根据xml布局命名的:activity_main.xml对应ActivityMainBinding.class。
如下图:
Android ViewBinding使用及原理_第1张图片

代码中引用(Activity):

private lateinit var binding : ActivityShareBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityShareBinding.inflate(layoutInflater)
    setContentView(binding.root)
    binding.btShare.setOnClickListener {
    	startActivity(Intent(this,ShareActivity::class.java)) 
    }
}

代码中引用(Fragment):

private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

控件使用:直接通过binding进行引用。

binding.btShare

布局中使用了include标签:如果我们在布局中引入了其它布局,如何使用引入布局中的控件?
如:引入了layout_secondary_title.xml布局
Android ViewBinding使用及原理_第2张图片
方法一:如下
Android ViewBinding使用及原理_第3张图片

方法二:通过父布局往下引用

binding.llTitle.back.setOnClickListener(this)
binding.llTitle.tvTitle.setText(R.string.Screenshot_Online)

代码中引用(Adapter):

public static class ViewHolder extends RecyclerView.ViewHolder{
    
    public ViewHolder(ItemBinding itemBinding) {
        super(itemBinding.getRoot());
    }
}
 
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    ItemBinding binding = ItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
    return new ViewHolder(binding);
}

三、忽略

如果不想生成文件的话,可以在xml中添加如下属性进行忽略:

tools:viewBindingIgnore="true"

如下图:
Android ViewBinding使用及原理_第4张图片

四、原理

编译时通过gradle插件扫描布局文件生成相应的绑定类——class文件,绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用,在Activity中初始化该对象,对控件进行调用。实际上,就是通过插件帮我们编写findViewById这样的重复代码。

五、优缺点

  • **Null 安全:**由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中(比如横竖屏布局内容差异),则绑定类中包含其引用的字段会使用 @Nullable 标记。
  • **类型安全:**每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。
  • 相比于butterknife,不需要重新build也支持viewBind.id。

六、与dataBinding对比

视图绑定和数据绑定均会生成可用于直接引用视图的绑定类。但是,视图绑定旨在处理更简单的用例,与数据绑定相比,具有以下优势:

  • **更快的编译速度:**视图绑定不需要处理注释,因此编译时间更短。
  • **易于使用:**视图绑定不需要特别标记的 XML布局文件,因此在应用中采用速度更快。在模块中启用视图绑定后,它会自动应用于该模块的所有布局。

反过来,与数据绑定相比,视图绑定也具有以下限制:

  • 视图绑定不支持布局变量或布局表达式,因此不能用于直接在 XML 布局文件中声明动态界面内容。
  • 视图绑定不支持双向数据绑定。

考虑到这些因素,在某些情况下,最好在项目中同时使用视图绑定和数据绑定。您可以在需要高级功能的布局中使用数据绑定,而在不需要高级功能的布局中使用视图绑定。

你可能感兴趣的:(Android开发,android,java,viewbinding,视图绑定)