Android框架 使用ViewBinding和ButterKnife

安卓大变天 ButterKnife被弃用:Resource IDs will be non-final in Android Gradle Plugin version 5.0 0.前言 最近,AndroidStudio升级到了4.1版本,在使用ButterKnife时,使用BindView注解给出了这样的提示:Resource IDs will be non-final in Android Gradle Plugin version 5.0,WTF?一个月改一次API的老谷歌又来坑开发者了??? 是的,在未来,所有的R.id.*都会变成变量,尽管不知道这样做是出于什么原因。 ButterKnife的作者也跳出来宣称,开发已经进入尾声,将不再更新并弃用,推荐我们使用 阅读详情

ButterKnife 10.2.3 Github 网站:
https://github.com/JakeWharton/butterknife

进入 github 网站就可以看到:
Attention: This tool is now deprecated. Please switch to view binding. Existing versions will continue to work, obviously, but only critical bug fixes for integration with AGP will be considered. Feature development and general bug fixes have stopped.

翻译:
现在不建议使用此工具。 请使用 viewBinding 。很明显,现有版本将继续起作用,但仅考虑与AGP集成的关键错误修复。 功能开发和常规错误修复已停止。

可以知道现在 ButterKnife 已经被 google 的 viewBinding 替代了。

一、 使用 ButterKnife

1. gradle 文件配置

gradle Modul

plugins {
    id 'com.jakewharton.butterknife'
}

android {
  ...
  // Butterknife requires Java 8.
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  implementation 'com.jakewharton:butterknife:10.2.3'
  annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
}

配置 gradle Project

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
    }
}
2. 使用注解来绑定资源

@BindView、@OnClick、 @BindString

public class MainActivity extends AppCompatActivity {
    //绑定View
    @BindView(R2.id.textView) TextView textView;
    @BindView(R2.id.button) Button button;
    @BindView(R2.id.button2) Button button2;

    //绑定String
    @BindString(R2.string.test_butter_knife) String str;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //github官方建议使用R2,所以资源有修改时要build项目
        ButterKnife.bind(this);

