Jetpack学习-6-Viewbinding使用及简单分析

2023-05-16

Jetpack可以帮助开发者减少样板代码,而findviewbyId正是需要减少的样板代码,于是就有了ViewBinding。一开始我细看Jetpack的各个组件我是懵的,里面没有ViewBinding,这不好把它归纳到Jetpack系列中,后面通过底层源码分析,它是Gradle将DataBinding中识图绑定功能单独抽离出来的一个子集,所以也算是Jetpack中的一员。

简单分析

下面是ViewBinding的简单使用,当前使用的Android Gradle Plugin版本为4.1.0及4.2.0

0,当Android Gradle Plugin 版本4.1.0时,项目中有个androidx.databinding:viewbinding:4.1.0@aar的依赖,当AndroidGradlePluginVersion切换到4.2.0时,viewbinding依赖变为androidx.databinding:viewbinding:4.2.0@aar,果然,和databinding有关系,和AndroidGradlePlugin版本也有联系,依赖中有ViewBinding类。

ViewBinding源码如下

package androidx.viewbinding;

import android.view.View;
import androidx.annotation.NonNull;

/** A type which binds the views in a layout XML to fields. */
public interface ViewBinding {

    @NonNull
    View getRoot();
}

Viewbinding在Activity上的使用及分析

1,在项目中的gradle中

android{
	 //android4.0之前
     viewBinding{
     	enabled=true
    }

    
     //androidstudio4.0以上
	 buildFeatures {
       	viewBinding true
   	}
}

2, 系统会对每一个布局文件即时默认生成一个Binding类

如果不需要对布局文件进行绑定,可在布局根节点中添加下述属性:

tools:viewBindingIgnore="true" >

 3,生成文件的路径在build\generated\data_binding_base_class_source_out\debug\out\com\sun\viewbinding\databinding上,查看布局及生成的文件,并在activity中添加布局

1)xml布局 activity_main5.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/bt_showframe"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="显示" />

    <TextView
        android:id="@+id/tv_myName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World,I am module 5!" />

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>






2)生成的文件 ActivityMain5Binding.java

package com.sun.viewbinding.databinding;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewbinding.ViewBinding;
import com.sun.viewbinding.R;
import java.lang.NullPointerException;
import java.lang.Override;
import java.lang.String;

public final class ActivityMain5Binding implements ViewBinding {  //实现了ViewBinding中的getRoot()方法
  @NonNull
  private final LinearLayout rootView;							  //布局中的根布局,是private修饰,保证安全

  @NonNull
  public final Button btShowframe;								//全是public修饰,保证快捷访问

  @NonNull
  public final FrameLayout frame;								//全是public修饰,保证快捷访问

  @NonNull
  public final TextView tvMyName;								//全是public修饰,保证快捷访问



  @NonNull
  public static ActivityMain5Binding inflate(@NonNull LayoutInflater inflater) {//传入解析器,进行进行布局解析
    return inflate(inflater, null, false);
  }

  @NonNull
  public static ActivityMain5Binding inflate(@NonNull LayoutInflater inflater,
      @Nullable ViewGroup parent, boolean attachToParent) {
    View root = inflater.inflate(R.layout.activity_main5, parent, false);			//ActivityMain5Binding.java类解析activity_main5.xml
    if (attachToParent) {
      parent.addView(root);
    }
    return bind(root);
  }

  @NonNull
  public static ActivityMain5Binding bind(@NonNull View rootView) {
    // The body of this method is generated in a way you would not otherwise write.
    // This is done to optimize the compiled bytecode for size and performance.
    int id;
    missingId: {
      id = R.id.bt_showframe;
      Button btShowframe = rootView.findViewById(id);								//终究也还是通过findviewbyId进行id与view的关联
      if (btShowframe == null) {
        break missingId;
      }

      id = R.id.frame;
      FrameLayout frame = rootView.findViewById(id);
      if (frame == null) {
        break missingId;
      }

      id = R.id.tv_myName;
      TextView tvMyName = rootView.findViewById(id);
      if (tvMyName == null) {
        break missingId;
      }

      return new ActivityMain5Binding((LinearLayout) rootView, btShowframe, frame, tvMyName);
    }
    String missingId = rootView.getResources().getResourceName(id);
    throw new NullPointerException("Missing required view with ID: ".concat(missingId));
  }

  private ActivityMain5Binding(@NonNull LinearLayout rootView, @NonNull Button btShowframe,
      @NonNull FrameLayout frame, @NonNull TextView tvMyName) {
    this.rootView = rootView;
    this.btShowframe = btShowframe;
    this.frame = frame;
    this.tvMyName = tvMyName;
  }

  @Override
  @NonNull
  public LinearLayout getRoot() {								//实现自ViewBinding
    return rootView;
  }
}







