电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android Studio 3.6中使用視圖綁定替代 findViewById的方法

瀏覽:81日期:2022-09-26 16:57:49

Android Studio 3.6中使用視圖綁定替代 findViewById的方法

從 Android Studio 3.6 開始,視圖綁定能夠通過生成綁定對象來替代 findViewById,從而可以幫您簡化代碼、移除 bug,并且從 findViewById 的模版代碼中解脫出來。

本文梗概

在 build.gradle 中就可以方便快捷地開啟視圖綁定且無須額外引入依賴庫 視圖綁定會為 Module 中的每一個布局文件生成一個綁定對象 (activity_awesome.xml → ActivityAwesomeBinding.java) 布局文件中每一個帶有 id 的視圖都會在綁定對象中有一個對應的屬性,這個屬性將擁有正確的類型,并且空安全 視圖綁定完美支持 Java 和 Kotlin 編程語言

騰訊視頻鏈接

https://v.qq.com/x/page/h0931mdo8ly.html

Bilibili 視頻鏈接

https://www.bilibili.com/video/av95393509/

在 build.gradle 中開啟視圖綁定

開啟視圖綁定無須引入額外依賴,從 Android Studio 3.6 開始,視圖綁定將會內(nèi)建于 Android Gradle 插件中。需要打開視圖綁定的話,只需要在 build.gradle 文件中配置 viewBinding 選項:

// 需要 Android Gradle Plugin 3.6.0android { viewBinding { enabled = true }}

在 Android Studio 4.0 中,viewBinding 變成屬性被整合到了 buildFeatures 選項中,所以配置要改成:

// Android Studio 4.0android { buildFeatures { viewBinding = true }}

配置完成后,視圖綁定就會為所有布局文件自動生成對應的綁定類。無須修改原有布局的 XML 文件,視圖綁定將根據(jù)您現(xiàn)有的布局自動完成所有工作。

視圖綁定將會根據(jù)現(xiàn)有的 XML 文件,為 Module 內(nèi)所有的布局文件生成綁定對象。

您可以在任何需要填充布局的地方使用綁定對象,比如 Fragment、Activity、甚至是 RecyclerView Adapter(或者說是 ViewHolder 中)。

在 Activity 中使用視圖綁定

假如您有一個布局文件名叫 activity_awesome.xml,其中包含了一個按鈕和兩個文本視圖。視圖綁定會為這個布局生成一個名叫 ActivityAwesomeBinding 的類,布局文件中所有擁有 id 的視圖,都會在這個類中有一個對應的屬性:

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = ActivityAwesomeBinding.inflate(layoutInflater) binding.title.text = 'Hello' binding.subtext.text = 'Concise, safe code' binding.button.setOnClickListener { /* ... */ } setContentView(binding.root)}

△ 在 Activity 中使用視圖綁定

使用視圖綁定時,無須再調(diào)用 findViewById 方法,只要直接調(diào)用綁定對象中的對應屬性即可。

布局的根視圖(無論有沒有 id)都會自動生成一個名為 root 的屬性。在 Activity 的 onCreate 方法中,要將 root 傳入 setContentView 方法,從而讓 Activity 可以使用綁定對象中的布局。

一個常見的錯誤用法是: 在開啟了視圖綁定的同時,依然在 setContentView(...) 中傳入布局的 id 而不是綁定對象。這將造成同一布局被填充兩次,同時監(jiān)聽器也會被添加到錯誤的布局對象中。

解決方案: 在 Activity 中使用視圖綁定時,一定要將綁定對象的 root 屬性傳入 setContentView() 方法中。

使用綁定對象編寫安全性更佳的代碼

findViewById 是許多用戶可見 bug 的來源: 我們很容易傳入一個布局中根本不存在的 id,從而導致空指針異常而崩潰;由于此方法類型不安全,也很容易使人寫出像 findViewById<TextView>(R.id.image) 這樣的,導致類型轉換錯誤的代碼。為了解決這些問題,視圖綁定把 findViewById 替換成了更加簡潔和安全的實現(xiàn)。

