【JetPack】ViewBinding 视图绑定组件 ( 启用模块 | 视图绑定定制 | 绑定类名称生成规则 | 绑定类字段生成规则 | 绑定类获取根视图 | 绑定类获取布局组件 )
文章目錄
- I . 視圖綁定組件簡介
- II . 視圖綁定 ViewBinding 使用前提 ( Android Studio 3.6 )
- III . 視圖綁定組件啟用
- IV . 定制視圖綁定 ( 啟用視圖綁定后 不想生成綁定類 )
- V . 視圖綁定布局文件
- VI . 綁定類名稱生成規則
- VII . 綁定類對應的布局中的組件字段生成規則
- VIII . 視圖綁定類獲取
- IX . 設置視圖綁定后的布局
- X . 獲取視圖綁定類組件
- XI . 視圖綁定對應 Java 示例代碼
- XII . 應用運行結果
- XIII . GitHub 代碼地址
I . 視圖綁定組件簡介
Activity 獲取布局組件方式 : 在之前的 Activity 代碼中 , 使用 findViewById ( ) 方法 , 或者 Butter Knife 的 @BindView 注解方式獲取 Layout 布局中的組件對象 ;
視圖綁定 ( ViewBinding ) 是 Google 退出的新的獲取布局組件的方式 , 顧名思義 , 其作用就是將 Layout 布局中的 View 組件綁定在 Activity 等界面的 Java / Kotlin 代碼中 , 可以在代碼中獲取這些組件對象 ;
II . 視圖綁定 ViewBinding 使用前提 ( Android Studio 3.6 )
1 . Android Studio 最低版本要求 : 使用視圖綁定組件 , 需要將 Android Studio 開發環境升級到 3.6 Canary 11 及以上版本 ;
2 . 當前最新穩定版本 : 目前 2020/03/23 最新穩定版本是 3.6.1 , 建議升級到該版本 , 不推薦使用 4.0 或 4.1 BETA 版本 ;
估計大部分開發者都需要升級 Android Studio 版本到 3.6 以上 , 這里給簡單的出升級流程 , 以作參考 ; ( 大概需要 10 分鐘左右 )
3 . Android Studio 升級流程 : 盡量使用 Android Studio 自帶的升級功能 , 這樣能盡量少的降低對之前應用的影響 ;
① 選擇 Android Studio 自帶升級選項 : 選擇菜單欄 , Help -> Check for Updates … , 彈出下面的對話框 , 選擇 Update and Restart 選項 ;
② 等待下載更新 : 等待下載 , 下載完畢后會自動安裝應用 ;
③ 刪除舊版本的相關目錄 : 為了避免影響新版本 Android Studio 開發環境運行 , 刪除舊版本的相關文件 ;
④ 新版本自動啟動 :
III . 視圖綁定組件啟用
啟用視圖綁定模塊 : 在 Module 中的 build.gradle 構建腳本中的 android 下 , 配置如下內容 :
viewBinding {enabled = true }IV . 定制視圖綁定 ( 啟用視圖綁定后 不想生成綁定類 )
全部布局默認進行視圖綁定 : 只要在 build.gradle 中啟用了 視圖綁定 , 那么系統會默認為每個 XML 布局文件生成一個綁定類 ;
定制不生成綁定類的情況 : 在布局根標簽中配置 tools:viewBindingIgnore=“true” 屬性 , 即不為該布局生成綁定類 ;
V . 視圖綁定布局文件
下面的綁定類定義了三個 TextView , 前兩個定義了 id 分別是 text_view 和 text_view2 , 最后一個沒有定義 id ;
該布局作為視圖綁定的示例布局 , 下面的內容都以該布局為基礎講解 ;
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World 1!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.3" /><TextViewandroid:id="@+id/text_view2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World 2!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.5"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World 3!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.7"/></androidx.constraintlayout.widget.ConstraintLayout>VI . 綁定類名稱生成規則
視圖綁定類名稱生成規則 : 去掉布局文件名稱的下劃線 , 并以駝峰式命名 , 在名稱結尾添加 Binding 后綴 ;
以本 Activity 的布局文件 activity_main.xml 為例 , 刪除中間的下劃線 , Activity 和 Main 首字母大寫 , 在后面添加 Binding 后綴 , 生成的綁定類名稱為 ActivityMainBinding ;
VII . 綁定類對應的布局中的組件字段生成規則
1 . 綁定類組件成員名稱生成規則 : 組件中的字段也是按照駝峰式命名生成 , 首字母小節 , 中間的字母首字母大寫 , 如 id 是 text_view , 生成的成員變量名稱是 textView ;
1 . 生成的綁定類字段 : 只要在布局文件中定義了 id 屬性的組件 , 綁定類中就會為該組件生成相應的字段 ;
① 綁定類字段對應布局 ID : activity_main.xml 布局文件中 , 第一個和第二個 TextView 都定義了 id 分別是 text_view 和 text_view2 ;
② 綁定類生成的字段 : 那么系統會在 ActivityMainBinding 中生成 TextView textView 和 TextView textView2 兩個字段 ;
③ 綁定類組件字段訪問 : 通過 ActivityMainBinding 對象可以直接訪問這兩個組件 ;
2 . 不生成字段 : 第三個 TextView 沒有定義 id 屬性 , ActivityMainBinding 中不會生成該組件對應的字段 ;
VIII . 視圖綁定類獲取
activity_main.xml 布局生成的綁定類為 ActivityMainBinding , 可調用 inflate 方法 , 獲取該綁定類對象 , 需要傳遞 LayoutInflater 參數 , 可以直接調用 Activity 的 getLayoutInflater() 方法獲取 ;
/*** 視圖綁定類 對象* binding 中可以獲取布局文件中定義的* text_view 和 text_view2 兩個 TextView 組**/ private ActivityMainBinding binding;/*獲取 視圖綁定 對象生成綁定類 : 需要傳遞 LayoutInflater 參數 ,可以直接調用 Activity 的 getLayoutInflater() 方法獲取*/ binding = ActivityMainBinding.inflate(getLayoutInflater());
IX . 設置視圖綁定后的布局
1 . 獲取根視圖 : ActivityMainBinding 綁定類自帶 getRoot() 方法 , 可以直接獲取到 布局文件的 根視圖 ;
2 . 設置 Activity 視圖 : 這里可以直接將根視圖傳遞給 setContentView 函數作為參數 , 即可在該 Activity 中顯示該布局 ;
/*ActivityMainBinding 綁定類自帶 getRoot() 方法可以直接獲取到 布局文件的 根視圖這里可以直接將根視圖傳遞給 setContentView 函數作為參數 , 即可在該 Activity 中顯示該布局*/ setContentView(binding.getRoot());
X . 獲取視圖綁定類組件
可以直接通過 視圖綁定類 ActivityMainBinding 對象 binding 獲取對應的組件 , 組件名稱就是布局文件中定義的組件 id ;
//binding 中可以直接通過組件 id 獲取對應的組件 binding.textView.setText("ActivityMainBinding 1"); binding.textView2.setText("ActivityMainBinding 2");XI . 視圖綁定對應 Java 示例代碼
package kim.hsl.vb;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.widget.TextView;import kim.hsl.vb.databinding.ActivityMainBinding;/**** 視圖綁定 ( ViewBinding ) 只綁定布局文件中定義了 id 屬性的組件* 那些沒有定義 id 屬性的組件不綁定** 只要在 build.gradle 中啟用了 視圖綁定 ,* 那么系統會默認為每個 XML 布局文件生成一個綁定類 ;* ( 可以在布局中設置 tools:viewBindingIgnore="true" 不生成綁定類 )*** 視圖綁定類生成規則 : 去掉布局文件名稱的下劃線 , 并以駝峰式命名 , 在名稱結尾添加 Binding 后綴 ;* 以本 Activity 的布局文件 activity_main.xml 為例 :* 刪除中間的下劃線 , Activity 和 Main 首字母大寫 , 在后面添加 Binding 后綴* 生成的綁定類名稱為 ActivityMainBinding** 生成的綁定類字段 : 只要在布局文件中定義了 id 屬性的組件 , 綁定類中就會為該組件生成相應的字段* 如 :** 生成字段 : activity_main.xml 布局文件中 , 第一個和第二個 TextView 都定義了 id 分別是* text_view 和 text_view2 ,* 那么系統會在 ActivityMainBinding 中生成 TextView text_view 和 TextView text_view2 兩個字段* 通過 ActivityMainBinding 對象可以直接訪問這兩個組件** 不生成字段 : 第三個 TextView 沒有定義 id 屬性 , ActivityMainBinding 中不會生成該組件對應的字段*** 不生成綁定類的情況 : 在布局根標簽中配置 tools:viewBindingIgnore="true" 屬性 , 即不為該布局生成綁定類*** 視圖綁定 與 findViewById 對比 : 避免了很多問題出現 ;* 空指針優化 : 視圖綁定 針對一個布局進行自動生成字段 , 不會出現 ID 無效導致的空指針情況 ;* 類型安全優化 : 視圖綁定 的類型都是自動生成好的 , 不會出現用戶自己定義類型 , 導致組件類型轉換錯誤的情況 ;**/ public class MainActivity extends AppCompatActivity {/*** 視圖綁定類 對象* binding 中可以獲取布局文件中定義的* text_view 和 text_view2 兩個 TextView 組件**/private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/*獲取 視圖綁定 對象生成綁定類 : 需要傳遞 LayoutInflater 參數 ,可以直接調用 Activity 的 getLayoutInflater() 方法獲取*/binding = ActivityMainBinding.inflate(getLayoutInflater());/*ActivityMainBinding 綁定類自帶 getRoot() 方法可以直接獲取到 布局文件的 根視圖這里可以直接將根視圖傳遞給 setContentView 函數作為參數 , 即可在該 Activity 中顯示該布局*/setContentView(binding.getRoot());//binding 中可以直接通過組件 id 獲取對應的組件binding.textView.setText("ActivityMainBinding 1");binding.textView2.setText("ActivityMainBinding 2");} }
XII . 應用運行結果
APP 運行結果 : 可以看到通過綁定類獲取 TextView , 設置其文字 , 分別為 ActivityMainBinding 1 和 ActivityMainBinding 2 已經設置成功 , 說明視圖綁定操作完成 ;
XIII . GitHub 代碼地址
GitHub 代碼地址 : https://github.com/han1202012/001_JetPack_ViewBinding
總結
以上是生活随笔為你收集整理的【JetPack】ViewBinding 视图绑定组件 ( 启用模块 | 视图绑定定制 | 绑定类名称生成规则 | 绑定类字段生成规则 | 绑定类获取根视图 | 绑定类获取布局组件 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kotlin】Kotlin enum
- 下一篇: 【JetPack】为现有 Android