3,MainActivity.java 使用绑定类

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMain5Binding binding = ActivityMain5Binding.inflate(getLayoutInflater());//给绑定类传入解析器
        setContentView(binding.getRoot());//activity添加布局
        binding.tvMyName.setText("hello,My name is lilei");//更改布局
    }
}

这样,viewbinding在activity上就使用好了。

ViewBinding在Fragment中的使用

import com.sun.viewbinding.databinding.FragmentHelloBinding;

public class HelloFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        FragmentHelloBinding binding = FragmentHelloBinding.inflate(inflater, container, false);
        binding.tvFragmentHello.setText("hello,I am hanmeimei in Fragment");
        return binding.getRoot();
    }
}

ViewBinding在Dialog中的使用

public void showDialog() {
        Dialog dialog = new Dialog(this);
        DialogHelloBinding binding = DialogHelloBinding.inflate(dialog.getLayoutInflater());
        dialog.setContentView(binding.getRoot());
        binding.tvDialogHello.setText("你好,我是dialog Poly");
        dialog.show();
    }

ViewBinding在RecycleView+Adapter中的使用

import com.sun.viewbinding.databinding.ItemStudentBinding;

public class StudentAdapter extends RecyclerView.Adapter<StudentAdapter.StudentViewHold> {


    private ArrayList<Student> beans;

    public StudentAdapter(ArrayList<Student> beans) {
        this.beans = beans;
    }

    @NonNull
    @Override
    public StudentViewHold onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       ItemStudentBinding binding= ItemStudentBinding.inflate(LayoutInflater.from(parent.getContext()));

        return new StudentViewHold(binding);
    }

    @Override
    public void onBindViewHolder(@NonNull StudentViewHold holder, int position) {
        Student bean = beans.get(position);
        holder.tv_age.setText("年龄=" + bean.age);
        holder.tv_name.setText("名字=" + bean.name);
    }

    @Override
    public int getItemCount() {
        return beans.size();
    }

    class StudentViewHold extends RecyclerView.ViewHolder{
        TextView tv_name;
        TextView tv_age;

        public StudentViewHold(ItemStudentBinding binding) {
            super(binding.getRoot());
            tv_name=binding.tvName;
            tv_age=binding.tvAge;
        }
    }
}

小结

总得来说,viewbinding是相当简单并且实用的,相比传统的直接findviewbyid省去了类型转换,也保证了控件的空安全,传入解析器就能自动得到view,也能得到根view下的子view,可以有效避免张冠李戴,这一切都是因为Android Gradle Plugin自动对全部的布局文件进行了封装绑定,在java层只需对绑定类进行直接操作即可,Android Gradle Plugin如何生成绑定类后续再深入分析吧。

