当前位置: 首页 > article >正文

Android的视图绑定

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

初始设置

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

//kotlin
android {
    ...
    buildFeatures {
        viewBinding = true
    }
}

//groovy
android {
    ...
    buildFeatures {
        viewBinding true
    }
}

使用

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

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

Activity

在onCreate中:

  1. 调用绑定类的inflate方法,目的是创建该绑定类的实例;
  2. 调用getRoot方法或使用Kotlin属性语法,获取对根视图的使用;
  3. 将第二步获取的根视图传递给setContentView方法,使其成为屏幕上的活动View。
//kotlin
private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)//1+2
    setContentView(view)//3
}

//java
private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());//1
    View view = binding.getRoot();//2
    setContentView(view);//3
}

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

//kotlin
private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}

//java
binding.name.setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

Fragment

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

  1. 调用绑定类中的inflate方法;
  2. 调用getRoot方法或使用Kotlin属性语法获取根视图的引用;
  3. 从onCreateView中返回根视图,使其成为屏幕上的活动View。
//kotlin
//该变量只在onCreateView和onDestroyView中可见
private var _binding: ResultProfileBinding? = null
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.onDetroy()
    _binding = null
}

//java
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;
}

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

与findViewById的对比

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

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

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

  • 不支持布局变量或布局表达式,因此不能直接从xml声明动态界面内容
  • 不支持双向数据绑定

http://www.kler.cn/a/232198.html

相关文章:

  • 第三百二十三节 Java线程教程 - Java同步器
  • FRP 实现内网穿透
  • Ubuntu中使用纯命令行进行Android开发
  • FlinkSql读取kafka数据流的方法(scala)
  • DB-GPT系列(四):DB-GPT六大基础应用场景part1
  • 『VUE』27. 透传属性与inheritAttrs(详细图文注释)
  • 相机图像质量研究(5)常见问题总结:光学结构对成像的影响--景深
  • Java面向对象 方法的重写
  • GPIO中断
  • 1 月 Web3 游戏行业概览:市场实现空前增长
  • 图数据库 之 Neo4j - Browser 介绍(3)
  • ORM模型类
  • Python使用zdppy_es国产框架操作Elasticsearch实现增删改查
  • VoIP之主备注册服务器机制
  • 如何运行心理学知识(心流)来指导工作和生活
  • 【canvas】获取鼠标点击位置坐标的颜色信息
  • 今日学习总结
  • Bee V2.2 分库分表 Sharding+MongoDB ORM 稳定版发布 (更新 Maven)
  • MongoDB聚合: $sort
  • 【Linux】缓冲区与缓冲区的刷新策略
  • 如何修复Mac的“ kernel_task” CPU使用率过高的Bug?
  • PV、UV、IP
  • 【Web】vulhub Shiro-550反序列化漏洞复现学习笔记
  • 计算机网络-无线通信技术与原理
  • 509. 斐波那契数
  • C++ .h文件类的调用