【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )
文章目錄
- I . 為現有項目配置 視圖綁定 ( ViewBinding ) 應用
- II . 視圖綁定 ( ViewBinding ) 定制
- III . 視圖綁定 ( ViewBinding ) 對于正常操作的影響測試
- IV . 視圖綁定 ( ViewBinding ) 關聯 Activity 界面
- V . 視圖綁定 ( ViewBinding ) 本質分析
- VI . GitHub 代碼地址
I . 為現有項目配置 視圖綁定 ( ViewBinding ) 應用
1 . 視圖綁定模塊默認為全部布局生成綁定類 ; 視圖綁定 ( ViewBinding ) 模塊一旦啟用 , 應用的全部布局都會默認自動生成一個視圖綁定類 , 如果生成了視圖綁定模塊 , 是否對于已經使用的 findViewById 或者 @BindView @BindViews 代碼是否有影響 ;
2 . Android 項目中布局文件數量比較大 ; 現在的 Android 項目如果比較大 , 布局文件可能存在上百個 , Activity , Fragment , 自定義布局的 Dialog , 自定義 View 組件 , RecyclerView 列表條目 item 布局 , 這些都要使用到布局文件 ;
3 . 如果為該 Android 項目啟用了視圖綁定模塊 , 所有的布局都會生成對應的視圖綁定類 ;
4 . 因此這里需要討論如下問題 : 如果在 build.gradle 中啟用了視圖綁定模塊 , 對已經開發好的代碼是否有影響 , 本博客會進行詳細的測試 ;
5 . 先說下結論 : 視圖綁定 只是為我們額外生成了一種新的操作布局和組件的方式 , 不會對之前已經寫好的代碼產生影響 ;
II . 視圖綁定 ( ViewBinding ) 定制
1 . Android 官方文檔中給出的定制方案 : 如果當前有幾百個布局文件 , 為了不影響之前的代碼 , 可以在每個布局的根視圖上配置 tools:viewBindingIgnore=“true” 屬性 ; ( 工作量較大 )
2 . 不影響之前的代碼 : 此時可以不進行上面的操作 , 雖然啟用了視圖綁定模塊 , 系統為我們生成了視圖綁定類 , 這個類我們可以選擇使用 , 也可以選擇不用 , 也可以繼續使用 setContentView(R.layout.activity_main) 設置布局文件 , 使用 findViewById(R.id.text_view) 獲取組件 ; 可以不使用系統給生成的綁定類 XxxXxxBinding ;
III . 視圖綁定 ( ViewBinding ) 對于正常操作的影響測試
1 . 先說下結論 : 視圖綁定 只是為我們額外生成了一種新的操作布局和組件的方式 , 不會對之前已經寫好的代碼產生影響 ;
2 . 在啟用了 ViewBinding 模塊后 , 布局中如果沒有屏蔽視圖綁定 , 那么會為該布局生成布局綁定類 , 此時如果進行正常的操作 , 仍然不影響 , 可以不用修改之前的代碼 ;
3 . 在 build,gradle 中配置了視圖綁定 : 主要是 viewBinding 配置 , 其它都是多余的 ;
apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.2"defaultConfig {applicationId "kim.hsl.vb"minSdkVersion 16targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}viewBinding {//啟用視圖綁定模塊enabled = true}}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }4 . activity_main.xml 布局文件代碼 : 沒有設置屏蔽 視圖綁定 模塊 , 即系統會為該布局自動生成一個視圖綁定類 ;
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns: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!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>5 . Activity 界面的 Java 代碼 : 仍然使用傳統的布局操作方式 , 使用 setContentView(R.layout.activity_main) 設置布局文件 , 使用 findViewById(R.id.text_view) 獲取組件 ;
package kim.hsl.vb;import androidx.appcompat.app.AppCompatActivity;import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; import android.widget.TextView;import kim.hsl.vb.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity {/*** 從布局中獲取 TextView 組件*/private TextView text_view;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// I . 傳統使用方式//設置布局文件setContentView(R.layout.activity_main);//獲取布局文件中的 id 為 text_view 的 TextView 組件text_view = findViewById(R.id.text_view);text_view.setText("啟用視圖綁定的情況下使用傳統布局操作方法");// II . 視圖綁定類分析// 下面的視圖綁定類操作是無效的//獲取視圖綁定類 , 但是此視圖綁定類沒有關聯該界面// 關聯的方式是 setContentView 中設置該綁定類的根視圖才可以ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());//由于視圖綁定類中的視圖并未與該 Activity 界面關聯// 因此單純的操作該視圖綁定類不能修改本界面的 TextView 顯示文字binding.textView.setText("ActivityMainBinding");} }6 . 執行結果 :
IV . 視圖綁定 ( ViewBinding ) 關聯 Activity 界面
1 . 兩種獲取組件方式 : 上面的示例代碼中 , 分別使用 findViewById(R.id.text_view) 獲取的組件 和 ActivityMainBinding 獲取組件 ; 但是使用 ActivityMainBinding 獲取組件無法修改界面 ;
2 . ActivityMainBinding 獲取的組件無法控制界面 , 這是因為該 ActivityMainBinding 視圖綁定類 , 并沒有與 Activity 關聯 ;
3 . 界面布局分析 : 設置界面布局的代碼是 setContentView(R.layout.activity_main) , 此處將 activity_main.xml 布局設置給了 Activity 顯示 , 該布局的視圖組件與 ActivityMainBinding 沒有任何關聯 , Activity 顯示的組件也不是 ActivityMainBinding 綁定類中的組件 , 因此操作視圖綁定類中的組件不能修改 Activity 界面的顯示 ;
4 . 如果要顯示需要將 ActivityMainBinding 根視圖設置給 Activity 顯示 , 進行如下操作 ;
/*獲取 視圖綁定 對象生成綁定類 : 需要傳遞 LayoutInflater 參數 ,可以直接調用 Activity 的 getLayoutInflater() 方法獲取*/ ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater()); /*ActivityMainBinding 綁定類自帶 getRoot() 方法可以直接獲取到 布局文件的 根視圖這里可以直接將根視圖傳遞給 setContentView 函數作為參數 , 即可在該 Activity 中顯示該布局*/ setContentView(binding.getRoot());5 . 關聯界面操作 : setContentView(binding.getRoot()) 操作就是將視圖綁定類與 Activity 界面關聯了起來 , 此時操作視圖綁定類就可以修改界面內容了 ;
V . 視圖綁定 ( ViewBinding ) 本質分析
視圖綁定 ( ViewBinding ) 其本質就是提供了一種加載布局文件的便捷方式 , 與下面的操作本質是類似的 , 只是可以省略很多代碼 ;
① 布局加載操作 :
//加載布局文件 View view = LayoutInflater.from(context).inflate(R.layout.activity_main, parent, false);//查找布局文件中的組件 TextView textView = view.findViewById(R.id.text_view);② 視圖綁定操作 :
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater()); TextView textView = binding.textView;VI . GitHub 代碼地址
GitHub 代碼地址 : https://github.com/han1202012/002_JetPack_ViewBinding_Apply
總結
以上是生活随笔為你收集整理的【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【JetPack】ViewBinding
- 下一篇: 【JetPack】视图绑定 ( View