Jetpack之ViewBinding(视图绑定)

定义(作用)

通过视图绑定功能,可以更轻松的编写与视图交互的代码。
在模块中启用视图绑定功能后,系统会为该模块中的每个XML文件生成一个绑定类。绑定类的实例包含所对应布局中所有具有 id 的视图的直接引用
在大多数情况下,视图绑定会替代 findViewById()

参考文档

官网地址:https://developer.android.google.cn/topic/libraries/view-binding

启动视图绑定功能

在相应模块的 build.gradle 文件中添加如下代码

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

用法

  • 忽略指定的 view

    在指定 view 的 XML 文件中添加代码 tools:viewBindingIgnore=“true”

    
           ...
        
    
  • 定义并初始化视图绑定的实例(ViewBinding:视图绑定的基类)

    Activity中创建并定义实例: ResultProfileBinding.inflate(getLayoutInflater())

    private ResultProfileBinding binding;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ResultProfileBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);
    
        binding.getName().setText(viewModel.getName());
        binding.button.setOnClickListener(new View.OnClickListener() {
            viewModel.userClicked()
        });
    }
    

    Fragment中创建并定义实例:ResultProfileBinding.inflate(inflater, container, false);

    private ResultProfileBinding binding;
    
    @Override
    public View onCreateView (LayoutInflater inflater,
                              ViewGroup container,
                              Bundle savedInstanceState) {
        binding = ResultProfileBinding.inflate(inflater, container, false);
        View view = binding.getRoot();
        return view;
    }
    
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
    
  • 视图文件中 include 的使用:视图绑定实例.include的id.include布局中的view id

    binding = ResultProfileBinding.inflate(inflater);
    textView = binding.include.name
    
  • 视图文件中 include 中 存在 merge 的情况

    同上

  • 注意

    视图文件修改后,必须编译完成,ViewBinding 的实例才可以获取新添加的 View

与 findViewById 相比优缺点

  • 优点

    • Null 安全:视图绑定实例是对视图的直接引用,因此不存在因视图 id 无效而引起的空指针异常。
    • 类型安全:视图绑定实例的每个字段均与 XML 文件中的视图相匹配,所以不存在类型转换异常。
    • 如果出现错误是在编译期出现,而不是运行时,更方便查询错误
  • 缺点

    • 需要编译后才可以使用

你可能感兴趣的:(android)