ViewBinding使用

通過(guò)視圖綁定功能臭觉,您可以更輕松地編寫(xiě)可與視圖交互的代碼。在模塊中啟用視圖綁定之后,系統(tǒng)會(huì)為該模塊中的每個(gè) XML 布局文件生成一個(gè)綁定類(lèi)内地。綁定類(lèi)的實(shí)例包含對(duì)在相應(yīng)布局中具有 ID 的所有視圖的直接引用色罚。

Tip:Viewbinding在 Android Studio 3.6 Canary 11 及更高版本中可用碰缔,現(xiàn)在應(yīng)該沒(méi)有誰(shuí)的AS版本低于3.6了吧!

用上ViewBinding步驟總共分幾步戳护?——3步金抡!

1.啟用視圖綁定:
android {
        
        viewBinding {
            enabled = true
        }
    }
2.在activity_main.xml中創(chuàng)建控件
<Button
            android:id="@+id/btnPost"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:text="提交"
            android:gravity="center" />
3.Activity 中使用視圖綁定
var binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btnPost.setOnClickListener {
            Toast.makeText(applicationContext, "點(diǎn)擊了按鈕", Toast.LENGTH_SHORT).show()
        }

源碼分析

在gradle文件中開(kāi)啟ViewBinding功能后,編譯器就會(huì)為此模塊下的每個(gè)布局文件都產(chǎn)生一個(gè)對(duì)應(yīng)的綁定類(lèi)。該demo下自動(dòng)了綁定類(lèi)ActivityMainBinding腌且,位置在:


主要代碼如下:
public final class ActivityMainBinding implements ViewBinding {
  @NonNull
  private final ConstraintLayout rootView;

  @NonNull
  public final Button btnPost;

  private ActivityMainBinding(@NonNull ConstraintLayout rootView, @NonNull Button btnPost,
      @NonNull EditText etAge, @NonNull EditText etHeight, @NonNull TextView tvAge,
      @NonNull TextView tvHight) {
    this.rootView = rootView;
    this.btnPost = btnPost;
  }

  @Override
  @NonNull
  public ConstraintLayout getRoot() {
    return rootView;
  }

  @NonNull
  public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater) {
    return inflate(inflater, null, false);
  }

  @NonNull
  public static ActivityMainBinding 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.btnPost;
      Button btnPost = rootView.findViewById(id);
      if (btnPost == null) {
        break missingId;
      }

      return new ActivityMainBinding((ConstraintLayout) rootView, btnPost, etAge, etHeight, tvAge,
          tvHight);
    }
    String missingId = rootView.getResources().getResourceName(id);
    throw new NullPointerException("Missing required view with ID: ".concat(missingId));
  }

會(huì)去實(shí)現(xiàn)ViewBinding接口竟终,實(shí)現(xiàn)getRoot()方法,返回的是布局最外層父View切蟋,通過(guò)Activity的 setContentView()方法可以為Activity設(shè)置內(nèi)容统捶。只要有id的控件會(huì)為其生成一個(gè)變量,其內(nèi)部找尋控件實(shí)質(zhì)還是用的findViewbyId,已經(jīng)幫我們自動(dòng)做了喘鸟。

與 findViewById 的區(qū)別

與使用 findViewById 相比匆绣,視圖綁定具有一些很顯著的優(yōu)點(diǎn):

Null 安全:由于視圖綁定會(huì)創(chuàng)建對(duì)視圖的直接引用,因此不存在因視圖 ID 無(wú)效而引發(fā) Null 指針異常的風(fēng)險(xiǎn)什黑。此外崎淳,如果視圖僅出現(xiàn)在布局的某些配置中,則綁定類(lèi)中包含其引用的字段會(huì)使用 @Nullable 標(biāo)記愕把。

類(lèi)型安全:每個(gè)綁定類(lèi)中的字段均具有與它們?cè)?XML 文件中引用的視圖相匹配的類(lèi)型拣凹。這意味著不存在發(fā)生類(lèi)轉(zhuǎn)換異常的風(fēng)險(xiǎn)。

為某個(gè)模塊啟用視圖綁定功能后恨豁,系統(tǒng)會(huì)為該模塊中包含的每個(gè) XML 布局文件生成一個(gè)綁定類(lèi)嚣镜。每個(gè)綁定類(lèi)均包含對(duì)根視圖以及具有 ID 的所有視圖的引用。系統(tǒng)會(huì)通過(guò)以下方式生成綁定類(lèi)的名稱(chēng):將 XML 文件的名稱(chēng)轉(zhuǎn)換為駝峰式大小寫(xiě)橘蜜,并在末尾添加“Binding”一詞菊匿。