視圖綁定有下面兩個特性:

類型安全: 因為視圖綁定總是會基于布局中的視圖生成類型正確的屬性。所以如果您在布局中放入了一個 TextView ,視圖綁定就會暴露一個 TextView 類型的屬性給您。 空安全: 視圖綁定會檢測某個視圖是不是只在一些配置下存在,并依據(jù)結果生成帶有 @Nullable 注解的屬性。所以即使在多種配置下定義的布局文件,視圖綁定依然能夠保證空安全。

由于生成的綁定類是普通的 Java 類,并且其中添加了 Kotlin 友好的注解,所以 Java 和 Kotlin 都可以使用視圖綁定。

視圖綁定生成的代碼是怎樣的

如前文所說,視圖綁定會生成一個包含替代 findViewById 功能的 Java 類。它會為 Module 下的每一個布局的 XML 文件生成一個對應的綁定對象,并根據(jù)源文件為其命名,比如 activity_awesome.xml 對應的綁定對象為 ActivityAwesomeBinding.java。

生成代碼的邏輯被優(yōu)化為,當您在 Android Studio 中編輯 XML 布局文件時,只會更新所修改布局對應的綁定對象。同時這些工作會在內(nèi)存中運行,從而使這個過程可以迅速完成。這意味著您的修改會立即反映在綁定對象中,而無須等待或者重新構建工程。

Android Studio 被優(yōu)化為可以在您編輯過 XML 布局文件后立即更新綁定對象。

讓我們通過一個示例 XML 布局所生成的代碼,來了解一下視圖綁定究竟生成了什么。