Android-Jetpack代码位置:github

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetpack学习-6-Viewbinding使用及简单分析 的相关文章

  • Jetpack的学习

    一 ViewModel ViewModel的一个重要作用就是帮助Activity分担一部分的工作 xff0c 专门存放关于界面相关的数据 只要界面上能看到的数据 xff0c 都应该存放到ViewModel中 另外一个很重要的特性就是当手机屏
  • Viewbinding自动生成XML的一个对应绑定类

    当你在项目 Module 的build gradle中的android 中设置 buildFeatures viewBinding true 设置完sync一下 xff0c 然后会在项目中看到对应的XML文件的一个继承了ViewBindin
  • kotlin-android-extensions过时了,迁移到ViewBinding

    前言 回顾历史 xff0c kotlin android extensions插件让我们省去了很多findViewById的代码 xff0c 直接使用控件id操作控件 不过在Android Studio 4 1及以上IDE新建项目的时候 x
  • ViewBinding的用法

    1 启用Viewbinding功能 xff1a 在模块build gradle文件android节点下添加如下代码 android span class token punctuation span span class token pun
  • Android——ViewBinding总结

    ViewBinding 一旦启动了ViewBinding功能之后 xff0c Android Studio会自动为我们所编写的每一个布局文件都生成一个对应的Binding类 启用ViewBinding需要在app build gradle中
  • Android viewBinding让你告别findViewById和ButterKnife

    很久没有更新博客了 xff0c 不是因为别的 xff0c 就是懒 今天要分享的一个新技术 xff0c 从此告别定义一大串的UI控件变量 xff0c 再也不用写findViewById xff0c 也不需要依赖ButterKnife和写一堆
  • Jetpack-Compose-自定义绘制

    上节课我们简单的利用了一下自定义裁剪和自定义就能玩出如下简单案例 效果不错 这节课咋们来看看Compose自定义绘制能不能花里胡哨 一 Compose自定义 自定义 一个应用的可创造性往往离不开人们的千奇百怪想象和用户变化万千的需求 自定义
  • Jetpack Compose 从入门到入门(三)

    本篇开始介绍Jetpack Compose 中的修饰符Modifier 修饰符可以用来执行以下操作 xff1a 更改可组合项的大小 布局 行为和外观 添加信息 xff0c 如无障碍标签 处理用户输入 添加高级互动 xff0c 如使元素可点击
  • NVIDIA Jetson TX2 Jetpack 4.5.1 刷机 要点总结

    参考 xff1a Jetson TX2刷机Jetpack4 2 亲测成功版 linkJetson tx2 使用 jetpack 4 3刷机全过程link 注意 连接 TX2 和 host 电脑 usb c 线一定是信号线 xff0c 用信号
  • TX2(2): 安装JetPack L4T 3.1 (9003载板)

    参考官网教程 xff0c 其实官网教程已经挺详细 xff0c 主要看官网教程就行 http docs nvidia com jetpack l4t 3 1 index html developertools mobile jetpack l
  • Jetson查看JetPack版本(tool)

    Jetson查看JetPack版本 查看L4T版本 我的L4T版本为 32 5 1 在官网查找对应的jetpack版本 This page includes access to previously released versions of
  • Jetson tx2 安装jetpack_3.3手动安装cuda9.0,cudnn7.1

    1 刷机前的准备 xff08 写在前面的话 xff09 装有Ubuntu16 04或者Ubuntu18 04的电脑 xff0c 这里说的电脑可以是台式机也可以是笔记本与TX2区分开来 xff08 电脑是16 04或者18 04无所谓 xff
  • (Jetpack TX2)ubuntu上aarch64安装anaconda3

    1 在终端中输入sudo uname a可以查看ubuntu的信息 2 系统是aarch64 xff0c 它既不是64 Bit x86 也不是64 Bit Power8 and Power9 xff0c 所以使用anaconda官网 htt
  • TX2安装jetpack

    目前官网支持的下载为JetPack L4T 3 2 1 linux x64 b23和JetPack L4T 3 3 linux x64 b39 首先使用具有Ubuntu16 04的host主机 xff08 我使用的是个人笔记本 xff0c
  • Jetpack练手(04):Lifecycle

    文章目录 一 搭建布局二 非 Lifecycle 实现三 Lifecycle 实现四 Demo 效果 一 搭建布局 新建 LifecycleDemo 工程实现 界面停留时间计时 xff0c 在 activity main xml 搭建简单布
  • Jetpack学习之WorkManager

    绝大部分应用程序都有在后台执行任务的需求 根据需求的不同 Android为后台任务提供了多种解决方案 如JobScheduler Loader Service等 WorkManager为应用程序中那些不需要及时完成的任务提供了一个统一的解决
  • jetpack Compose 学习笔记

    目录 Modifier clickable 取消点击水波纹 LazyColum 相关 Modifier clickable 取消点击水波纹 modifier Modifier clickable onClick indication nul
  • jetpack compose 屏幕适配

    fun Int sdp Dp val screenDp Resources getSystem displayMetrics widthPixels Resources getSystem displayMetrics density re
  • Jetpack Compose多平台用于Android和IOS

    JetBrains和外部开源贡献者已经努力工作了几年时间来开发Compose Multiplatform 并最近发布了适用于iOS的Alpha版本 自然地 我们对其功能进行了测试 并决定通过使用该框架在iOS上运行我们的Dribbble复制
  • Android Jetpack 之 DataStore

    1 概述 Google 推出了 JetPack 的新成员 DataStore DataStore 是一种新的数据存储方案 DataStore 以异步 一致的事务方式存储数据 克服了 SharedPreferences 的一些缺点 Jetpa