與Butterknife區(qū)別
butterknife的主要原理:
  1. 首先會(huì)掃描java代碼中所有通過(guò)ButterKnife設(shè)置的注解比如@Bind,@OnClick等计福。
  2. 當(dāng)發(fā)現(xiàn)一個(gè)類(lèi)中含有任何一個(gè)注解時(shí)跌捆,遍歷每個(gè)注解對(duì)應(yīng)通過(guò)JavaPoet生成一個(gè)java類(lèi),這個(gè)類(lèi)實(shí)現(xiàn)了ViewBinder接口象颖。
  3. 這個(gè)ViewBinder類(lèi)中包含了所有對(duì)應(yīng)的代碼佩厚,比如@Bind注解對(duì)應(yīng)的findViewByid(),@OnClick對(duì)應(yīng)的setOnClickListener等等说订。
    ButterKnife 整個(gè)過(guò)程是在項(xiàng)目編譯階段完成的抄瓦,編譯耗時(shí)但是運(yùn)行不耗時(shí)。ViewBinding比ButterKnife編譯更安全克蚂,編譯速度更快闺鲸,所以可以說(shuō)是Butterknife的終結(jié)者了。
與DataBinding的區(qū)別

視圖綁定和數(shù)據(jù)綁定均會(huì)生成可用于直接引用視圖的綁定類(lèi)埃叭。但是摸恍,視圖綁定旨在處理更簡(jiǎn)單的用例,與數(shù)據(jù)綁定相比赤屋,具有以下優(yōu)勢(shì):

  • 更快的編譯速度:視圖綁定不需要處理注釋?zhuān)虼司幾g時(shí)間更短立镶。
  • 易于使用:視圖綁定不需要特別標(biāo)記的 XML 布局文件,因此在應(yīng)用中采用速度更快类早。在模塊中啟用視圖綁定后媚媒,它會(huì)自動(dòng)應(yīng)用于該模塊的所有布局。

反過(guò)來(lái)涩僻,與數(shù)據(jù)綁定相比缭召,視圖綁定也具有以下限制:

  • 視圖綁定不支持布局變量或布局表達(dá)式栈顷,因此不能用于直接在 XML 布局文件中聲明動(dòng)態(tài)界面內(nèi)容。
  • 視圖綁定不支持雙向數(shù)據(jù)綁定嵌巷。

考慮到這些因素萄凤,在某些情況下,最好在項(xiàng)目中同時(shí)使用視圖綁定和數(shù)據(jù)綁定搪哪。您可以在需要高級(jí)功能的布局中使用數(shù)據(jù)綁定靡努,而在不需要高級(jí)功能的布局中使用視圖綁定。

kotlin-android-extensions插件

kotlin-android-extensions插件會(huì)在Activity晓折,frragment等組件中自動(dòng)生成各個(gè)方法去做findViewById惑朦,并將各View添加到HashMap緩存中供使用。

所以漓概,工具這么多漾月,在你的項(xiàng)目中使用哪個(gè),It's up to you.

參考:

https://developer.android.google.cn/topic/libraries/view-binding

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垛耳,一起剝皮案震驚了整個(gè)濱河市栅屏,隨后出現(xiàn)的幾起案子飘千,更是在濱河造成了極大的恐慌堂鲜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件护奈,死亡現(xiàn)場(chǎng)離奇詭異缔莲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)霉旗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)痴奏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人厌秒,你說(shuō)我怎么就攤上這事读拆。” “怎么了鸵闪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵檐晕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蚌讼,道長(zhǎng)辟灰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任篡石,我火速辦了婚禮芥喇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凰萨。我一直安慰自己继控,他們只是感情好械馆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著武通,像睡著了一般狱杰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厅须,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天仿畸,我揣著相機(jī)與錄音,去河邊找鬼朗和。 笑死错沽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眶拉。 我是一名探鬼主播千埃,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼忆植!你這毒婦竟也來(lái)了放可?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朝刊,失蹤者是張志新(化名)和其女友劉穎耀里,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拾氓,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冯挎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咙鞍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片房官。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖续滋,靈堂內(nèi)的尸體忽然破棺而出翰守,到底是詐尸還是另有隱情,我是刑警寧澤疲酌,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布蜡峰,位于F島的核電站,受9級(jí)特大地震影響徐勃,放射性物質(zhì)發(fā)生泄漏事示。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一僻肖、第九天 我趴在偏房一處隱蔽的房頂上張望肖爵。 院中可真熱鬧,春花似錦臀脏、人聲如沸劝堪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秒啦。三九已至熬粗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間余境,已是汗流浹背驻呐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芳来,地道東北人含末。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像即舌,于是被迫代替她去往敵國(guó)和親佣盒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容