日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

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

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

從 Android Studio 3.6 開始,視圖綁定能夠通過(guò)生成綁定對(duì)象來(lái)替代 findViewById,從而可以幫您簡(jiǎn)化代碼、移除 bug,并且從 findViewById 的模版代碼中解脫出來(lái)。

本文梗概

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

騰訊視頻鏈接

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

Bilibili 視頻鏈接

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

在 build.gradle 中開啟視圖綁定

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

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

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

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

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

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

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

在 Activity 中使用視圖綁定

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

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 中使用視圖綁定

使用視圖綁定時(shí),無(wú)須再調(diào)用 findViewById 方法,只要直接調(diào)用綁定對(duì)象中的對(duì)應(yīng)屬性即可。

布局的根視圖(無(wú)論有沒(méi)有 id)都會(huì)自動(dòng)生成一個(gè)名為 root 的屬性。在 Activity 的 onCreate 方法中,要將 root 傳入 setContentView 方法,從而讓 Activity 可以使用綁定對(duì)象中的布局。

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

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

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

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

視圖綁定有下面兩個(gè)特性:

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

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

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

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

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

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

讓我們通過(guò)一個(gè)示例 XML 布局所生成的代碼,來(lái)了解一下視圖綁定究竟生成了什么。

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;

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

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

如果您正在使用 Kotlin,視圖綁定的生成類也已經(jīng)對(duì)互操作進(jìn)行了優(yōu)化。通過(guò) @Nullable 和 @NonNull 注解的使用,Kolin 可以正確的將屬性暴露為空安全類型。如果想要了解更多關(guān)于兩種語(yǔ)言的互操作問(wèn)題,請(qǐng)查閱文檔: 在 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) { /* 編輯過(guò): 移除了重載方法 inflate(inflater, parent, attachToParent) 的調(diào)用*/ View root = inflater.inflate(R.layout.activity_awesome, null, false); return bind(root); }

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

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

@NonNull public static ActivityAwesomeBinding bind(@NonNull View rootView) { /* 編輯: 簡(jiǎn)化代碼 ? 真實(shí)情況下生成的代碼是一個(gè)優(yōu)化過(guò)的版本 */ 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 […]'); }

△ 自動(dòng)生成的 bind 方法的簡(jiǎn)化版本

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

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

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

示例 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/

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

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

<!-- 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 標(biāo)簽的示例

注意: include 標(biāo)簽下有一個(gè) id。

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

include 標(biāo)簽必須有一個(gè) id,才能生成對(duì)應(yīng)的屬性。

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

視圖綁定會(huì)在 ActivityAwesomeBinding 中生成一個(gè) IncludedButtonsBinding 的引用。

結(jié)合數(shù)據(jù)綁定來(lái)使用視圖綁定

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

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

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

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

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

視圖綁定對(duì)比 Kotlin 合成方法與 ButterKnife

關(guān)于視圖綁定,一個(gè)最常見(jiàn)的問(wèn)題是: '我是否應(yīng)該用視圖綁定替代 Kotlin 合成方法或 ButterKnife ? ' 二者都是目前十分成功的組件庫(kù),有許多應(yīng)用使用它們解決 findViewById 的問(wèn)題。

對(duì)于大多數(shù)應(yīng)用來(lái)說(shuō),我們推薦嘗試使用視圖綁定來(lái)替代這兩個(gè)庫(kù),因?yàn)橐晥D綁定可以提供更加安全和準(zhǔn)確的視圖映射方式。

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

△ 視圖綁定空安全、只引用當(dāng)前布局中的視圖、支持 Java 和 Kotlin,同時(shí)也更簡(jiǎn)潔

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

雖然 ButterKnife 會(huì)在運(yùn)行時(shí)校驗(yàn)可空與不可空,但是編譯器并不會(huì)檢查您匹配的視圖是否在存在于您的布局之中。

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

