日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )

發布時間:2025/6/17 Android 33 豆豆

文章目錄

        • 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 | 视图绑定类本质 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。