public final class ActivityAwesomeBinding implements ViewBinding { @NonNull private final ConstraintLayout rootView; @NonNull public final Button button; @NonNull public final TextView subtext; @NonNull public final TextView title;

△ 視圖綁定生成的屬性。可以看到它們都是類型安全以及空安全的

視圖綁定會根據(jù)每個擁有 id 的視圖生成類型正確的屬性。他也會為根布局生成 rootView 屬性并通過 getRoot 暴露給您。視圖綁定沒有添加任何額外的邏輯,他只是把視圖屬性暴露給您,從而幫您在不使用 findViewById 的情況下也能調(diào)用它們。這樣一來便保證了生成文件簡潔性(當然也避免了拖慢構建速度)。

如果您正在使用 Kotlin,視圖綁定的生成類也已經(jīng)對互操作進行了優(yōu)化。通過 @Nullable 和 @NonNull 注解的使用,Kolin 可以正確的將屬性暴露為空安全類型。如果想要了解更多關于兩種語言的互操作問題,請查閱文檔: 在 Kotlin 中調(diào)用 Java。

private ActivityAwesomeBinding(@NonNull ConstraintLayout rootView, @NonNull Button button, @NonNull TextView subtext, @NonNull TextView title) { … } @NonNull public static ActivityAwesomeBinding inflate(@NonNull LayoutInflater inflater) { /* 編輯過: 移除了重載方法 inflate(inflater, parent, attachToParent) 的調(diào)用*/ View root = inflater.inflate(R.layout.activity_awesome, null, false); return bind(root); }

視圖綁定會生成 inflate 方法作為生成一個綁定對象實例的主要方式。在 ActivityAwesomeBinding.java 中,視圖綁定生成了一個只有一個參數(shù)的 inflate 方法,該方法通過將 parent 設定為空值來指定當前視圖不會綁定到父視圖中;視圖綁定也暴露了一個有三個參數(shù)的 inflate 方法,來讓您在需要的時候傳入 parent 和 attachToParent 參數(shù)。

真正神奇的地方是 bind 方法的調(diào)用。這里會填充視圖并綁定所有的屬性,同時做一些錯誤檢測并生成清晰的錯誤提示。

@NonNull public static ActivityAwesomeBinding bind(@NonNull View rootView) { /* 編輯: 簡化代碼 ? 真實情況下生成的代碼是一個優(yōu)化過的版本 */ Button button = rootView.findViewById(R.id.button); TextView subtext = rootView.findViewById(R.id.subtext); TextView title = rootView.findViewById(R.id.title); if (button != null && subtext != null && title != null) { return new ActivityAwesomeBinding((ConstraintLayout) rootView, button, subtext, title); } throw new NullPointerException('Missing required view […]'); }

△ 自動生成的 bind 方法的簡化版本

bind 是綁定對象中最復雜的一個方法,它通過調(diào)用 findViewById 來綁定每個視圖。既然編譯器可以通過 XML 布局文件知道每個屬性的類型和為空的可能性,那他就可以安全的調(diào)用 findViewById。

請注意,視圖綁定生成的真正的 bind 方法要來的更長,并且其中使用了一個標記 break 語句來優(yōu)化字節(jié)碼,您可以查看 Jake Wharton 撰寫的這篇文章來了解更多優(yōu)化有關的內(nèi)容。在每個綁定對象中,都會暴露三個靜態(tài)方法來創(chuàng)建綁定對象實例,下面是每個方法使用場景的簡要說明:

inflate(inflater) -- 在例如 Activity onCreate 方法里,這類沒有父視圖需要被傳入的場合使用 inflate(inflater, parent, attachToParent) -- 在 Fragment 或 RecyclerView Adapter (或者說 ViewHolder 中) ,這類您需要傳遞父級 ViewGroup 給綁定對象時使用。 bind(rootView) -- 在您已經(jīng)獲得對應視圖,并且只想通過視圖綁定來避免使用 findViewById 時使用。這個方法在使用視圖綁定改造和重構現(xiàn)有代碼時非常有用。

示例 XML 布局https://gist.github.com/objcode/3ee41edae40ba13f13da569b8f27333a在 Kotlin 中調(diào)用 Javahttps://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-typesJake Wharton 撰寫的這篇文章https://jakewharton.com/optimizing-bytecode-by-manipulating-source-code/

對使用 <include> 標簽引入的布局會發(fā)生什么影響

前面已經(jīng)講過,視圖綁定會為 Module 下的每一個布局文件生成一個綁定對象,這個說法在布局文件被另一個布局文件使用 <include> 引入時依然適用。

<!-- activity_awesome.xml --><androidx.constraintlayout.widget.ConstraintLayout> <include android: layout='@layout/included_buttons'</androidx.constraintlayout.widget.ConstraintLayout><!-- included_buttons.xml --><androidx.constraintlayout.widget.ConstraintLayout> <Button android: /></androidx.constraintlayout.widget.ConstraintLayout>

△ 視圖綁定中使用 include 標簽的示例

注意: include 標簽下有一個 id。

在使用引入布局的時候,視圖綁定會創(chuàng)建一個被引入布局綁定對象的引用。注意 <include> 標簽有一個 id: android:id='@+id/includes'。這里的邏輯跟使用普通視圖一樣, <include> 標簽也需要有一個 id 才能在綁定對象中生成對應的屬性。

include 標簽必須有一個 id,才能生成對應的屬性。

public final class ActivityAwesomeBinding implements ViewBinding { ... @NonNull public final IncludedButtonsBinding includes;

視圖綁定會在 ActivityAwesomeBinding 中生成一個 IncludedButtonsBinding 的引用。

結合數(shù)據(jù)綁定來使用視圖綁定

視圖綁定只是 findViewById 的取代方案,如果您希望在 XML 中自動綁定視圖,可以使用數(shù)據(jù)綁定庫。數(shù)據(jù)綁定和視圖綁定可以生成同樣的組件,它們可以同時工作。

在兩者都被開啟時,使用 <layout> 標簽的布局會由數(shù)據(jù)綁定來生成綁定對象;而其余的布局則由視圖綁定生成綁定對象。

您可以在同一 Module 中同時使用數(shù)據(jù)綁定和視圖綁定。

我們之所以開發(fā)視圖綁定作為數(shù)據(jù)綁定的補充,是因為許多開發(fā)者反映說,希望有一個輕量的解決方案,能在數(shù)據(jù)綁定之外替代 findViewById——視圖綁定提供的正是這一功能。

數(shù)據(jù)綁定https://developer.android.google.cn/topic/libraries/data-binding

視圖綁定對比 Kotlin 合成方法與 ButterKnife

關于視圖綁定,一個最常見的問題是: '我是否應該用視圖綁定替代 Kotlin 合成方法或 ButterKnife ? ' 二者都是目前十分成功的組件庫,有許多應用使用它們解決 findViewById 的問題。

對于大多數(shù)應用來說,我們推薦嘗試使用視圖綁定來替代這兩個庫,因為視圖綁定可以提供更加安全和準確的視圖映射方式。

Android Studio 3.6中使用視圖綁定替代 findViewById的方法

△ 視圖綁定空安全、只引用當前布局中的視圖、支持 Java 和 Kotlin,同時也更簡潔

上圖為對比視圖綁定、ButterKnife 和 Kotlin 合成方法的功能。

雖然 ButterKnife 會在運行時校驗可空與不可空,但是編譯器并不會檢查您匹配的視圖是否在存在于您的布局之中。

為了安全性與更簡潔代碼,我們推薦嘗試使用視圖綁定。

總結

到此這篇關于Android Studio 3.6中使用視圖綁定替代 findViewById的方法的文章就介紹到這了,更多相關使用視圖綁定替代 findViewById內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Android
相關文章:
主站蜘蛛池模板: 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | 艺术漆十大品牌_艺术涂料加盟代理_蒙太奇艺术涂料厂家品牌|艺术漆|微水泥|硅藻泥|乳胶漆 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 中式装修设计_全屋定制家具_实木仿古门窗花格厂家-喜迎门 | 无线遥控更衣吊篮_IC卡更衣吊篮_电动更衣吊篮配件_煤矿更衣吊篮-力得电子 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 悬浮拼装地板_篮球场木地板翻新_运动木地板价格-上海越禾运动地板厂家 | 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | 自动螺旋上料机厂家价格-斗式提升机定制-螺杆绞龙输送机-杰凯上料机 | HDPE储罐_厂家-山东九州阿丽贝防腐设备| 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 旋转气浴恒温振荡器-往复式水浴恒温振荡器-金怡百科 | 拉伸膜,PE缠绕膜,打包带,封箱胶带,包装膜厂家-东莞宏展包装 | 质检报告_CE认证_FCC认证_SRRC认证_PSE认证_第三方检测机构-深圳市环测威检测技术有限公司 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 电子海图系统-电梯检验系统-智慧供热系统开发-商品房预售资金监管系统 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | crm客户关系管理系统,销售管理系统,crm系统,在线crm,移动crm系统 - 爱客crm | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 电梯乘运质量测试仪_电梯安全评估测试仪-武汉懿之刻 | 全自动变压器变比组别测试仪-手持式直流电阻测试仪-上海来扬电气 | 井式炉-台车式回火炉-丹阳市电炉厂有限公司 | 服务器之家 - 专注于服务器技术及软件下载分享 | 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 液氮罐_液氮容器_自增压液氮罐-北京君方科仪科技发展有限公司 | 超声波焊接机_超音波熔接机_超声波塑焊机十大品牌_塑料超声波焊接设备厂家 | 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 石栏杆_青石栏杆_汉白玉栏杆_花岗岩栏杆 - 【石雕之乡】点石石雕石材厂 | 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 江西自考网-江西自学考试网| 金属抛光机-磁悬浮抛光机-磁力研磨机-磁力清洗机 - 苏州冠古科技 | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 | 手持气象站_便携式气象站_农业气象站_负氧离子监测站-山东万象环境 | 合肥仿石砖_合肥pc砖厂家_合肥PC仿石砖_安徽旭坤建材有限公司 |