随机推荐

  • Spring Boot Starter的面试题

    Spring Boot Starter的面试题 1 常见的starter会包几个方面的内容 xff1f 分别是什么 xff1f span class hljs comment 常见的starter会包括下面四个方面的内容 span span
  • 个人经历:谈一谈的程序员求职途径

    个人经历 xff1a 谈一谈的程序员求职途径 互联网招聘网站的确是五花八门 xff0c 种类繁多 xff0c 在投递简历 xff0c 接听面试电话的过程中 xff0c 要擦亮眼睛 xff0c 慎重选择和沟通 我是去年跳槽的 xff0c 下面
  • JVM调优再学习

    JVM调优再学习 堆大小设置 JVM中最大堆大小有三方面限制 xff1a 相关操作系统的数据模型 xff08 32 bit还是64 bit xff09 限制 xff1b 系统的可用虚拟内存限制 xff1b 系统的可用物理内存限制 32位系统
  • Dubbo源码学习基础

    dubbo源码学习基础 Dubbo源码学习基础Java RMI 基本概念在 Dubbo 中使用注解自定义容错策略正确加载MyFilter类Dubbo可扩展机制实战Dubbo的SPI机制自定义一个LoadBalance扩展Dubbo 外部化配
  • ubuntu中Terminal消失

    Terminal不见了 安装Python 3 6 在Ubuntu 16 04 LTS 版本 警告 xff1a 在根据下面文章操作之后 xff0c 电脑终端关上之后再也打不开 xff0c 因为同时修改了很多东西 xff0c 所以排查了好久才找
  • MacVim学习总结

    Emacs和Vim都是程序员专用编辑器 xff0c Emacs被称为神的编辑器 xff0c Vim则是编辑器之神 至于两者到底哪个更好用 xff0c 网络上两大派系至今还争论不休 不过 xff0c 相比之下 xff0c Emacs更加复杂
  • Passbook对应系统配置 Eclipse Tomcat配置JavaWeb项目部署 Sysdeo Eclipse Tomcat Launcher plugin

    在 Eclipse J2EE Juno 43 Tomcat 6 用Tomcat Plugin配置Tomcat 应用时 xff0c 不想Copy一堆 jar文件到应用的lib目录中 xff0c 应该可以用Activate DevLoader在
  • Ubuntu或CentOS下Python源码安装,以及需要的依赖包,pip修复安装

    准备环境 依赖包 span class token function sudo span span class token function apt get span y update span class token operator a
  • Seasar2 框架学习笔记

    基本Seasar2 Web应用工程结构 Seasar2这个框架在日本十分的流行 Seasar2其实就是类似于Spring的一个提供DI功能的开源框架 xff0c 但比Sping轻量级 并且同 其它轻量级容器 不同的是 xff0c 完全不需要
  • Struts Tiles框架,标签库详解<tiles:insert page="facebook.jsp" />

    Tiles框架为创建Web页面提供了一种模板机制 xff0c 它能将网页的布局和内容分离 它允许先创建模板 xff0c 然后在运行时动态地将内容插入到模板中 Tiles 框架建立在JSP的include指令的基础上 xff0c 但它提供了比
  • 解决:弹出“Building workspace has encountered a problem. Error 方法

    开发过程中常遇到这种情况 xff0c 在打开eclipse的时候 xff0c 弹出对话框 xff0c 提示 Building workspace has encountered a problem Errors during build 解
  • flexpaper实现文档的在线预览

    在把文档的格式转换成swf格式以后 xff0c 现在该实现在线的预览 在线预览的方法有两种方式 第一种 xff1a 通过flashpaper实现文档的在线预览 第二种是通过flexpaper实现文档的在线预览 在博客中用到的是第二种方法 在
  • MySql可视化工具MySQL Workbench使用教程

    1 MySQL Workbench MySQL Workbench 为数据库管理员 程序开发者和系统规划师提供可视化的Sql开发 数据库建模 以及数据库管理功能 2 MySQL Workbench 的下载和安装 xff08 1 xff09
  • MAC OS命令行使用详解

    原文地址 xff1a http www renfei org blog mac os x terminal 101 html 最近学习苹果认证的 Mac OS X Support Essentials 教程 xff0c 看到 Command
  • 理论: 图论(14):最大强连通图算法 tarjan

    最大强连通图定义 在有向图G中 xff0c 如果两个顶点间至少存在一条路径 xff0c 称两个顶点强连通 strongly connected 如果有向图G的每两个顶点都强连通 xff0c 称G是一个强连通图 非强连通图有向图的极大强连通子
  • 手机开发之三:CoreApp的深入分析

    四 xff0e CoreApp的深入分析 目前参考代码里面的CoreApp所完成的工作比较多且杂 xff0c 主要说来有如下几件事 a 系统组件初始化 xff1b b 开机Logo的显示 xff1b c Sim卡检测和Pin码校验 xff1
  • 阿里云上运行rabbitmq docker镜像无法远程访问rabbitmq management

    原连接https blog csdn net u012884074 article details 87346960
  • Maven+Mybatis实现数据库增删改查

    Maven 43 Mybatis实现数据库增删改查 1 新建一个普通的Maven项目 xff0c 在pom xml导入maven依赖 2 创建一个模块 在mybatis config xml编写mybatis的核心配置文件3 编写mybat
  • Redis 本身有持久化,为什么还要写进 MySQL?

    权限控制 MySQL 有权限控制 xff0c 用户可以精确到每个 IP 的每个账户 xff0c 目标可以精确到每个表的每个操作 Redis 则是天生设计成完全开放权限 xff0c 包括完全删除数据库的操作 xff0c 任何人都可以执行 要么
  • Jetpack学习-6-Viewbinding使用及简单分析

    Jetpack可以帮助开发者减少样板代码 而findviewbyId正是需要减少的样板代码 于是就有了ViewBinding 一开始我细看Jetpack的各个组件我是懵的 里面没有ViewBinding 这不好把它归纳到Jetpack系列中