Android ViewBinding使用详解
View Binding(視圖綁定)
????????視圖綁定是一項(xiàng)功能,可讓你更輕松地編寫與視圖交互的代碼。在模塊中啟用視圖綁定后,它會(huì)為該模塊中存在的每個(gè) XML 布局文件生成一個(gè) 綁定類。綁定類的實(shí)例包含對(duì)在相應(yīng)布局中具有 ID 的所有視圖的直接引用。
????????在大多數(shù)情況下,View Binding替換findViewById。
設(shè)置
????????視圖綁定在一個(gè)模塊一個(gè)模塊的基礎(chǔ)上啟用。要在模塊中啟用視圖綁定,請(qǐng)?jiān)?strong>Module級(jí)build.gradle文件中將viewBinding構(gòu)建選項(xiàng)設(shè)置為true,如下例所示:
android?{...buildFeatures?{viewBinding?true} }????????如果你那個(gè)布局文件不需要生成綁定類(不想用這個(gè)功能),請(qǐng)將該 tools:viewBindingIgnore="true" 屬性添加到該布局文件的根視圖中:
<LinearLayout...tools:viewBindingIgnore="true"?>... </LinearLayout>使用
????????如果為Module啟用了視圖綁定,則會(huì)為Module包含的每個(gè) XML 布局文件生成一個(gè)綁定類。每個(gè)綁定類都包含對(duì)根視圖和所有具有 ID 的視圖的引用。綁定類的名稱是通過(guò)將 XML 文件的名稱轉(zhuǎn)換為 Pascal 大小寫并在末尾添加Binding一詞來(lái)生成的。
????????例如,給定一個(gè)名為activity_progressbar.xml的布局文件:
<LinearLayout> ...<ProgressBarandroid:id="@+id/progress_1"/><ProgressBarstyle="@android:style/Widget.ProgressBar.Small"?/><ProgressBarandroid:id="@+id/progress_3"/><ProgressBarstyle="@android:style/Widget.ProgressBar.Inverse"?/><ProgressBarandroid:id="@+id/progress_5"/><ProgressBarstyle="@android:style/Widget.ProgressBar.Large.Inverse"?/> ... </LinearLayout>????????布局文件中有6個(gè)ProgressBar,只有3個(gè)ProgressBar設(shè)置了android:id。
????????生成的綁定類稱為ActivityProgressbarBinding。這個(gè)類有3個(gè)字段:progress_1、progress_3、progress_5。另外3個(gè)在布局具有沒有ID,所以在綁定類沒有提及。
????????每個(gè)綁定類還包含一個(gè)getRoot()方法,為相應(yīng)布局文件的根視圖提供直接引用。在這個(gè)例子中,類中的getRoot()方法ActivityProgressbarBinding返回 LinearLayout根視圖。
在Activity中使用視圖綁定
????????要設(shè)置用于Activity的綁定類的實(shí)例,請(qǐng)?jiān)贏ctivity的onCreate()方法中執(zhí)行以下步驟 :
-
1.調(diào)用inflate()包含在生成的綁定類中的靜態(tài)方法。這會(huì)為要使用的活動(dòng)創(chuàng)建綁定類的實(shí)例。
-
2.通過(guò)調(diào)用getRoot()方法獲取對(duì)根視圖的引用。
-
3.將根視圖傳遞給以 setContentView() 使其成為屏幕上的活動(dòng)視圖。
????????實(shí)例如下:
private?ActivityProgressbarBinding?activityProgressbarBinding;@Overrideprotected?void?onCreate(@Nullable?Bundle?savedInstanceState)?{super.onCreate(savedInstanceState);activityProgressbarBinding?=?ActivityProgressbarBinding.inflate(getLayoutInflater()); //????????View?view?=?activityProgressbarBinding.getRoot(); //????????setContentView(view);//一步到位也可以setContentView(activityProgressbarBinding.getRoot());//使用綁定類的實(shí)例來(lái)引用任何View(XML中必須添加id)activityProgressbarBinding.progress1.setMax(120);activityProgressbarBinding.progress3.setProgress(20);}在Fragment中使用視圖綁定
????????要設(shè)置與Fragment一起使用的綁定類的實(shí)例,請(qǐng)?jiān)贔ragment的onCreateView()方法中執(zhí)行以下步驟 :
-
1.調(diào)用inflate()包含在生成的綁定類中的靜態(tài)方法。這會(huì)為要使用的Fragment創(chuàng)建綁定類的實(shí)例。
-
2.通過(guò)調(diào)用getRoot()方法獲取對(duì)根視圖的引用。
-
3.從onCreateView()方法返回根視圖,使其成為屏幕上的活動(dòng)視圖。
注意: 該inflate()方法要求你傳入布局充氣器。如果布局已經(jīng)inflated,你可以改為調(diào)用綁定類的靜態(tài)bind()方法。
????????實(shí)例如下:
private?FragmentMineBinding?binding; @Override public?View?onCreateView(LayoutInflater?inflater,?ViewGroup?container,?Bundle?savedInstanceState)?{binding?=?FragmentMineBinding.inflate(inflater,container,false);View?view?=?binding.getRoot();return?view; }@Override public?void?onDestroy()?{super.onDestroy();binding?=?null; }提供不同配置的提示
????????當(dāng)你跨多個(gè)配置聲明視圖時(shí),有時(shí)根據(jù)特定布局使用不同的視圖類型是有意義的。例如:
#?in?res/layout/example.xml <TextView?android:id="@+id/user_bio"?/>#?in?res/layout-land/example.xml <EditText?android:id="@+id/user_bio"?/>????????在這種情況下,你可能希望生成的類公開一個(gè)userBio type字段TextView,因?yàn)門extView是公共基類。不幸的是,由于技術(shù)限制,視圖綁定代碼生成器無(wú)法做出這個(gè)決定,View而是簡(jiǎn)單地生成一個(gè)字段。這將需要稍后使用binding.userBio as TextView.
????????為了解決這個(gè)限制,視圖綁定支持一個(gè)tools:viewBindingType 屬性,允許你告訴編譯器在生成的代碼中使用什么類型。在上面的示例中,你可以使用此屬性使編譯器將字段生成為TextView:
#?in?res/layout/example.xml?(unchanged) <TextView?android:id="@+id/user_bio"?/>#?in?res/layout-land/example.xml <EditText?android:id="@+id/user_bio"?tools:viewBindingType="TextView"?/>????????在另一個(gè)示例中,假設(shè)你有兩個(gè)布局,其中一個(gè)包含 BottomNavigationView,另一個(gè)包含 NavigationRailView。這兩個(gè)類NavigationBarView都包含了大部分實(shí)現(xiàn)細(xì)節(jié)。如果你的代碼不需要確切知道當(dāng)前布局中存在哪個(gè)子類,你可以使用tools:viewBindingType將生成的類型設(shè)置為NavigationBarView在兩個(gè)布局中:
#?in?res/layout/navigation_example.xml <BottomNavigationView?android:id="@+id/navigation"?tools:viewBindingType="NavigationBarView"?/>#?in?res/layout-w720/navigation_example.xml <NavigationRailView?android:id="@+id/navigation"?tools:viewBindingType="NavigationBarView"?/>????????注意: 視圖綁定在生成代碼時(shí)無(wú)法驗(yàn)證此屬性的值。為避免編譯時(shí)和運(yùn)行時(shí)錯(cuò)誤,該值必須滿足以下條件:
-
該值必須是繼承自android.view.View的類。
-
該值必須是放置它的標(biāo)簽的超類。例如,以下值將不起作用:
-
最終類型必須在所有配置中一致解析。
與 findViewById 的區(qū)別
????????與使用相比,View binding具有重要的優(yōu)勢(shì)findViewById:
-
空安全:由于視圖綁定創(chuàng)建了對(duì)視圖的直接引用,因此不存在因視圖 ID 無(wú)效而導(dǎo)致空指針異常的風(fēng)險(xiǎn)。此外,當(dāng)視圖僅存在于布局的某些配置中時(shí),綁定類中包含其引用的字段會(huì)標(biāo)記為 @Nullable。
-
類型安全:每個(gè)綁定類中的字段的類型與其在 XML 文件中引用的視圖相匹配。這意味著沒有類轉(zhuǎn)換異常的風(fēng)險(xiǎn)。
????????這些差異意味著你的布局和代碼之間的不兼容性將導(dǎo)致你的構(gòu)建在編譯時(shí)而不是運(yùn)行時(shí)失敗。
與數(shù)據(jù)綁定的比較
????????View binding和Data Binding都生成可用于直接引用視圖的綁定類。但是,View binding旨在處理更簡(jiǎn)單的用例,并提供以下優(yōu)于Data Binding的好處:
-
更快的編譯: 視圖綁定不需要注釋處理,因此編譯時(shí)間更快。
-
易用性: 視圖綁定不需要特別標(biāo)記的 XML 布局文件,因此在您的應(yīng)用程序中采用它的速度更快。在模塊中啟用視圖綁定后,它會(huì)自動(dòng)應(yīng)用于該模塊的所有布局。
相反,與數(shù)據(jù)綁定相比,視圖綁定有以下限制:
-
視圖綁定不支持布局變量或布局表達(dá)式,因此它不能用于直接從 XML 布局文件聲明動(dòng)態(tài) UI 內(nèi)容。
布局變量或布局表達(dá)式: 表達(dá)式語(yǔ)言允許您編寫處理由視圖調(diào)度的事件的表達(dá)式。數(shù)據(jù)綁定庫(kù)會(huì)自動(dòng)生成將布局中的視圖與數(shù)據(jù)對(duì)象綁定所需的類。
-
視圖綁定不支持雙向數(shù)據(jù)綁定。
雙向數(shù)據(jù)綁定: 單向數(shù)據(jù)綁定,你可以在屬性上設(shè)置一個(gè)值并設(shè)置一個(gè)對(duì)該屬性更改做出反應(yīng)的listener,雙向數(shù)據(jù)綁定提供了此過(guò)程的快捷方式。
????????由于這些考慮,在某些情況下最好在項(xiàng)目中同時(shí)使用View Binding和Data Binding。你可以在需要高級(jí)功能的布局中使用Data Binding,而在不需要高級(jí)功能的布局中使用View Binding。
????????注意: 在很多情況下,視圖綁定可以提供與數(shù)據(jù)綁定相同的好處,但實(shí)現(xiàn)更簡(jiǎn)單,性能更好。如果主要用來(lái)替換findViewById() 調(diào)用,使用視圖綁定更佳。
????????以上就是View Binding(視圖綁定)的全部?jī)?nèi)容,希望對(duì)你有所幫助。以后有條件了咱們?cè)賹W(xué)習(xí)一下了Data Binding(數(shù)據(jù)綁定)。
使用include標(biāo)簽
1、include 標(biāo)簽必須設(shè)置id(mcv_login)
<includeandroid:id="@+id/mcv_login"layout="@layout/include_login"/>2、代碼中使用(mcvLogin)
mvcBinding.mcvLogin.tvTitle.setText("MVC");mvcBinding.mcvLogin.btnLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {}});總結(jié)
以上是生活随笔為你收集整理的Android ViewBinding使用详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: char知识解析
- 下一篇: TensorFlow 2.10 Unab