總結(jié)

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

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91精品视频一区二区| 麻豆视频观看网址久久| 精品一二三区| 国产精品v一区二区三区| 日本视频中文字幕一区二区三区| 精品一区欧美| 色老板在线视频一区二区| 日韩电影免费网站| 亲子伦视频一区二区三区| 精品日韩视频| 久久三级福利| 亚洲精品97| 免费看黄色91| 奇米色欧美一区二区三区| 日韩有吗在线观看| 国产亚洲高清一区| 美女视频免费精品| 日韩精品诱惑一区?区三区| 欧美成人a交片免费看| 欧美在线观看视频一区| 99亚洲视频| 亚洲精品看片| 国产欧美一区二区三区精品观看| 日本欧美在线| 国产精品国码视频| 日韩成人精品一区二区| 日韩成人高清| 亚洲一区网站| 欧美视频精品全部免费观看| 精品国产乱码久久久久久1区2匹| 精品亚洲二区| 成人羞羞在线观看网站| 国产亚洲高清视频| 亚洲另类av| 美女毛片一区二区三区四区最新中文字幕亚洲 | 国产亚洲欧洲| 99日韩精品| 蜜臀国产一区二区三区在线播放| 亚洲一区区二区| 欧美日韩在线精品一区二区三区激情综合 | 美女久久久久| 美女精品在线| 国产精品毛片久久久| 精品久久美女| 久久要要av| 亚洲综合激情在线| 欧美91在线|欧美| 99精品在线| 日韩一区二区三区精品| 久久这里只有精品一区二区| 日韩在线观看不卡| 午夜天堂精品久久久久| 国产成人1区| 激情91久久| 久久超碰99| 好看不卡的中文字幕| 国产日韩欧美| 欧美+日本+国产+在线a∨观看| 免费不卡中文字幕在线| 奇米狠狠一区二区三区| av亚洲一区二区三区| 日本一区免费网站| 日韩国产一区| 日韩精品免费视频一区二区三区| 国产日韩精品视频一区二区三区| 成人台湾亚洲精品一区二区| 亚洲黄页一区| 久久这里只有精品一区二区| 欧美日韩精品免费观看视频完整| 国产日产精品一区二区三区四区的观看方式 | 在线手机中文字幕| 欧美精品一二| 国产欧美日韩亚洲一区二区三区| 亚洲人成在线网站| 青青国产精品| 欧美一区=区| 日韩欧美在线中字| 国产午夜久久av| 每日更新成人在线视频| bbw在线视频| 亚洲精品女人| 91精品国产成人观看| 国产精品jk白丝蜜臀av小说| 日韩精品一级二级| 99tv成人| 综合日韩av| 国产精品久久乐| 亚洲资源在线| 欧美日韩国产精品一区二区亚洲| 国产欧美91| 午夜亚洲精品| 久久影视一区| 97国产成人高清在线观看| 日韩精品福利一区二区三区| 黄页网站一区| 电影亚洲精品噜噜在线观看| 国产极品一区| 日本在线成人| 免费人成在线不卡| 伊人精品在线| 久久久久蜜桃| 五月激情久久| 国产+成+人+亚洲欧洲在线| 欧美亚洲福利| 亚洲精品乱码久久久久久蜜桃麻豆| 成人羞羞视频播放网站| 国产精品久久久免费| 人人爱人人干婷婷丁香亚洲| 免费看欧美美女黄的网站| 精品91久久久久| 在线一区视频观看| 欧美天堂视频| 中国字幕a在线看韩国电影| 国产极品久久久久久久久波多结野| 99国产成+人+综合+亚洲欧美| 国产一区国产二区国产三区| 国产精品一区毛片| 青青草国产精品亚洲专区无| 亚洲精品观看| 亚洲精品福利| 在线精品福利| 亚洲tv在线| 日韩一区二区三免费高清在线观看| 黄色亚洲大片免费在线观看| av亚洲在线观看| 99久久九九| 午夜影院欧美| 午夜一级在线看亚洲| 石原莉奈在线亚洲三区| 亚洲欧美激情诱惑| 中文一区一区三区免费在线观 | 国产视频亚洲| 午夜国产精品视频| 欧美日韩激情| 国产亚洲欧洲| 亚洲久久视频| 日本91福利区| 91精品麻豆| 国产高清亚洲| 国产91欧美| 久久视频精品| 喷白浆一区二区| 日韩激情网站| 国产精品一区二区99| 久久久精品区| а√天堂8资源在线| 久久久久免费av| 欧美日韩国产亚洲一区| 视频一区视频二区中文| 日本不卡视频在线观看| 91精品福利观看| 国产成人久久精品一区二区三区| 久久只有精品| 另类专区亚洲| 亚洲激情精品| 97se亚洲| 久久精品资源| 免费成人网www| 日韩一区二区三区精品视频第3页| 日韩在线观看中文字幕| 国产精品一二| 日韩欧美另类一区二区| 好看的亚洲午夜视频在线| 午夜性色一区二区三区免费视频| 日韩一区二区三免费高清在线观看 | 亚洲精品三级| 欧美自拍一区| 亚洲三级在线| 中文字幕av一区二区三区人| 午夜电影亚洲| 午夜电影一区| 亚洲黄色免费看| 国产农村妇女精品一二区| 国产欧美日韩精品一区二区免费| 国产中文字幕一区二区三区| 欧美.日韩.国产.一区.二区| 日韩区欧美区| 中文字幕在线视频久| 亚洲欧美日韩视频二区| 欧美极品一区二区三区| 极品日韩av| 国产亚洲人成a在线v网站| 欧美亚洲国产激情| 国产日韩亚洲| 91精品国产调教在线观看 | 久久精品午夜| 亚洲少妇自拍| 麻豆国产精品| 欧美+亚洲+精品+三区| 日韩成人一级| 99精品小视频| 国产精品成人**免费视频| 黄色欧美日韩| 精品视频一区二区三区四区五区 | 国产精品腿扒开做爽爽爽挤奶网站| 欧美日韩精品免费观看视频完整| 日韩欧美激情电影| 日韩av首页| 国产日韩欧美一区二区三区| 波多野结衣一区|