Android ViewBinding使用详解
View Binding(視圖綁定)
????????視圖綁定是一項功能,可讓你更輕松地編寫與視圖交互的代碼。在模塊中啟用視圖綁定后,它會為該模塊中存在的每個 XML 布局文件生成一個 綁定類。綁定類的實例包含對在相應布局中具有 ID 的所有視圖的直接引用。
????????在大多數情況下,View Binding替換findViewById。
設置
????????視圖綁定在一個模塊一個模塊的基礎上啟用。要在模塊中啟用視圖綁定,請在Module級build.gradle文件中將viewBinding構建選項設置為true,如下例所示:
android?{...buildFeatures?{viewBinding?true} }????????如果你那個布局文件不需要生成綁定類(不想用這個功能),請將該 tools:viewBindingIgnore="true" 屬性添加到該布局文件的根視圖中:
<LinearLayout...tools:viewBindingIgnore="true"?>... </LinearLayout>使用
????????如果為Module啟用了視圖綁定,則會為Module包含的每個 XML 布局文件生成一個綁定類。每個綁定類都包含對根視圖和所有具有 ID 的視圖的引用。綁定類的名稱是通過將 XML 文件的名稱轉換為 Pascal 大小寫并在末尾添加Binding一詞來生成的。
????????例如,給定一個名為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個ProgressBar,只有3個ProgressBar設置了android:id。
????????生成的綁定類稱為ActivityProgressbarBinding。這個類有3個字段:progress_1、progress_3、progress_5。另外3個在布局具有沒有ID,所以在綁定類沒有提及。
????????每個綁定類還包含一個getRoot()方法,為相應布局文件的根視圖提供直接引用。在這個例子中,類中的getRoot()方法ActivityProgressbarBinding返回 LinearLayout根視圖。
在Activity中使用視圖綁定
????????要設置用于Activity的綁定類的實例,請在Activity的onCreate()方法中執行以下步驟 :
-
1.調用inflate()包含在生成的綁定類中的靜態方法。這會為要使用的活動創建綁定類的實例。
-
2.通過調用getRoot()方法獲取對根視圖的引用。
-
3.將根視圖傳遞給以 setContentView() 使其成為屏幕上的活動視圖。
????????實例如下:
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());//使用綁定類的實例來引用任何View(XML中必須添加id)activityProgressbarBinding.progress1.setMax(120);activityProgressbarBinding.progress3.setProgress(20);}在Fragment中使用視圖綁定
????????要設置與Fragment一起使用的綁定類的實例,請在Fragment的onCreateView()方法中執行以下步驟 :
-
1.調用inflate()包含在生成的綁定類中的靜態方法。這會為要使用的Fragment創建綁定類的實例。
-
2.通過調用getRoot()方法獲取對根視圖的引用。
-
3.從onCreateView()方法返回根視圖,使其成為屏幕上的活動視圖。
注意: 該inflate()方法要求你傳入布局充氣器。如果布局已經inflated,你可以改為調用綁定類的靜態bind()方法。
????????實例如下:
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; }提供不同配置的提示
????????當你跨多個配置聲明視圖時,有時根據特定布局使用不同的視圖類型是有意義的。例如:
#?in?res/layout/example.xml <TextView?android:id="@+id/user_bio"?/>#?in?res/layout-land/example.xml <EditText?android:id="@+id/user_bio"?/>????????在這種情況下,你可能希望生成的類公開一個userBio type字段TextView,因為TextView是公共基類。不幸的是,由于技術限制,視圖綁定代碼生成器無法做出這個決定,View而是簡單地生成一個字段。這將需要稍后使用binding.userBio as TextView.
????????為了解決這個限制,視圖綁定支持一個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"?/>????????在另一個示例中,假設你有兩個布局,其中一個包含 BottomNavigationView,另一個包含 NavigationRailView。這兩個類NavigationBarView都包含了大部分實現細節。如果你的代碼不需要確切知道當前布局中存在哪個子類,你可以使用tools:viewBindingType將生成的類型設置為NavigationBarView在兩個布局中:
#?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"?/>????????注意: 視圖綁定在生成代碼時無法驗證此屬性的值。為避免編譯時和運行時錯誤,該值必須滿足以下條件:
-
該值必須是繼承自android.view.View的類。
-
該值必須是放置它的標簽的超類。例如,以下值將不起作用:
-
最終類型必須在所有配置中一致解析。
與 findViewById 的區別
????????與使用相比,View binding具有重要的優勢findViewById:
-
空安全:由于視圖綁定創建了對視圖的直接引用,因此不存在因視圖 ID 無效而導致空指針異常的風險。此外,當視圖僅存在于布局的某些配置中時,綁定類中包含其引用的字段會標記為 @Nullable。
-
類型安全:每個綁定類中的字段的類型與其在 XML 文件中引用的視圖相匹配。這意味著沒有類轉換異常的風險。
????????這些差異意味著你的布局和代碼之間的不兼容性將導致你的構建在編譯時而不是運行時失敗。
與數據綁定的比較
????????View binding和Data Binding都生成可用于直接引用視圖的綁定類。但是,View binding旨在處理更簡單的用例,并提供以下優于Data Binding的好處:
-
更快的編譯: 視圖綁定不需要注釋處理,因此編譯時間更快。
-
易用性: 視圖綁定不需要特別標記的 XML 布局文件,因此在您的應用程序中采用它的速度更快。在模塊中啟用視圖綁定后,它會自動應用于該模塊的所有布局。
相反,與數據綁定相比,視圖綁定有以下限制:
-
視圖綁定不支持布局變量或布局表達式,因此它不能用于直接從 XML 布局文件聲明動態 UI 內容。
布局變量或布局表達式: 表達式語言允許您編寫處理由視圖調度的事件的表達式。數據綁定庫會自動生成將布局中的視圖與數據對象綁定所需的類。
-
視圖綁定不支持雙向數據綁定。
雙向數據綁定: 單向數據綁定,你可以在屬性上設置一個值并設置一個對該屬性更改做出反應的listener,雙向數據綁定提供了此過程的快捷方式。
????????由于這些考慮,在某些情況下最好在項目中同時使用View Binding和Data Binding。你可以在需要高級功能的布局中使用Data Binding,而在不需要高級功能的布局中使用View Binding。
????????注意: 在很多情況下,視圖綁定可以提供與數據綁定相同的好處,但實現更簡單,性能更好。如果主要用來替換findViewById() 調用,使用視圖綁定更佳。
????????以上就是View Binding(視圖綁定)的全部內容,希望對你有所幫助。以后有條件了咱們再學習一下了Data Binding(數據綁定)。
使用include標簽
1、include 標簽必須設置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) {}});總結
以上是生活随笔為你收集整理的Android ViewBinding使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: char知识解析
- 下一篇: TensorFlow 2.10 Unab