        textView.setText("测试 ButterKnife");
        button.setText("btn1");
        button2.setText("btn2");
    }

    //这里有点类似于:android:onClick="btnClick2"
    @OnClick({R2.id.button, R2.id.button2})
    public void btnClick(View view) {
        switch (view.getId()) {
            case R.id.button:
                Toast.makeText(this, "btn1", Toast.LENGTH_SHORT).show();
                break;
            case R.id.button2:
                Toast.makeText(this, "btn2", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    public void btnClick2(View view) {
        switch (view.getId()) {
            case R.id.button:
                Toast.makeText(this, "btn1", Toast.LENGTH_SHORT).show();
                break;
            case R.id.button2:
                Toast.makeText(this, "btn2", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}
3. 注入 ListView

发现其实也没多大的区别。

ListViewActivity.java

public class ListViewActivity extends AppCompatActivity {

    //绑定ListView
    @BindView(R2.id.list_view)
    ListView listView;

    //数据源
    private final String[] string = {"btn1", "btn2"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);

        ButterKnife.bind(this);

        listView.setAdapter(new ListViewAdapter(this, string));

        //设置点击事件
//        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//            @Override
//            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//                Toast.makeText(ListViewActivity.this, string[position], Toast.LENGTH_SHORT).show();
//            }
//        });
    }

    //使用ButterKnife绑定点击事件
    @OnItemClick(R2.id.list_view)
    //进入clickListViewItem方法查看,会发现onItemClick方法会根据参数类型自动匹配
    public void clickListViewItem(int position) {
        Toast.makeText(ListViewActivity.this, string[position], Toast.LENGTH_SHORT).show();
    }
}

ListViewAdapter.java

public class ListViewAdapter extends ArrayAdapter {

    private final Context mContext;
    private final String[] mStr;

    public ListViewAdapter(@NonNull Context context, @NonNull Object[] objects) {
        //自己设定资源convertView
        super(context, -1, objects);
        mContext = context;
        mStr= (String[]) objects;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        ViewHolder holder = null;
        if (convertView == null) {
             convertView = LayoutInflater.from(mContext).inflate(R.layout.list_view_item, parent, false);
            holder = new ViewHolder(convertView);
            //holder.textView = convertView.findViewById(R.id.tv_item);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.textView.setText(mStr[position]);
        return convertView;
    }

    static class ViewHolder {
        @BindView(R2.id.tv_item) TextView textView;

        public ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }
}
4. 注入 RecyclerView

RecyclerView 的使用流程参考:
https://blog.youkuaiyun.com/Blue3Red1/article/details/111673092

记得导入依赖文件

implementation 'androidx.recyclerview:recyclerview:1.1.0'

RecyclerViewActivity.java

public class RecyclerViewActivity extends AppCompatActivity {

    private final String[] strings = {"btn1", "btn2"};

    @BindView(R2.id.recycler_view) RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_view);
        ButterKnife.bind(this);

        RecyclerViewAdapter mAdapter = new RecyclerViewAdapter(this, strings);

        recyclerView.setAdapter(mAdapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        mAdapter.setOnItemClickListener( position -> {
            Toast.makeText(this, strings[position], Toast.LENGTH_SHORT).show();
        });
    }
}

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    private final Context mContext;
    private final String[] mData;

    private OnItemClickListener onItemClickListener;

    public RecyclerViewAdapter(Context context, String[] strings) {
        mContext = context;
        mData = strings;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.list_view_item, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.textView.setText(mData[position]);
        holder.textView.setOnClickListener(v -> {
            this.onItemClickListener.setItemClick(position);
        });
    }

    @Override
    public int getItemCount() {
        return mData.length;
    }

    static class MyViewHolder extends RecyclerView.ViewHolder {
        @BindView(R2.id.tv_item)
        TextView textView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    interface OnItemClickListener {
        void setItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }
}

发现使用了注解来绑定视图后,会出现以上的警告,其实也就是上面说的 ButterKnife 已经被弃用了,请使用 viewBinding.
在这里插入图片描述
以前还可以配合插件 ButterKnifeZelezny. 不过这玩意已经凉了,就不推荐使用了。

二、 视图绑定 viewBinding

视图绑定:https://developer.android.com/topic/libraries/view-binding#java
https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc

该功能需要在 Android Studio 3.6 Canary 11 及更高版本中才可用。
在大多数情况下,视图绑定会替代 findViewById。

1. 在 gradle Module 中配置:
android {
        //in Android Studio 4.0
        buildFeatures {
        	viewBinding = true
   		}	
}
2. 使用方法:

activity_main.xml

<TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

tools:viewBindingIgnore="true" //生成绑定类时忽略某个布局文件

为某个模块启用视图绑定功能后,系统会为该模块中包含的每个 XML 布局文件生成一个绑定类。
例如:activity_main.xml就会生成为 ActivityMainBinding类

Activity 中使用

private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        
        setContentView(view);//getBinding在setContentView之前

		//binding.name 对应 xml TextView 的 ID
		binding.name.setText("viewBinding测试");
    }

Fragment 中使用

    private ActivityMainBinding binding;

    @Override
    public View onCreateView (LayoutInflater inflater,
                              ViewGroup container,
                              Bundle savedInstanceState) {
        binding = ActivityMainBinding.inflate(inflater, container, false);
        View view = binding.getRoot();
        return view;
    }
	//inflate() 方法会要求您传入布局膨胀器。如果布局已膨胀,您可以调用绑定类的静态 bind() 方法。
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
    
3. 注入 RecyclerView

以上 ListView RecyclerView 中使用 ButterKnife 的视图,可以使用 ViewBinding 来替代。

public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.MyViewHolder> {

    private final Context mContext;

    public MovieAdapter(Context mContext) {
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        MovieDoubleItemBinding doubleItemBinding = MovieDoubleItemBinding
                .inflate(LayoutInflater.from(parent.getContext()), parent, false);
        return new MyViewHolder(doubleItemBinding);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
		List<Result.MoviesBean> movies = mData.getMovies().get(position);
        holder.bindFilmName(movies.getTitle());
    }

    @Override
    public int getItemCount() {
        return mData.getCount()-1;
    }

    static class MyViewHolder extends RecyclerView.ViewHolder {
    
		private MovieDoubleItemBinding doubleItemBinding;
		private TextView filmName;
		 
        public MyViewHolder(MovieDoubleItemBinding doubleItemBinding) {
            super(doubleItemBinding.getRoot());
         	this.doubleItemBinding = doubleItemBinding;
         	filmName = doubleItemBinding.tvFilmName;
        }
		
		public void bindFilmName(String s) {
            filmName.setText(s);
        }
    }
}
4. 与 findViewById 的区别

在这里插入图片描述
与使用 findViewById 相比,视图绑定具有一些很显著的优点:

  • Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用 @Nullable 标记。
  • 类型安全:每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。

这些差异意味着布局和代码之间的不兼容将会导致构建在编译时(而非运行时)失败。

5. 与数据绑定的对比

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

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

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

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

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

Android视图绑定ViewBinding的使用 Android Jetpack ViewBinding的使用 1. ViewBinding概述 使用ViewBinding的目的是轻松地编写可与视图交互的代码。将view和代码绑定在一起有多种方法: (1)findViewById:编译不安全,出现大量模版,并且存在类型转换问题。 (2)ButterKnife:编译速度慢,不安全,存在类型转换问题 (3)Kotlin Android Extensions:存在安全问题,谷歌已经不建议使用Kotlin Android扩展,这意味着不再支持使用Kot. 阅读详情

相关推荐

【驭风计划 机器学习】实验6 基于集成学习的 Amazon 用户评论质量预测

¶随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的评论质量参差不齐,甚至有水军刷好评或者恶意差评的情况出现,严重影响了顾客的购物体验。因此,对于评论质量的预测成为电商平台越来越关注的话题,如果能自动对评论质量进行评估,就能根据预测结果避免展现低质量的评论。本案例中我们将基于集成学习的方法对 Amazon 现实场景中的评论质量进行预测。

Mege1的博客 473

Android Butterknife(黄油刀) 使用方法总结

转载请标明出处:http://blog.csdn.net/donkor_/article/details/77879630 前言: ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWharton的力作,目前使用很广。最重要的一点,使用Butter...

Sahara_Savage 8万+

非root用户如何在CentOS7集群上编译安装OpenFOAM6

本文详细介绍了在CentOS7集群上以非root用户身份编译安装OpenFOAM6的完整流程。通过环境准备、依赖包离线获取、源码编译安装等步骤,解决了集群环境下权限和依赖问题,特别针对OpenMPI和Boost库提供了优化配置建议,帮助用户高效完成安装并优化性能。

weixin_28826961的博客 681

Android View绑定框架——ButterKnife & Viewbinding

ButterKnife 是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单。 地址 https://github.com/JakeWharton/butterknife 下载 android {

特立独行的博客 3198

Windows游戏玩家必看:用Process Lasso优化CPU优先级和核心绑定,告别卡顿

本文为Windows游戏玩家详细介绍了如何使用Process Lasso优化系统性能。通过设置CPU优先级和核心绑定,可以智能管理进程资源,确保游戏获得最高调度权限,有效减少因后台程序干扰或Windows调度机制不完善导致的卡顿与帧数波动,从而提升游戏流畅度与稳定性。

weixin_29299807的博客 2218

保姆级教程:手把手教你下载和配置Waymo自动驾驶数据集(附百度网盘链接)

本文提供了一份详细的Waymo自动驾驶数据集下载和配置指南,特别针对国内研究者优化了数据获取方案,包括百度网盘链接和Google Cloud CLI配置。文章还涵盖了环境配置、数据处理实战、可视化分析以及进阶技巧,帮助开发者高效利用这一业界黄金标准数据集进行自动驾驶研究。

weixin_42651281的博客 364

JetPack知识点实战系列十四:View Binding替代ButterKnife和Kotlin synthetics

解决findViewById的忧伤 在早期的Android开发中,我们都是通过一系列的findViewById去找到XML Layout文件中的View。当XML文件中View特别多的情况下,这样的写法非常的繁琐。 主要有如下几种方式可以解决这个问题: ButterKnife:使用这个库,我们可以通过注解的方式非常方便进行View的绑定和处理Click事件。 Kotlin Android Extensions sythentics:它是一个Kotlin插件,使用它可以非常方便的在Activities, F

lcl130的专栏 1285

Intellij IDEA 使用教程(一)Jdk安装和配置

一.JDK下载 这里下载的是Java SE 8u181 64位版本。可以根据自己电脑配置来选择不同版本。 官网下载JDK 二.安装JDK 双击运行jdk-8u181-windows-x64.exe安装程序 选择安装目录,然后点击下一步 等待安装 安装JRE,就是java的运行环境,可以安装在java目录下 等待安装 安装完成。点击关闭。 三.java环境变量配置 关于环境变量的配置,...

岁月不饶人,我亦未曾饶过岁月 4059

Android ButterKnife的实现(注解+反射)

Android ButterKnife的实现(注解+反射)

ChenYiRan123456的博客 1913

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用

背景模糊 是一个很实用的功能,它可以帮助游戏在视觉上有更好的专注力和表现力。 实现模糊的种类和方式有很多种,大家自行选择适合自己的就可以了。 下面一起来看下本文实现背景模糊的效果和使用方式吧!

努力前行,总会成为自己心中的那道光 4万+

基于STM32、HAL库的MPX5500DP气压传感器 驱动程序设计

define MPX5500DP_MIN_VOLTAGE 0.2f // 最小输出电压(V)#define MPX5500DP_MAX_VOLTAGE 4.7f // 最大输出电压(V)#define MPX5500DP_MIN_PRESSURE 0.0f // 最小压力(kPa)#define MPX5500DP_MAX_PRESSURE 500.0f // 最大压力(kPa)* @brief 读取压力值(kPa)// 计算压力值 (线性转换)

corlin6688的博客 196

安卓:视图绑定——ButterKnife

ButterKnife 是一个由 Jake Wharton 开发的 Android 视图绑定框架。它通过使用注解来简化 Android 中的视图绑定操作,减少了手动编写繁琐的 findViewById() 代码的工作量。@Override// 自定义绑定逻辑。

A125679880的博客 1186

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

算法大师! 720

谈谈Android AOP技术方案

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

2401_84520457的博客 770

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

字节面试官,谈谈Android AOP技术方案,2024年Android工作或更难找

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示。本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

881

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ButterKnife被弃用,ViewBinding才是findView的未来?

最近Android Studio更新到了4.1版本,发现项目中使用ButterKnife注解id的代码出现了警告,警告信息如下: Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them as annotation attributes 从警告信息中可以看到在Gradle 5.0的插件中Resource 的Id值将不会再是final类型,因此应该避免在注解属性中使用Id。这意味着当我们把Gr

smily的博客 6091

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

安卓findViewById 的优化方案:ViewBinding与ButterKnife(一)

安卓findViewById 的优化方案:ViewBinding与ButterKnife(一)

u013083465的专栏 1929

Android viewBinding让你告别findViewById和ButterKnife

很久没有更新博客了,不是因为别的,就是懒。今天要分享的一个新技术,从此告别定义一大串的UI控件变量,再也不用写findViewById,也不需要依赖ButterKnife和写一堆@BindView().听说这一消息,不知道大家有没有觉得很爽,反正我是觉得很香。那么下面就开始介绍一下viewBind。 一、使用viewBinding 1.首先在你想要使用viewBin...

Xsinwa的博客 1484

Android ViewBinding使用及原理

Android ViewBinding使用及原理 一、定义 ViewBinding主要是Google用来findViewById的,作用跟Butterknife差不多。只不过Butterknife是通过扫描注解生成相应代码,而ViewBinding是通过扫描layout布局文件生成相应代码。而且ViewBinding是Google开发,深度集成在idea上。 二、使用 在模块build.gradle文件中添加配置: android { ... viewBinding{ ena

feng海涛 4683

Android - ViewBinding学习使用

枯燥又没什么意义,因此针对这个问题也出了很多开源库来解决,例如:Butter Knife(黄油刀)。插件,当时用的时候真是感觉像发现了新大陆一样,非常好用。功能之后,Android Studio会自动为我们所编写的每一个布局文件都生成一个对应的Binding类。之间进行绑定,并不算是非常方便。但是,当你的gradle升级到新版本的时候,会显示下面的提示。标签引入的布局在某些情况下可以减少一层布局的嵌套,而更少的布局嵌套通常就意味着更高的效率。进行重命名处理,而且经常会引用错误的布局文件,导致运行崩溃。

孔小乐的博客 1953

ButterKnife到ViewBinding的迁移指南与最佳实践

在Android开发中,视图绑定技术经历了从ButterKnife到ViewBinding的演进。ButterKnife曾通过编译时注解极大简化了findViewById操作,但随着AGP升级和R8编译器的普及,其兼容性问题日益凸显。ViewBinding作为官方推荐的替代方案,提供了类型安全和空安全等优势,同时避免了运行时开销。本文重点解析如何从ButterKnife平滑迁移到ViewBinding,涵盖环境配置、代码转换、性能优化等关键步骤,并分享与Jetpack组件整合的进阶技巧,帮助开发者构建更健壮

weixin_30613727的博客 364

秒懂Android开发之ViewBinding,一代神器ButterKnife的终结者

概述 Android大神 JakeWharton 开发的一代神器 ButterKnife 即将落幕了。怎么回事呢?就是因为View Binding 的横空出世。在那个满屏都是findViewById的蛮荒年代,JakeWharton 大神给我们送来了神器ButterKnife,使我们从石器时代进化到了青铜时代,这次ViewBinding是不是又将使我们跨越到一个时代,俗话说就是又简单了,估计再过1...

ShuSheng007的程序人生 8088

安卓ViewBinding详解

2019年Google I/O大会上公布的一款Android视图绑定工具:ViewBinding。使用方式类似DataBinding,但相比DataBinding,ViewBinding是一个更轻量级、更纯粹的findViewById的替代方案。注意:ActivityMainBinding是根据布局文件activity_main.xml来生成的。链接:https://www.jianshu.com/p/3e45839074b3。目前从事编程教学,软件开发指导,软件类毕业设计指导。这样的命名方式即可。

chuyouyinghe的专栏 1739

优雅地封装和使用 ViewBinding,该替代 Kotlin synthetic 和 ButterKnife 了

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。【Android思维脑图(技能树)】知识不体系?

2401_84122760的博客 370

Android App封装 —— ViewBinding

ViewBinding相比优点还是很多的,解决了安全性问题和兼容性问题,所以我们可以放心大胆的使用。项目源码地址:相关链接:Android App封装 ——架构(MVI + kotlin + Flow)作者:剑冲链接:https://juejin.cn/post/7177673339517796413如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。

datian1234的博客 2982
上一篇: Android数据库 GreenDao简单使用
下一篇: AndroidStudio插件 GsonFormatPlus使用
3Blue1Red
博客等级 码龄7年 7粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值